对象列表上的XNA碰撞检测
本文关键字:XNA 碰撞检测 列表 对象 | 更新日期: 2023-09-27 17:58:11
我试图检测敌方对象列表上的碰撞,但它只处理最后创建的对象。我都试过了:
for (int i = 0; i < enemies.Count; i++)
{
if (IntersectsPixel(player.rectangle, player.textureData, enemies[i].rectangle, enemies[i].textureData))
{
touched = true;
}
else
{
touched = false;
}
}
和:
foreach (Enemy enemy in enemies)
{
if (IntersectsPixel(player.rectangle, player.textureData, enemy.rectangle, enemy.textureData))
{
touched = true;
}
else
{
touched = false;
}
}
这两个我都放在Update方法中。敌人每隔几秒钟就会被制造出来,所以我知道检测是有效的,但一旦下一个出现,最后一个就会停止工作。。。
如果只检查最后一项,则必须中断循环,当IntersectsPixel
为true并处理对象
for (int i = 0; i < enemies.Count; i++)
{
if (IntersectsPixel(player.rectangle, player.textureData, enemies[i].rectangle, enemies[i].textureData))
{
touched = true;
break;
}
}
或者使用linq来收集所有这样的对象:
var resTrue = enemies.Where(x=>x.IntersectsPixel(player.rectangle, player.textureData, enemies[i].rectangle, enemies[i].textureData)).ToList();
var resFalse = enemies.Where(x=>!x.IntersectsPixel(player.rectangle, player.textureData, enemies[i].rectangle, enemies[i].textureData)).ToList();
为什么不在class Enemy
中实现属性bool Touched
?
这样,你就可以这样修改你的代码:
if (/*check for collision*/)
enemy.Touched = true;
更好的是,实现一个方法OnTouched(/*arguments*/)
而不是Touched
,这样您就可以这样做:
if (/*check for collision*/)
enemy.OnTouched(/*arguments*/); // Which would perform any and all necessary actions on the touched object