Java SWT-在瓷砖上绘制运动图像
我一直在尝试不同的方法在游戏的格子上移动图像,但我一直无法得到一个有效的实现 首先,我尝试使用网格布局来容纳一堆扩展画布并绘制自己的瓷砖。这很好地绘制了瓷砖,但似乎我无法在上面绘制我的玩家对象。最初,播放器还扩展了画布,我打算将小部件放在瓷砖的顶部。看来这是不可能的 然后我试着让瓷砖不延伸任何东西,只保留图像。然后,我在一个2D数组中保存每个平铺,并通过一个嵌套的for循环绘制每个平铺,使用for循环中的int乘以图像大小来绘制平铺的图像。我将这段代码放在我的Map类的构造函数中的PaintListener中,该类扩展了Canvas并将我的Map放到填充布局中的Shell中,但PaintListener从未被调用(我使用print语句进行了测试)Java SWT-在瓷砖上绘制运动图像,java,swt,Java,Swt,我一直在尝试不同的方法在游戏的格子上移动图像,但我一直无法得到一个有效的实现 首先,我尝试使用网格布局来容纳一堆扩展画布并绘制自己的瓷砖。这很好地绘制了瓷砖,但似乎我无法在上面绘制我的玩家对象。最初,播放器还扩展了画布,我打算将小部件放在瓷砖的顶部。看来这是不可能的 然后我试着让瓷砖不延伸任何东西,只保留图像。然后,我在一个2D数组中保存每个平铺,并通过一个嵌套的for循环绘制每个平铺,使用for循环中的int乘以图像大小来绘制平铺的图像。我将这段代码放在我的Map类的构造函数中的PaintLi
在游戏开始时,我可以使用什么样的实现来绘制瓷砖,然后允许我控制玩家图像的移动?我做了类似的事情 使用
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];