我目前正在进行塔防游戏。
简单地说就是这样:绿色圆圈(敌人)在屏幕上移动。通过点击,您可以放置塔。敌人的下方隐藏着一个矩形,塔身周围有一个大的不透明矩形,表示它的命中范围。如果它们发生碰撞,敌人开始失去健康,直到它死亡。
之前,我用这个测试看敌人是否在塔的范围内:
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语句以进行成功的测试?
答案 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;如果不是,你会继续下一个。 我希望我没有误解任何事情,可能会有所帮助。 :)