我正在用Java编写一个炸弹人游戏,我已经为游戏地图(包含瓷砖),玩家(以及他们在地图中的移动)编写了代码,现在我被困在代码中炸弹爆炸。
我有一个Map
类,其中包含Tiles
的二维数组,其中可以包含Player
s,Block
和Bomb
s。
Player
对象的方法dropBomb
从receiveBomb
对象调用方法Map
(每个Player
都有Map
对象的引用)与炸弹和炸弹的位置。调用Map
方法receiveBomb
后,地图会将炸弹放入正确的Tile
。
我的问题在于炸弹的爆炸。谁应该关心它?炸弹本身?如果是,炸弹是否应该包含它的Tile
的参考?到目前为止,我的磁贴不需要Map
引用。
我认为有一种可能性是在Tile
对象内部有Bomb
引用,因此,当炸弹爆炸时(并且炸弹知道它应该爆炸的时候)它会调用一个方法爆炸的对象和图块调用地图中的方法。顺便说一句,我不知道这是个好主意。我该怎么办?
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);
}
}
玩家类:
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);
}
}
地图类:
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);
}
}
我省略了移动方法,因为移动已经很好了。
答案 0 :(得分:2)
我一直都在学习,并遵守“桌子自我画”的规则。画家可以选择颜色并调用方法,地板可以决定泄漏和飞溅的显示方式,但表格会自行绘制。
回到你的问题:炸弹爆炸。这样你可以有不同炸弹的不同效果。炸弹对瓷砖有影响,瓷砖对此作出反应。
示例:炸弹有一种力和一种爆炸。炸弹,(我认为只占用一个和一个瓷砖?)将“给它”效果给瓷砖。
现在是处理分配此力量的牌。让我们说你有几种炸弹,一种力量(比如1到10之间的数字)和两种类型(比如说正常,燃烧,冻结)。
现在你的炸弹爆炸了,因为你的化身是一个5级火焰法师,你的炸弹是4级并且有类型的燃烧弹。所以你对你的瓷砖说:我用力量4爆炸,我让你着火了!
现在,瓷砖开始播放。任何被爆炸力“触及”的瓷砖都需要将其称为“爆炸”功能才能完成任务。如果它也着火了,那么“onFire”功能还有更多工作要做。
哪些瓷砖'爆炸'来自力量。具有力4的普通瓦片将对4范围内的所有正方形进行表示,但如果它是一个特殊的瓦片(它自己知道),就像山瓦片一样,它可能无法用该力推进。
瓷砖1用4爆炸并用力3将它交给相邻的瓷砖。其中一块瓷砖可能是墙,所以不做任何进一步的操作。另一个是普通的瓷砖,然后爆炸,并继续用力2等向前推进。如果它是“水”瓷砖,爆炸被推向前,但火不是,等等
这样:
最后看起来大多数工作都是由瓷砖完成的,甚至可能就是这种情况。但是第一步:计算力,类型和第一次来自炸弹。炸弹爆炸了。然后爆炸对瓷砖有影响。磁贴处理该磁带,并在需要时传播它。
答案 1 :(得分:0)
你的地图应该对爆炸负责,因为它适用于地图上的每一块瓷砖。毕竟,如果没有另一种瓦片类型在几秒钟后消失,那么爆炸是什么?
当您的游戏循环调用Map对象上的update方法时,您的地图应该知道:
将您的设计视为一系列事件,在最终绘制之前在游戏循环中逐一处理。当您的炸弹被丢弃时,它会以recieveBomb()
的形式向地图发出一个事件,其中地图是事件控制器。
我认为这个问题更适合讨论格式,而不是Q&amp; A格式。如果不了解整体架构,很难告诉你什么是“正确的设计”。
答案 2 :(得分:0)
地图应该是处理炸弹爆炸的负责人。
我建议在地图中有一个队列,其中包含所有存在的炸弹。此外,你的炸弹应该有一个计时器(即CreationTime),这样当炸弹被推入队列时,你会检查队列中的每个炸弹,看看它们在那里已经存在了多长时间,如果适用的话“爆炸”它们。
在地图中添加ExplodeBomb
功能,检查所有4个方向并相应处理切片。