2017-01-20 1 views
0

Ich habe etwas seltsames passiert, während ich versuche, eine Kachel zu teilen, um zu JPanel zu zeichnen. Zuerst ist das das zugehörige Stück Code:Splitting Tilemap Bild in Schaukel

private void drawTile(Graphics g,MapController mc,int gid){ 
    int cols = mc.getMap().getTileset().getColumns(); 
    int x = (gid % cols); 

    int y = gid/cols; 
    int tilewidth = mc.getTilewidth(); 
    int tileheight = mc.getTileheight(); 
    int dx1 = 0; 
    int dx2 = dx1+tilewidth; 
    int dy1 = 0; 
    int dy2 = dy1+tileheight; 
    int sx1 = (x)*tilewidth; 
    int sx2 = sx1+tilewidth; 
    int sy1 = y*tileheight; 
    int sy2 = sy1+tileheight; 
    g.drawImage(mc.getSpriteImage(), dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, null); 

} 

Diese innerhalb einer Schleife ist, die auf einer Karte durch die Schichten iteriert und jede Kachel an eine Platte zeichnet. Wenn ich mein Programm ausführe, funktioniert es größtenteils korrekt, aber ich erkannte, dass x-Achse um 1 "Kachelbreite" (32px) deaktiviert war. dies wird die Ausgabe erhalte ich:

Dies ist mehr oder weniger, wie es andere aussehen sollte, als die Fliesen alle auf der x-Achse 32px ausgeschaltet werden

Expectation

Ich bin ziemlich sicher, das liegt daran, Ich konvertiere die CSV in einen int [] und der Index beginnt bei 0, aber mein Raster beginnt bei 1. Einfache Lösung, oder? Ziehen Sie einfach 1 von meinem x-Wert ab, um die sx1 meines Quellbilds 32px nach links zu verschieben.

Überarbeitete Code:

private void drawTile(Graphics g,MapController mc,int gid){ 
    int cols = mc.getMap().getTileset().getColumns(); 

    int x = (gid % cols)-1; //notice the -1 

    int y = gid/cols; 
    int tilewidth = mc.getTilewidth(); 
    int tileheight = mc.getTileheight(); 
    int dx1 = 0; 
    int dx2 = dx1+tilewidth; 
    int dy1 = 0; 
    int dy2 = dy1+tileheight; 
    int sx1 = x*tilewidth; 
    int sx2 = sx1+tilewidth; 
    int sy1 = y*tileheight; 
    int sy2 = sy1+tileheight; 
    g.drawImage(mc.getSpriteImage(), dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, null); 

} 

Nun, wenn ich es laufen bekomme ich diese:

Screwed up

ich in einigen Problem Linien setzen und es sieht aus wie die Koordinaten ich für die bin das Senden Quellbild sind korrekt. Ich habe sogar versucht:

g.drawImage(mc.getSpriteImage(), dx1, dy1, dx2, dy2, sx1-32, sy1, sx2, sy2,  null); 

Alles, was ich versucht habe, gibt mir die gleichen Ergebnisse. Gibt es hier etwas, das ich vermisse?

+0

* "Nur 1 von meinem x-Wert subtrahieren" * - Warum nicht '1' von' gid'? – MadProgrammer

+0

Das Ändern des GID würde auch die Y-Achse beeinflussen. Es ist nur die X-Achse ausgeschaltet. Die Gids stimmen mit dem in der CSV-Datei überein. (Ich habe das schon mal probiert) – kookej

+0

Vielleicht zeichnest du Sachen übereinander und dann sind einige Dinge nicht mehr sichtbar. – Trilarion

Antwort

0

Gelöst es! Einige der GIDs in der CSV sind 0 bis für eine transparente Kachel. Wenn Sie die Berechnung für den Standort sx1 durchführen und dann 1 subtrahieren, erhalten Sie -1 als sx1. Anscheinend mag awt Graphics das nicht so, anstatt eine transparente Kachel zu rendern, wird nichts gerendert. Das ist, wenn Dinge anfangen, wonkey. Interessanterweise startete ich dieses Projekt mit JavaFX, entschied mich aber stattdessen für Swing. Ich benutzte die gleiche Logik zum Zeichnen von FX und hatte dieses Problem nicht. Hier ist der Code, der funktioniert:

private void drawTile(Graphics g,MapController mc,int gid){ 
    int cols = mc.getMap().getTileset().getColumns(); 

    int x = (gid % cols)-1; 
    if(x<0){x=0}; 
    int y = gid/cols; 
    int tilewidth = mc.getTilewidth(); 
    int tileheight = mc.getTileheight(); 
    int dx1 = 0; 
    int dx2 = dx1+tilewidth; 
    int dy1 = 0; 
    int dy2 = dy1+tileheight; 
    int sx1 = x*tilewidth; 
    int sx2 = sx1+tilewidth; 
    int sy1 = y*tileheight; 
    int sy2 = sy1+tileheight; 
    g.drawImage(mc.getSpriteImage(), dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2,  null); 

}