SWT - 在瓷砖上绘制移动图像

时间:2013-01-13 19:10:31

标签: java swt

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

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

然后我试图让Tile简单地延伸,只是保持图像。然后我将每个Tile放在一个2D数组中,并通过嵌套for循环绘制每个Tile,使用for循环中的int,乘以图像大小,以绘制Tile的Image。我将此代码放在我的构造函数内部的PaintListener中,用于扩展Canvas并在Fill布局中将Map放到我的Shell上,但PaintListener永远不会被调用(我使用print语句进行了测试)。

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

2 个答案:

答案 0 :(得分:0)

我做了类似的事情。

使用PaintListener我需要重新绘制Widget时才能收到调用。在我的绘画函数中,我遍历一个tile数组(包含在World类中)并绘制所有tile。之后我使用与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
    }
}

这显然是一个简洁的代码示例,因为该类是编辑器的一部分,可以对鼠标点击和其他操作进行反应。

答案 1 :(得分:0)

当我在前一段时间做基于磁贴的模拟时,我这样做了: 我有两层瓷砖地图 - 一个用于地形,第二个用于单位。 地图本身由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. 因为你制作一个关于制作游戏循环的简单游戏this post对你来说绝对有用。这有希望也回答你关于在地图上移动物体的问题。
  2. This site也会非常有用,因为您可能还需要在某些时候检测到碰撞。