9

我正在用 Java 编写一个炸弹人游戏,我已经为游戏地图(包含瓷砖)、玩家(以及他们在地图中的移动)编写了代码,现在我被困在炸弹爆炸的代码中.

我有一个Map包含 2d 数组的类Tiles,它可以包含Players、Blocks 和Bombs。该Player对象有一个方法,该方法从对象(每个都有对象的引用)dropBomb调用该方法,并带有炸弹和炸弹的位置。调用该方法时,地图将炸弹放入正确的. 我的问题是炸弹爆炸。谁应该关心它?炸弹本身?如果是,炸弹应该有包含它的参考吗?到目前为止,我的瓷砖还不需要参考。receiveBombMapPlayerMapMapreceiveBombTileTileMap

我认为的一种可能性是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);
}
}

球员等级:

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);
}
}

我省略了运动方法,因为运动已经很好了。

4

3 回答 3

2

我一直在学习,并按照“桌子自己画”的规则生活。油漆工可能会选择颜色并调用方法,地板可能会决定泄漏和飞溅的显示方式,但桌子会自行着色。

回到你的问题:炸弹自己爆炸。这样你就可以对不同的炸弹产生不同的效果。炸弹对瓷砖有影响,而瓷砖对此作出反应。

示例:炸弹具有一种力量和一种爆炸类型。炸弹,(我认为只占据一个和一个瓷砖?)将“给予”它对瓷砖的影响。

现在是处理分配这种力量的瓷砖。假设您有几种炸弹,一种是力量(假设是 1 到 10 之间的数字)和两种类型(假设是普通、燃烧、冻结)。

现在你的炸弹爆炸了,因为你的化身是 5 级火法师,所以你的炸弹的威力为 4,类型为燃烧弹。所以你对你的牌说:我以 4 的力量爆炸,我让你着火了!

现在瓷砖进来玩了。任何被爆炸力“触及”的图块都需要调用它的“爆炸”函数来做事。如果它也着火了,“onFire”功能中还有很多事情要做

什么瓷砖“爆炸”来自力量。力量为 4 的普通牌会对 4 范围内的所有方格产生影响,但如果是特殊牌(它自己知道),比如山牌,它可能无法以这种力量前进。

瓷砖 1 以 4 爆炸并以 3 的力量将其提供给相邻的瓷砖。其中一个瓷砖可能是墙,所以不要做任何进一步的事情。另一个是普通瓷砖,会爆炸,并以 2 的力继续向前推进,依此类推。如果是“水”瓷砖,爆炸会被向前推,但火不会,依此类推

所以:

  • 炸弹自行爆炸并调用瓷砖爆炸功能
  • 瓦片爆炸,并根据瓦片类型向前推动爆炸。
  • 随后的瓷砖因此而爆炸。

最后,看起来大部分工作都是由瓷砖完成的,甚至可能是这种情况。但第一步:计算力、类型和第一个呼叫都是从炸弹开始的。炸弹爆炸。然后爆炸对瓷砖产生影响。瓦片处理它,并在需要时传播它。

于 2013-10-15T12:52:00.283 回答
0

您的地图应该对爆炸负责,因为它对地图上的所有其他图块负责。毕竟,如果不是另一种在几秒钟后消失的瓷砖类型,爆炸又是什么?

当您的游戏循环调用 Map 对象上的更新方法时,您的地图应该知道:

  • 炸弹在哪个瓷砖上
  • 问炸弹的范围有多远
  • 找出炸弹可以到达的相邻瓷砖中的内容

将您的设计视为一系列事件,在最终绘制之前在游戏循环中逐一处理。当你的炸弹被投下时,它会以recieveBomb()Map 作为事件控制器的形式向 Map 发起一个事件。

我相信这个问题更适合讨论形式而不是问答形式。如果不了解整体架构,很难告诉你什么是“正确的设计”。

于 2013-10-15T12:49:32.903 回答
0

地图应该负责处理炸弹爆炸。

我建议在地图中设置一个队列,其中包含所有存在的炸弹。此外,您的炸弹应该有一个计时器(即 CreationTime),以便当炸弹被推入队列时,您检查队列中的每个炸弹它们在其中的时间,如果适用,“爆炸”它们。

在地图中添加一个ExplodeBomb函数来检查所有 4 个方向并相应地处理图块。

于 2013-10-15T12:52:56.587 回答