我正在用Java写一个炸弹人游戏,我已经为游戏地图(包含瓷砖),玩家(以及他们在地图中的移动)编写了代码,现在我被困在炸弹爆炸的代码中.
我有一个Map包含2d数组的类Tiles,它可以包含Players,Blocks和Bombs.该Player对象有一个方法dropBomb,它receiveBomb从Map对象(每个Player都有对象的引用Map)调用方法与炸弹和炸弹的位置.当调用该Map方法时receiveBomb,地图将炸弹放入正确的位置Tile.我的问题在于炸弹的爆炸.谁应该关心它?炸弹本身?如果是的话,炸弹是否应该Tile包含它的参考?直到现在我的瓷砖都不需要Map参考.
我认为有一种可能性是Tile在Bomb对象内部有引用,因此,当炸弹爆炸时(并且炸弹知道它应该爆炸的时候)它会在tile对象中调用爆炸的方法,并且tile会在地图中调用一个方法.顺便说一句,我不知道这是个好主意.我该怎么办?
public class Tile {
private boolean available; //if the tile is not occupied by a indestructible block or bomb
private List<Entity> entities; //you can have more than one player at a tile
public boolean receiveEntity(Entity entity) {
boolean received = false;
if (available) {
this.entities.add(entity);
received = true;
if (entity instanceof Block || entity instanceof Bomb) {
available = false;
}
}
return received;
}
public boolean removePlayer(Player player) {
return entities.remove(player);
}
}
Run Code Online (Sandbox Code Playgroud)
玩家类:
public class Player implements Entity {
private Map gameMap;
private int posX;
private int posY;
private int explosionRange; //the explosion range for bombs
public Player(int posX, int posY, Map gameMap) {
this.gameMap = gameMap;
this.posX = posX;
this.posY = posY;
this.explosionRange = 1;
}
public void dropBomb() {
gameMap.receiveBomb(new Bomb(explosionRange), posX, posY);
}
}
Run Code Online (Sandbox Code Playgroud)
地图类:
public class Map {
private Grid<Tile> tileGrid;
private int width;
private int height;
public Map(int width, int height, BuildingStrategy buildingStrategy) {
this.width = width;
this.height = height;
this.tileGrid = new Grid<Tile>(width, height);
buildingStrategy.buildMap(this);
}
public void receiveBomb(Bomb bomb, int posX, int posY) {
tileGrid.get(posX, posY).receiveEntity(bomb);
}
}
Run Code Online (Sandbox Code Playgroud)
我省略了移动方法,因为移动已经很好了.
我一直学习并遵循“桌子自行绘制”的规则。油漆工可能会选择颜色并调用方法,地板可能会决定如何显示泄漏和飞溅,但桌子会自行油漆。
回到你的问题:炸弹自己爆炸。这样你就可以让不同的炸弹产生不同的效果。炸弹会对瓷砖产生影响,瓷砖也会对此做出反应。
示例:炸弹具有威力和爆炸类型。炸弹(我认为只占据一格和一格?)会将其效果“赋予”一格。
现在是负责分配这种力量的图块。假设你有几种炸弹,一种威力(假设为 1 到 10 之间的数字)和两种类型(假设为普通、燃烧、冻结)。
现在你的炸弹爆炸了,因为你的化身是 5 级火法师,所以你的炸弹威力为 4,燃烧类型。所以你对你的方块说:我用能量 4 爆炸,我要点燃你!
现在瓷砖开始发挥作用了。任何被爆炸力“触及”的图块都需要调用它的“Exploded”函数来执行操作。如果也着火了,“onFire”函数里还有更多的事情要做
瓦片被‘爆炸’的,是来自于力量。力量为 4 的普通瓷砖将向 4 范围内的所有方格提供解释,但如果它是特殊瓷砖(它自己知道这一点),例如山瓷砖,它可能无法以该力量前进。
方块 1 爆炸为 4,并将其以力量 3 传递给相邻的方块。其中一个方块可能是墙,因此无需执行任何进一步操作。另一个是普通瓷砖,会爆炸,并继续以力 2 向前推进,依此类推。如果是“水”瓷砖,爆炸会被向前推,但火不会,等等
所以:
最后,看起来大部分工作都是由瓷砖完成的,而且情况可能确实如此。但第一步是:计算力量、类型,并且第一次调用来自炸弹。炸弹爆炸了。然后爆炸会对瓷砖产生影响。该图块会处理该问题,并在需要时传播它。