0

私はアイソメトリックゲームを作成していますが、ジグザグアイソメトリックマップを作成することしかできませんでした。私の元々のアイデアはひし形でしたが、なんとかできませんでした。

ダイヤモンド:coobird.net/img/tile-diamond-good-order.png

ジグザグ:coobird.net/img/tile-zigzag-compact.png

これが何が起こっているかを示すための私のコードのビットです:

世界:

  public void chunkGenerate() {
    moduleX = ((ListManager.getTileWidth()*8));
    moduleY = ((ListManager.getTileHeight()*8));
    for (int x = 0; x <= width; x++) {
        for (int y = 0; y <= height; y++) {
            if ((x%moduleX) == 0) {
                if ((y%moduleY) == 0) {
                    chunkList.add(new Chunk(x,y));
                }
            }
        }
    }
          }

チャンク:

 public void Generate() {
    for (int x = 0; x < 8; x++) {
        for (int y = 0;y< 8; y++) {
            tileList.add(new Tile(location.getX()+(x*ListManager.getTileWidth()),location.getY()+(y*ListManager.getTileHeight()),0));
        }
    } 
}

レンダリング:

        for (Chunk c : w.getChunkList()) {
            g2d = (Graphics2D) g.create();
            for (int i = 0; i<c.getTileList().size(); i+=2) {
                g2d.drawImage(test2, (c.getTileList().get(i).getLocation().getX()+c.getTileList().get(i).getOffset().getxOffset()), (c.getTileList().get(i).getLocation().getY()+c.getTileList().get(i).getOffset().getyOffset()+w.getvOffset()), this);
                g2d.drawImage(test2, (c.getTileList().get(i).getLocation().getX()), (c.getTileList().get(i).getLocation().getY()+w.getvOffset()), this);
            }
            for (int i = 1;i<c.getTileList().size(); i+=2) {
                g2d.drawImage(test2, (c.getTileList().get(i).getLocation().getX()), (c.getTileList().get(i).getLocation().getY()+w.getvOffset()), this);
                g2d.drawImage(test2, (c.getTileList().get(i).getLocation().getX()+c.getTileList().get(i).getOffset().getxOffset()), (c.getTileList().get(i).getLocation().getY()+c.getTileList().get(i).getOffset().getyOffset()+w.getvOffset()), this);

            }
        }

マップをジグザグではなくダイアモンドにするのに助けが必要です。コードに関する詳細情報が必要な場合は、以下にコメントしてください。また、このコードの1つのバグは、タイルのカップルごとに1ピクセル幅のスペースがあることです。理由はわかりません..オフセットを調整しようとしましたが、役に立ちませんでした..現在のオフセット:(タイルコンストラクター)

 offset = new IsometricOffset(21,11);

スペースがなくなったのに一番近かったのは20,10でしたが、それでも小さなスペースがありました

ここに写真があります:

http://img845.imageshack.us/img845/6242/picbz.png

助けてくれてありがとう!編集:どうやら、画面上の2つのタイルは、実際にはエンジン内の1つのタイルだけです。私はそれを修正するために取り組んでいます。

編集:

変更してこれを取得しました:img526.imageshack.us/img526/3121/test333.png

図:

        for (Chunk c : w.getChunkList()) {
            /*for (int i = 0; i<c.getTileList().size(); i++) {
                g2d.drawImage(test2, (c.getTileList().get(i).getLocation().getX()), (c.getTileList().get(i).getLocation().getY()+w.getvOffset()), this);
            }*/
            for (int i = 0;i<c.getTileList().size(); i++) {
                g2d.drawImage(test2, (c.getTileList().get(i).getLocation().getX()+c.getTileList().get(i).getOffset().getxOffset()), (c.getTileList().get(i).getLocation().getY()+c.getTileList().get(i).getOffset().getyOffset()+w.getvOffset()), this);

            }
        }

(オフセットなしで描画してみましたが、画像と同じものが描画されました)生成:

    for (int x = 0; x < 8; x++) {
        for (int y = 0;y< 8; y++) {
            tileList.add(new Tile(location.getX()+(x*ListManager.getTileWidth()/2),location.getY()+(y*ListManager.getTileHeight()/2),0));
        }
        location.setX(location.getX()+ListManager.getTileWidth()/2);
        location.setY(location.getY()+ListManager.getTileHeight()/2);
    } 

実験後:

生む:

        public void Generate() {
    for (int x = 0; x < 8; ++x) {
        for (int y = 0;y< 8; ++y) {
            tileList.add(new Tile(location.getX()+(y*ListManager.getTileWidth()/2),location.getY()-(y*ListManager.getTileHeight()/2),0));
        }
        location.setX(location.getX()+ListManager.getTileHeight()/2);
        location.setY(location.getY()+ListManager.getTileWidth()/2);
    } 
}

結果:これは私が得た最も近いものです:http: //img814.imageshack.us/img814/3450/bombombom.png

4

1 に答える 1

1

マップが45度回転したと想像してみてください。

              (0, 3)
       (0, 2)        (1, 2)
(0, 1)        (1, 1)        (2, 2)
       (1, 0)        (2, 1)
              (2, 0)

そして、レンダリングサイクルは次のようになっている必要があります。

x = 0, y = 100,
for (dx = 0; dx < 3; ++dx) {
    for (dy = 0; dy < 3; ++dy) {
        drawTile(x + dy * width / 2, y - dy * height / 2);
    }
    x += width / 2;
    y += height / 2;
}

UPD:動作の証明。

コード(actionscriptですが、アルゴリズムに違いはありません):

var x:Number = 100, y:Number = 100, 
    dx:Number, dy:Number, px:Number, py:Number,
    halfWidth:Number = 40, halfHeight:Number = 20,
    s:Sprite = new Sprite(),
    g:Graphics = s.graphics;

g.lineStyle(1, 0xffffff);
for (dx = 0; dx < 3; ++dx) {
    for (dy = 0; dy < 3; ++dy) {
        px = x + dy * halfWidth;
        py = y - dy * halfHeight;

        g.moveTo(px - halfWidth , py);
        g.lineTo(px, py - halfHeight);
        g.lineTo(px + halfWidth, py);
        g.lineTo(px, py + halfHeight);
        g.lineTo(px - halfWidth, py);
    }
    x += halfWidth;
    y += halfHeight;
}

addChild(s);

結果:

格好良いタイル

于 2012-05-08T15:43:18.690 に答える