我想长时间使用我的游戏引擎来编写《塔防》游戏,但是由于另一个小组努力创建JavaFX《塔防》游戏,所以我认为我宁愿创建另一款游戏。 从邮件列表中,我了解到不再开发其他游戏。 因此,我决定尝试一下。

塔防是一款非常适合基于图块的方法的游戏,因此我开始寻找一些图块。 我在这里找到了一些东西 ,而艺术家Silviu Ploisteanu允许我在演示中使用它们。 塔防作为游戏与TileMap编辑器非常相似,因此我将能够重用我之前创建的编辑器中的许多代码:

首先要做的是将单个图形组合成图像进行平铺。 我对敌人,炮塔基地,大炮,地形进行了分组,还为背景创建了一个图块图块。 之后,我使用了TileMap编辑器( http://www.mapeditor.org/ )从这些图像创建TileSet。 我可能不得不再次做这部分,因为Gimp在此过程中更改了颜色,但是现在我对图像的外观不太在意。

然后,我从底部到顶部将5层添加到新地图:“背景”,“地形”,“炮塔基地”,“炮塔大炮”和“敌人”。 也将有一个“子弹和爆炸”层,但我稍后会手动添加。 到目前为止,还没有涉及任何编码,通过基于TileMap的方法,我们已经有了游戏的序列化格式。 因此,当用户编辑地图时,我们可以简单地将更改存储到TileMap中。 现在的地图如下所示:

java塔防游戏源码 java老版手机塔防游戏_linux

下一步是编码。 我只是用BorderPane创建了一个新的JavaFX Application。 在中心,我将有一个运动场,在右边,我将有一个带有大炮的调色板。

这是创建GameCanvas的方法:

tileMap = TileMapReader.readMap(fileURL);
canvas = new GameCanvas(tileMap.getTilewidth() * tileMap.getWidth(), tileMap.getHeight() * tileMap.getTileheight(), tileMap.getTilewidth() * tileMap.getWidth(), tileMap.getHeight() * tileMap.getTileheight());
// add all the layers
ArrayList layers = tileMap.getLayers();
for (TileMapLayer tileMapLayer : layers) {
  canvas.addLayer(tileMapLayer);
}

然后我获得带有大炮的TileSet并创建Palette。 我正在为调色板使用VBox,因为我还希望使地形可编辑,因此以后我可能会添加另一个TileSet:

TileSet turrets = tileMap.getTileSet("turrets");

TileSetView turretView = new TileSetView(turrets);
VBox palette = new VBox();
palette.getChildren().addAll(turretView);

TileSetView仅显示基础图像,并允许您通过单击鼠标来选择一个Tile。 当我们从用户交互开始时,我可能会稍后再显示代码。 现在,这是我们在启动游戏后看到的内容:

java塔防游戏源码 java老版手机塔防游戏_linux_02

难看的红色区域是默认背景。 不幸的是,背景图像的尺寸不是平铺尺寸的倍数,因此稍后我将不得不定义一个不合理的尺寸。 现在,我将忽略它,它只是一个背景……

现在,我们希望用户能够放置炮塔。 目前,玩家拥有不限量的金钱,因此他可以根据需要放置任意数量的炮塔。 唯一的限制是,只有在平台上并且没有炮塔的情况下,他才能放置它们。 因此,我们为鼠标事件添加了一个EventHandler,该事件处理程序是从Palette中选择的炮塔,并将其添加到炮塔基础层。 为了简单起见,我现在将炮塔基座和炮塔组合成一个图像:

canvas.setOnMousePressed(new EventHandler() {
@Override
public void handle(MouseEvent t) {

double x = t.getX();
double y = t.getY();

int idx = (int) ((int) x / tileMap.getTilewidth() + (((int) y / tileMap.getTileheight()) * tileMap.getWidth()));
if (platformLayer.getGid(idx) != 0 && turretBaseLayer.getGid(idx)==0) {
turretBaseLayer.getData().setGid(idx, turretView.getSelectedGid());
}
}
});

结果,我们现在可以将转塔放置在没有平台但还没有转塔的地方:

我认为第一部分已经表明,该API非常适合创建simplegame,而无需编写大量代码。 在下一部分中,我们将添加生成点和目标,并使用A *计算敌人路径。