我一直在尝试使用不同的方式在游戏的平铺网格上移动图像,但我无法获得有效的实现。
首先,我尝试使用网格布局来保存一堆扩展Canvas并自行绘制的Tiles。这很好地绘制了瓷砖,但似乎我无法在它们上面绘制我的Player对象。最初,播放器也扩展了Canvas,我打算将小部件放在磁贴上。这似乎是不可能的。
然后我试图让Tile简单地延伸,只是保持图像。然后我将每个Tile放在一个2D数组中,并通过嵌套for循环绘制每个Tile,使用for循环中的int,乘以图像大小,以绘制Tile的Image。我将此代码放在我的构造函数内部的PaintListener中,用于扩展Canvas并在Fill布局中将Map放到我的Shell上,但PaintListener永远不会被调用(我使用print语句进行了测试)。
我可以使用什么实现在游戏开始时绘制Tiles,然后允许我控制播放器图像的移动?
答案 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()
游戏。检查我在下面提供的链接。
注