如何在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])&amp;&amp;!(enemy[i- 1].getEBox().intersects(boxes[j])))

我真的不明白(或者可能只是太累了)你为什么需要这些条件来攻击。如果你的敌人已经排好了,为什么不先攻击呢?如果 inRange && isAlive 如果不是,则继续下一个。 我希望我没有误解任何事情,可能会有所帮助。 :)

【讨论】:

测试基本上就是检查这个:敌人在射程内吗? && 前面没有敌人也在同一个塔的范围内吗?如果是这样,造成伤害。 ID 想法的唯一问题是,当我认为应该能够用一条 iif 语句解决问题时,我需要更改敌人对象类的布局方式。

以上是关于如何在java中测试多个交叉点?的主要内容,如果未能解决你的问题,请参考以下文章

如何在jsp 或者java类 写峰谷平的判断方法,比如多个时间段间不能交叉,而且要满24小时,

如何在 MATLAB 中使用交叉验证测试?

如何在iOS设备中部署交叉绘图表单应用程序进行测试

在使用 k 折交叉验证训练训练数据后如何测试数据?

如何在 R 中跨多个字段创建简单的交叉表

如何将 Java 源代码交叉编译为 JavaScript?