Java SWT-在瓷砖上绘制运动图像

Java SWT-在瓷砖上绘制运动图像,java,swt,Java,Swt,我一直在尝试不同的方法在游戏的格子上移动图像,但我一直无法得到一个有效的实现 首先,我尝试使用网格布局来容纳一堆扩展画布并绘制自己的瓷砖。这很好地绘制了瓷砖,但似乎我无法在上面绘制我的玩家对象。最初,播放器还扩展了画布,我打算将小部件放在瓷砖的顶部。看来这是不可能的 然后我试着让瓷砖不延伸任何东西,只保留图像。然后,我在一个2D数组中保存每个平铺,并通过一个嵌套的for循环绘制每个平铺,使用for循环中的int乘以图像大小来绘制平铺的图像。我将这段代码放在我的Map类的构造函数中的PaintLi

我一直在尝试不同的方法在游戏的格子上移动图像,但我一直无法得到一个有效的实现

首先,我尝试使用网格布局来容纳一堆扩展画布并绘制自己的瓷砖。这很好地绘制了瓷砖,但似乎我无法在上面绘制我的玩家对象。最初,播放器还扩展了画布,我打算将小部件放在瓷砖的顶部。看来这是不可能的

然后我试着让瓷砖不延伸任何东西,只保留图像。然后,我在一个2D数组中保存每个平铺,并通过一个嵌套的for循环绘制每个平铺,使用for循环中的int乘以图像大小来绘制平铺的图像。我将这段代码放在我的Map类的构造函数中的PaintListener中,该类扩展了Canvas并将我的Map放到填充布局中的Shell中,但PaintListener从未被调用(我使用print语句进行了测试)


在游戏开始时,我可以使用什么样的实现来绘制瓷砖,然后允许我控制玩家图像的移动?

我做了类似的事情

使用
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
    }
}
公共类WorldWidget扩展画布{
WorldWidget(){
addPaintListener(新的PaintListener(){
@凌驾
公共无效油漆控制(油漆事件e){
WorldWidget.this.paintControl(e);
}
});
}
受保护的void paintControl(PaintEvent e){
GC=e.GC;
对于(短y=0;y

这显然是一个浓缩的代码示例,因为该类是编辑器的一部分,在鼠标单击和移动等情况下会做出反应。

当我之前进行基于平铺的模拟时,我是这样做的: 我有两层瓷砖地图-一层用于地形,另一层用于单位。 地图本身由
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);
        }
然后你就有了游戏循环,在这里你可以更新单位的位置和其他东西,基本上是
render()
update()
游戏。检查我在下面提供的链接

  • 因为你正在制作一个简单的游戏,关于制作游戏循环肯定会对你有用。这也很有希望回答您关于在地图上移动对象的问题
  • 这将非常有用,因为您可能也需要在某个点检测碰撞
  • private Terrain[][] terrain = new Terrain[WIDTH][HEIGHT];
    /** The unit in each tile of the map */
    private Unit[][] units = new Unit[WIDTH][HEIGHT];