0

ゲームのタイルのグリッド上で画像を移動するさまざまな方法を試してきましたが、機能する実装を取得できませんでした。

最初に、キャンバスを拡張して自分自身を描画する一連のタイルを保持するために、グリッド レイアウトを使用してみました。これでタイルがきれいに描画されましたが、その上に Player オブジェクトを描画できないようです。もともと、Player は Canvas も拡張していたので、タイルの上にウィジェットを配置するつもりでした。これは不可能のようです。

次に、タイルを何も拡張せず、画像を保持するだけにしようとしました。次に、各タイルを 2D 配列に保持し、入れ子になった for ループで各タイルを描画します。for ループの int に画像サイズを掛けて、タイルの画像を描画します。このコードを Map クラスのコンストラクター内の PaintListener に配置して、Canvas を拡張し、Map を Fill レイアウトの Shell にドロップしましたが、PaintListener が呼び出されることはありません (print ステートメントでテストしました)。

ゲームの開始時にタイルを描画し、プレイヤー画像の動きを制御できるようにするには、どの実装を使用できますか?

4

2 に答える 2

0

私は似たようなことをしました。

を使用してPaintListener、ウィジェットを再描画する必要があるときに呼び出しを取得します。私のペイント関数では、(Worldクラスにラップされた) タイル配列をループして、すべてのタイルを描画します。worldObjectsその後、配列/クラスで同じ手法を使用します。

public class WorldWidget extends Canvas {

    WorldWidget() {
        addPaintListener(new PaintListener() {
            @Override
        public void paintControl(PaintEvent e) {
                WorldWidget.this.paintControl(e);
            }
        });
    }

    protected void paintControl(PaintEvent e) {
        GC gc = e.gc;
        for (short y = 0; y < world.getHeight(); y++) {
            for (short x = 0; x < world.getWidth(); x++) {
                final ITile tile = world.getTile(x, y);
                final Image image = ImageCache.getImage(tile);
                gc.drawImage(image, x * tileSize, y * tileSize);
            }
        }

        // Here is used a similar loop, to draw world objects
    }
}

クラスはエディターの一部であり、特にマウスのクリックや動きに反応するため、これは明らかに要約されたコード例です。

于 2013-01-13T19:22:38.343 に答える
0

少し前にタイル ベースのシミュレーションを行ったとき、次のようにしました。タイル マップの 2 つのレイヤーがありました。1 つは地形用、もう 1 つはユニット用です。マップ自体は で表されていましたJPanel。大まかに言えば、次のようになりますJPanel

        public void paintComponent(Graphics graphics) {
                // create an offscreen buffer to render the map
                if (buffer == null) {
                    buffer = new BufferedImage(SimulationMap.MAP_WIDTH, SimulationMap.MAP_HEIGHT, BufferedImage.TYPE_INT_ARGB);
                }
                Graphics g = buffer.getGraphics();

                g.clearRect(0, 0, SimulationMap.MAP_WIDTH, SimulationMap.MAP_HEIGHT);

                // cycle through the tiles in the map drawing the appropriate
                // image for the terrain and units where appropriate
                for (int x = 0; x < map.getWidthInTiles(); x++) {
                    for (int y = 0; y < map.getHeightInTiles(); y++) {
                        if (map.getTerrain(x, y) != null) {
                            g.drawImage(tiles[map.getTerrain(x, y).getType()], x * map.getTILE_WIDTH(), y * map.getTILE_HEIGHT(), null);
                        }
                    }
                }

               if (map.getSimulationUnits() != null) {
                   for (Unit unit : map.getSimulationUnits()) {
                    g.drawImage(tiles[unit.getUnitType()], (int) Math.round(unit.getActualXCor() * map.getTILE_WIDTH()), (int) Math.round(unit.getActualYCor() * map.getTILE_HEIGHT()),
                            null);
                   }
                }    

    // ...
// draw the buffer
        graphics.drawImage(buffer, 0, 0, null);
        }

論理:

private Terrain[][] terrain = new Terrain[WIDTH][HEIGHT];
/** The unit in each tile of the map */
private Unit[][] units = new Unit[WIDTH][HEIGHT];

次に、基本的にゲームとユニットの位置やその他のものを更新するゲームループがありrender()ますupdate()。以下に提供したリンクを確認してください。

ノート

  1. あなたは単純なゲームを作っているので、ゲーム ループの作成に関するこの投稿は間違いなく役に立ちます。これは、マップ上のオブジェクトの移動に関する質問にも答えてくれることを願っています。
  2. このサイトも非常に役立ちます。おそらく、ある時点で衝突も検出する必要があるからです。
于 2013-01-13T19:33:08.540 に答える