【问题标题】:how to efficiently code the spawning and collision detection of a large amount / multiple enemies in java如何在java中有效地编码大量/多个敌人的产卵和碰撞检测
【发布时间】:2014-10-20 20:53:43
【问题描述】:

我遇到了一些困难,因为我不知道如何高效地编写代码。 我正在创建一个垂直滚动射击游戏,我想产生大量敌人。 在地图的某些 y 坐标处并给它们一个特定的 x 坐标。 如果一直在用几个敌人进行测试,并且在我的 Enemy-class 中,我现在使用的代码如下所示:

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

这基本上是寻找滚动的背景是否在坐标 Y,激活类型 1 的敌人(炸弹)并将其起始坐标为 centerX,activatedatY。 这意味着对于每一个敌人,我都在编写这段代码......

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

    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 个,所以如果我继续 1 对 1 编码,代码会变得非常混乱。

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

  1. 我只是(首先)不知道如何为这个数组列表编码。
  2. 第二个。我不知道如何自动化我的绘制方法,比如 g.drawImage(currentBomb, bo1.getCenterX(), bo1.getCenterY(), this); 我正在考虑一个循环,但不知道代码如何......
  3. 碰撞检测:在这里,我还在一个代码块中为每个敌人进行碰撞检测,而不是将单个单独代码块中的每个敌人与我的弹丸进行比较。

有人知道怎么做吗?或者如果我应该以不同的方式来做,那么我现在在想什么?

非常感谢您的帮助!

【问题讨论】:

    标签: java android arrays collision-detection


    【解决方案1】:

    对付多个敌人

    创建一个ArrayList<Enemy> enemies;

    然后使用

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

    提高碰撞效率

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

    看看你的情况是否需要。

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


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

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

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多