如何测试 java 中的多个交叉点?
How to test for multiple intersections in java?
我目前正在制作一款塔防游戏。
简单地说它是这样工作的:绿色圆圈(敌人)在屏幕上移动。通过单击,您可以放置一个塔。敌人下面有一个隐藏的矩形,塔周围有一个不透明的大矩形,指示其命中范围。如果它们发生碰撞,敌人就会开始失去生命值,直到死亡。
之前,我用这个测试看敌人是否在塔的范围内:
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);
}
}
}
然而,第二个条件总是returns肯定的。如何更改我的 if 语句以进行成功的测试?
要让一座塔只向一个敌人射击,翻转循环并在射击开始时打破内循环。
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()
方法。
您可以按照检测到的顺序存储敌人,这样您就可以知道哪个离得最近。就像检测到的敌人的 ArrayList 或每个敌人对象的 ID 类型的变量,在检测到时初始化。我很确定有很多这样的方法,所以以某种方式存储订单是可行的。一旦你有一个命令,你就可以只攻击那个,并且不再需要测试检测到的对象,同时仍然寻找即将到来的敌人并继续存储它们等等。
你的情况
if(enemy[i].getEBox().intersects(boxes[j])&&!(enemy[i- 1].getEBox().intersects(boxes[j])))
我真的不明白(或者可能只是太累了)为什么你需要这些条件来攻击。如果你的敌人阵列已经排列整齐,你为什么不攻击第一个呢?如果 inRange && isAlive 如果不是你继续下一个。
我希望我没有误解任何东西,可能会有所帮助。 :)
我目前正在制作一款塔防游戏。
简单地说它是这样工作的:绿色圆圈(敌人)在屏幕上移动。通过单击,您可以放置一个塔。敌人下面有一个隐藏的矩形,塔周围有一个不透明的大矩形,指示其命中范围。如果它们发生碰撞,敌人就会开始失去生命值,直到死亡。
之前,我用这个测试看敌人是否在塔的范围内:
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);
}
}
}
然而,第二个条件总是returns肯定的。如何更改我的 if 语句以进行成功的测试?
要让一座塔只向一个敌人射击,翻转循环并在射击开始时打破内循环。
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()
方法。
您可以按照检测到的顺序存储敌人,这样您就可以知道哪个离得最近。就像检测到的敌人的 ArrayList 或每个敌人对象的 ID 类型的变量,在检测到时初始化。我很确定有很多这样的方法,所以以某种方式存储订单是可行的。一旦你有一个命令,你就可以只攻击那个,并且不再需要测试检测到的对象,同时仍然寻找即将到来的敌人并继续存储它们等等。 你的情况
if(enemy[i].getEBox().intersects(boxes[j])&&!(enemy[i- 1].getEBox().intersects(boxes[j])))
我真的不明白(或者可能只是太累了)为什么你需要这些条件来攻击。如果你的敌人阵列已经排列整齐,你为什么不攻击第一个呢?如果 inRange && isAlive 如果不是你继续下一个。 我希望我没有误解任何东西,可能会有所帮助。 :)