如何在java中测试多个交叉点?

时间:2016-05-01 16:09:40

标签: java jpanel draw game-physics rectangles

我目前正在进行塔防游戏。

简单地说就是这样:绿色圆圈(敌人)在屏幕上移动。通过点击,您可以放置​​塔。敌人的下方隐藏着一个矩形,塔身周围有一个大的不透明矩形,表示它的命中范围。如果它们发生碰撞,敌人开始失去健康,直到它死亡。

之前,我用这个测试看敌人是否在塔的范围内:

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 个答案:

答案 0 :(得分: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()方法。

答案 1 :(得分:0)

您可以按照检测到的顺序存储敌人,这样您就可以知道哪个是最接近的。就像检测到的敌人的ArrayList或每个敌人对象的ID类型变量一样,在检测到时会初始化。我很确定有很多这样的方法,所以以某种方式存储订单可以工作。一旦你有订单,你只能攻击那个,并且不再需要测试检测到的对象,同时仍然在寻找即将到来的敌人并继续存储它们。 在你的情况下

if(enemy[i].getEBox().intersects(boxes[j])&&!(enemy[i- 1].getEBox().intersects(boxes[j])))

我真的没有看到(或者可能只是太累了)为什么你需要这些条件来攻击。如果你的敌人阵列已经整齐,你为什么不攻击第一个?如果inRange&amp;&amp;如果不是,你会继续下一个。 我希望我没有误解任何事情,可能会有所帮助。 :)