0

我一直在尝试用不同的方式在游戏的瓷砖网格上移动图像,但我一直无法获得有效的实现。

首先,我尝试使用网格布局来容纳一堆扩展 Canvas 并自行绘制的 Tiles。这很好地绘制了瓷砖,但似乎我无法在它们上面绘制我的 Player 对象。最初,Player 还扩展了 Canvas,我打算将小部件放在图块的顶部。这似乎是不可能的。

然后我试图让 Tile 什么都不扩展,只保留图像。然后,我将每个 Tile 保存在 2D 数组中,并通过嵌套的 for 循环绘制每个 Tile,使用 for 循环中的 int 乘以图像大小来绘制 Tile 的图像。我将此代码放在 Map 类的构造函数中的 PaintListener 中,该类扩展了 Canvas 并将我的 Map 放到填充布局中的 Shell 上,但从未调用 PaintListener(我使用 print 语句进行了测试)。

我可以使用什么实现在游戏开始时绘制 Tiles,然后允许我控制我的 Player 图像的移动?

4

2 回答 2

0

我做了类似的事情。

PaintListener当需要重新绘制小部件时,我会使用 a来调用。在我的绘画函数中,我循环遍历一个瓦片数组(包装在一个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 层瓦片地图 - 一层用于地形,第二层用于单位。地图本身由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 回答