如何有效地编码java中大量/多个敌人的产卵和碰撞检测

时间:2014-04-01 09:26:52

标签: java android arrays collision-detection

我遇到了一些困难,因为我不知道如何编码效率。 我正在创建一个垂直滚动射击游戏&我想产生大量的敌人。 在地图的某些y坐标处。给他们一个x坐标。 如果用几个敌人和我的Enemy级别进行测试,我现在使用的代码看起来像这样:

 if (Background.bgY == -3972 && active == 0) {
active = 1;
type = 1;
centerX = enemyXstart4;
KnightmareGame.activated = 1;
KnightmareGame.activatedatY = Background.bgY;
} 

如果滚动的背景位于坐标Y,基本上查找,激活类型1的敌人(炸弹)并给它起始坐标centerX,activateatY。 这意味着每个敌人都可以编写这段代码......

然后在我的KnightmareGame Class(其中包含了屏幕上绘制敌人的例程)我手动绘制每个敌人,这看起来像这样:

    g.drawImage(currentBomb, bo1.getCenterX(), bo1.getCenterY(), this);
    g.drawImage(currentBomb, bo2.getCenterX(), bo2.getCenterY(), this);
    g.drawImage(currentBomb, bo3.getCenterX(), bo3.getCenterY(), this);

在我的碰撞检测方法中,我还要逐一检查每个敌人:

if (projectileRect.intersects(KnightmareGame.bo1.bombRectangle)) {
        visible = false;            
        if (KnightmareGame.bo1.health > 0) {
            KnightmareGame.bo1.health -= 1;
        }
        if (KnightmareGame.bo1.health == 0) {
            Enemy.animateFire= true;

等等。

问题在于,我的总量超过了50,所以如果我继续逐一编码它们,代码就会变得非常混乱。

我想到的是我可能会在所有y坐标中创建一个数组列表,我想用随后的x坐标生成敌人。 例如在-3900我想在x坐标200处生成一个敌人。在-3800处在x坐标300处等等所以一个数组列表,其中每个位置包含2个变量(x,y)

  1. 我只是不知道(首先)如何为这个数组列表编码。
  2. 第二个。我不知道如何自动化我的绘制方法 g.drawImage(currentBomb, bo1.getCenterX(), bo1.getCenterY(), this); 我在考虑一个循环,但不知道代码是什么......
  3. 碰撞检测:在这里我还会在每个敌人的一个代码块中进行碰撞检测,而不是将一个单独的代码块中的每个敌人与我的射弹进行比较。
  4. any1知道怎么做吗?或者也许如果我应该采用不同的方式,那么我现在正在考虑什么?

    非常感谢帮助!

1 个答案:

答案 0 :(得分:0)

处理多个敌人

创建ArrayList<Enemy> enemies;

然后使用

for (Enemy bo : enemies) {
    // logic for each enemy.
}
  • 不要忘记在摧毁或离开屏幕后移除旧敌人。
  • 每次都不要继续创建新对象。使用object pool提高效率。

提高碰撞效率

对于大量要检查碰撞的实体,通常使用broadphase algorithm

在您的情况下查看是否需要。

您也可以尝试一些空间优化,例如quad-trees


这些可能只是维基链接,但我想如果你知道要搜索什么,你可以进一步搜索。

希望这有帮助。
祝你好运。