如何在java中测试多个交叉点?
Posted
技术标签:
【中文标题】如何在java中测试多个交叉点?【英文标题】:How to test for multiple intersections in java? 【发布时间】:2016-05-01 16:09:40 【问题描述】:我目前正在制作一款塔防游戏。
简单地说它的工作原理是这样的:绿色圆圈(敌人)在屏幕上移动。通过单击,您可以放置一个塔。敌人在其下方隐藏了一个矩形,而塔周围有一个大的不透明矩形,表示其命中范围。如果他们发生碰撞,敌人就会开始失去生命值,直到死亡。
之前,我用这个测试来看看敌人是否在塔的范围内:
for(int i=0;i<enemy.length; i++) //Runs for the total amount of enemies
for(int j=0; j<boxes.length;j++) //Runs for the total amount of towers placed
if(enemy[i].getEBox().intersects(boxes[j])) //boxes[j] is the towers' range box
enemy.setHealth(enemy.getHealth()-1);
但是,我希望塔一次只能射击一个敌人,最好是前线的敌人。为此,我需要 java 来检测有多个敌人与矩形碰撞,并且只对前面的敌人造成伤害。
这是我为此运行的测试(例如,敌人数组值向后移动,因此第一个出现的是敌人[0],最后一个敌人[10]):
for(int i=1;i<enemy.length; i++)
for(int j=0; j<boxes.length;j++)
if(enemy[i].getEBox().intersects(boxes[j])&&!(enemy[i-1].getEBox().intersects(boxes[j])))
enemy.setHealth(enemy.getHealth()-1);
然而,第二个条件总是返回一个正数。如何更改我的 if 语句以进行成功的测试?
【问题讨论】:
2个同时碰撞会发生什么? 您将有一个条件一直运行,直到相交的第一个对象死亡...然后将其从列表中删除...然后转到第二个添加的下一个对象...然后等到它死了......然后从列表中删除它......等等。 它的运行与第一个循环完全相同。第二个条件总是通过.. @DarkV1 但是如果我有 2 个塔,而第一个塔没有杀死敌人怎么办?这将使其余的塔保持不活动状态,直到第一个敌人死亡。 你会得到敌人在范围内的塔的数量。并根据塔的总伤害减去敌人的生命值 【参考方案1】:要使塔只向一个敌人射击,请在射击开始时翻转循环并打破内循环。
for(int j=0; j<boxes.length;j++) //Runs for the total amount of towers placed
for(int i=0;i<enemy.length; i++) //Runs for the total amount of enemies
if(enemy[i].getEBox().intersects(boxes[j])) //boxes[j] is the towers' range box
enemy[i].setHealth(enemy[i].getHealth()-1);
break; // skip remaining enemies, since towers has used
// up it's shooting capability for this round
如果一座塔可以优先射击哪个敌人,则循环遍历所有敌人以找到最佳候选者,然后对其进行射击。
for (int j=0; j<boxes.length; j++) //Runs for the total amount of towers placed
int enemyToShootIdx = -1;
for (int i=0; i<enemy.length; i++) //Runs for the total amount of enemies
if (enemy[i].getEBox().intersects(boxes[j])) //boxes[j] is the towers' range box
if (enemyToShootIdx == -1 || betterCandidate(boxes[j], enemy[i], enemy[enemyToShootIdx]))
enemyToShootIdx = i;
if (enemyToShootIdx != -1)
enemy[enemyToShootIdx].setHealth(enemy[enemyToShootIdx].getHealth()-1);
现在您只需实现betterCandidate()
方法。
【讨论】:
上面的有点马车。。下面的我没试过,但有限的拍摄并不是我的目标,而且,如果塔重叠,或者我画不止几座塔,有些塔实际上根本不会伤害敌人..【参考方案2】:您可以按照检测到的顺序存储敌人,以便知道哪个是最近的。就像检测到的敌人的 ArrayList 或每个敌人对象的 ID 类型的变量,在检测到时初始化。我很确定有很多这样的方法,所以以某种方式存储订单是可行的。一旦你有一个命令,你就可以只攻击那个,并且不再需要测试检测到的对象,同时仍然寻找即将到来的敌人并继续存储它们等等。 你的情况
if(enemy[i].getEBox().intersects(boxes[j])&&!(enemy[i- 1].getEBox().intersects(boxes[j])))
我真的不明白(或者可能只是太累了)你为什么需要这些条件来攻击。如果你的敌人已经排好了,为什么不先攻击呢?如果 inRange && isAlive 如果不是,则继续下一个。 我希望我没有误解任何事情,可能会有所帮助。 :)
【讨论】:
测试基本上就是检查这个:敌人在射程内吗? && 前面没有敌人也在同一个塔的范围内吗?如果是这样,造成伤害。 ID 想法的唯一问题是,当我认为应该能够用一条 iif 语句解决问题时,我需要更改敌人对象类的布局方式。以上是关于如何在java中测试多个交叉点?的主要内容,如果未能解决你的问题,请参考以下文章