2017-01-20 2 views
0

JPanelに描画するためにタイルマップを分割しようとしているときに、私はいくつか奇妙なことが起こっています。スイングでタイルマップイメージを分割する

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); 

} 

これは、地図上の層を介して繰り返し処理を行い、パネルに各タイルを描画ループ内にある:最初にこのコードの関連部分です。私のプログラムを実行すると、ほとんどの部分が正しく動作しますが、x軸が1 "タイル幅"(32px)だけずれていることがわかりました。これは私が手に出力されます。これは、タイルは、すべてのx軸

Expectation

に、多かれ少なかれ、それは他のどのようなものかオフ32PXされているよりも

私はこれがあるためであるかなり確信しています私はCSVをint []に変換しています。インデックスは0から始まりますが、グリッドは1から始まります。簡単に修正できますか?私のx値から1を引いて、私のソース画像のsx1を左に32ピクセル動かします。

改訂コード:私はそれを実行したときに

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); 

} 

今、私はこれを取得:

Screwed up

は、私はいくつかのトラブルシューティングラインに入れて、それは私が送信してるの座標のように見えますソースイメージが正しい。私も試した:

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

私が試したことはすべて私に同じ結果を与えている。 私は行方不明のものがありますか?

+0

*「x値から1を減算する」* - 「gid」から「1」を除外する理由はありますか? – MadProgrammer

+0

gidを変更するとY軸にも影響します。オフになっているのはX軸だけです。 gidsはCSVファイルの内容と一致します。 (私はそれを試してみた) – kookej

+0

たぶんあなたは別のものの上に物を描くかもしれないし、いくつかのものはもう見えない。 – Trilarion

答えて

0

解決済み! CSV内の一部のGIDは、透明なタイルでは0〜です。 sx1の位置を計算して1を引くと、sx1として-1が返されます。明らかにawt Graphicsはそれを好まないので、透明なタイルをレンダリングする代わりに、何もレンダリングしません。物事が勝つのが始まるときそれはそうです。興味深いことに、私はJavaFXを使用してこのプロジェクトを開始しましたが、代わりにスイングを行うことに決めました。私はFXで描くのに同じロジックを使いましたが、この問題はありませんでした。

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); 

}