2009-08-19 2 views
0

Ich schreibe ein isometrisches Spiel, aber leider habe ich stecken schreiben mit dem Algorithmus verwendet, um zurück zu Weltkoordinaten von Bildschirmkoordinaten (oder möglicherweise umgekehrt versa). Jedenfalls kann ich die Implementierungen, die das Gegenteil meiner GetScreenX/Y-Methoden sind, nicht herausfinden. Hier ist ein Code. width und height stellen die Breite/Höhe des Ansichtsfensterbereichs in Kacheln dar.kann nicht herausfinden, umgekehrt von Get World Coords Funktion für isometrische Spiel

Mit der richtigen Implementierung sollte diese ohne Probleme durchlaufen. Sie können es in Linqpad ausführen.

void Main() 
{ 
    for(int width = 1;width<15;width++) 
    { 
     for(int height = 1;height<10;height++) 
     { 
      for(int x = -50;x<50;x++){   
       for(int y = -50;y<50;y++){ 
        var screenX = GetScreenX(x, y, width, height); 
        var screenY = GetScreenY(x, y, width, height); 
        var worldX = GetWorldX(screenX, screenY, width, height); 
        var worldY = GetWorldY(screenX, screenY, width, height); 
        if (worldX != x || worldY != y) 
        { 
         throw new Exception("Algorithm not right!");  
        } 
       } 
      } 
     } 
    } 
} 

protected int GetScreenX(int x, int y, int width, int height) 
{ 
    return WrappingMod(x + y, width); 
} 

protected int GetWorldX(int x, int y, int width, int height) 
{ 
    return 1; //needs correct implementation 
} 

protected int GetWorldY(int x, int y, int width, int height) 
{ 
    return 1; //needs correct implementation 
} 

protected int GetScreenY(int x, int y, int width, int height) 
{ 
    return WrappingMod((int) ((y - x)/2.0), height); 
} 

static int WrappingMod(int x, int m) 
{ 
    return (x % m + m) % m; 
} 

Entschuldigung, um zu fragen, aber ich bin bei meinem Verstand Ende!

Antwort

0

Ich verstehe Ihre WrappingMod-Funktion nicht. Sie scheinen die Bildschirmkoordinate zu berechnen und nehmen dann die Modulo-Ansichtsfenster-Dimension (zweimal) nur für die Hölle davon. Das macht Ihr Welt-> Screen Mapping nicht bijektiv, also hat es keine Inverse.

Warum zeichnen Sie zunächst mehrere Kacheln übereinander?

Anstatt den Modulus zu verwenden, sollten Sie eine Ausnahme auslösen wollen, wenn die Weltkoordinate nicht in das Ansichtsfenster passt.

+0

Hmm. Es ist ein bisschen verrückt, ich gebe zu. Was ich mache, ist eine Client Server App zu machen. Der Client sendet die Viewport-Grenzen an den Server, der Server versucht dann herauszufinden, welche Kacheln für den Client sichtbar sind (mit den Methoden, die implementiert werden müssen), und sendet die Daten für diese Kacheln zurück an den Client. Der Client verwendet dann die GetScreen-Methoden, um die Kacheln auf dem Bildschirm zu positionieren. –

+0

Der Grund dafür ist, dass sie den Wrapping-Mod wieder auf dem Bildschirm erscheinen lassen, , also wenn y = 0 und width = 8, werden alle x Positionen -12, -4, 4, 8, 12 usw. auf Position gesetzt 4 –

+0

Hmm, vielleicht hast du recht. Die Frage ist durcheinander –

0

Sie benötigen zwei Matrizen: eine für die Konvertierung von der Ansicht in Weltkoordinaten und ihre Umkehrung für die umgekehrte Konvertierung.

// my matrices are in 4x4 column-major format 

// projection matrix (world -> view) 
this.viewTransform.identity() 
    .translate(this.viewOrigin) 
.scale(1, 0.5, 1) 
.rotate(this.viewRotation, 2); // 2 = Z axis 

var m = this.viewTransform.current().m; 
this.context.setTransform(m[0], m[1], m[4], m[5], m[12], m[13]); 

// construct inverse projection matrix (view -> world) 
this.viewTransformInv.identity() 
    .rotate(-this.viewRotation, 2) 
    .scale(1, 2, 0) 
    .translate(new Vect4(-this.viewOrigin.x, -this.viewOrigin.y)); 

// calculate world and map coordinates under mouse 
this.viewTransformInv.project(this.mousePos, this.worldPos); 

// convert coordinates from view (x, y) to world (x, y, z) 
this.worldPos.z = this.worldPos.y; 
this.worldPos.y = 0; 
this.mapPos[0] = Math.floor(this.worldPos.x/this.TileSideLength); 
this.mapPos[1] = Math.floor(this.worldPos.z/this.TileSideLength); 
Verwandte Themen