如何在java中高效地编写大量/多个敌人的繁殖和冲突检测代码
我遇到了一些困难,因为我不知道如何高效地编写代码。 我正在创建一个垂直滚动射击游戏&我想产生大量的敌人。 在地图的特定y坐标处&给他们一个特定的x坐标。 如果我用几个敌人进行测试,在我的敌人类中,我现在使用的代码如下所示:如何在java中高效地编写大量/多个敌人的繁殖和冲突检测代码,java,android,arrays,collision-detection,Java,Android,Arrays,Collision Detection,我遇到了一些困难,因为我不知道如何高效地编写代码。 我正在创建一个垂直滚动射击游戏&我想产生大量的敌人。 在地图的特定y坐标处&给他们一个特定的x坐标。 如果我用几个敌人进行测试,在我的敌人类中,我现在使用的代码如下所示: if (Background.bgY == -3972 && active == 0) { active = 1; type = 1; centerX = enemyXstart4; KnightmareGame.activated = 1; Knightm
if (Background.bgY == -3972 && active == 0) {
active = 1;
type = 1;
centerX = enemyXstart4;
KnightmareGame.activated = 1;
KnightmareGame.activatedatY = Background.bgY;
}
g.drawImage(currentBomb, bo1.getCenterX(), bo1.getCenterY(), this);
g.drawImage(currentBomb, bo2.getCenterX(), bo2.getCenterY(), this);
g.drawImage(currentBomb, bo3.getCenterX(), bo3.getCenterY(), this);
它基本上寻找滚动背景是否在坐标Y,激活类型1的敌人(炸弹)并给它起始坐标centerX,activatedatY。
这意味着我在为每一个敌人写这段代码
然后在我的KnightmareGame类(在屏幕上绘制敌人的例程)中,我手动绘制每个敌人,如下所示:
if (Background.bgY == -3972 && active == 0) {
active = 1;
type = 1;
centerX = enemyXstart4;
KnightmareGame.activated = 1;
KnightmareGame.activatedatY = Background.bgY;
}
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)
g.drawImage(currentBomb,bo1.getCenterX(),bo1.getCenterY(),this)代码>
我正在考虑一个循环,但不知道代码如何
数组列表代码>
然后使用
for (Enemy bo : enemies) {
// logic for each enemy.
}
- 不要忘记在摧毁或离开屏幕后移除旧敌人
- 不要每次都创建新对象。为了提高效率,使用一种新的方法
提高碰撞效率
对于要检查碰撞的大量实体,通常使用
看看你的情况是否需要
您还可以尝试一些空间优化,如
这些可能只是wiki链接,但我想如果您知道要搜索什么,您可以进一步搜索
希望这有帮助。
祝你好运