好的,所以我有一个敌人类(有旋转,位置,纹理等)。我在屏幕上产生了一些敌人,它们四处移动,但它们相互重叠。所以我试着在同一个班级的两个敌人之间进行碰撞检查。但无论我尝试什么方法,它都不是很有效。我尝试过的最好的事情是:
foreach (Enemy enemy1 in enemies)
{
enemy1Pos = new Vector2(enemy1.position.X, enemy1.position.Y)
foreach (Enemy enemy2 in enemies)
{
enemy2Pos = new Vector2(enemy2.position.X, enemy2.position.Y)
if (Vector2.Distance(enemy2Pos, enemy1Pos) < 200)
{
enemy1Pos += new Vector2((float)(enemy1.Speed * Math.Cos(enemy1.Rotation)), (float)(enemy1.Speed * Math.Sin(enemy1.Rotation)));
}
}
}
这不是确切的代码,所以它可能会有一些错误。无论如何,当我实施这个解决方案时,敌人并没有重叠,所以一切都很好。但是,他们总是移动到屏幕的右侧。
我也查了一下植绒等,但我想知道,我怎样才能发现同一类的两个物体之间的碰撞?
答案 0 :(得分:2)
如果enemy1等于敌人2总是会发生碰撞。 :)
避免......
foreach (Enemy enemy2 in enemies)
{
if (enemy2 == enemy1) continue;
enemy2Pos = new Vector2(enemy2.position.X, enemy2.position.Y)
if (Vector2.Distance(enemy2Pos, enemy1Pos) < 200)
{
enemy1Pos += new Vector2((float)(enemy1.Speed * Math.Cos(enemy1.Rotation)), (float)(enemy1.Speed * Math.Sin(enemy1.Rotation)));
}
}
Foreach不是最好的...你可以用更有效的方式完成collsion检查:
for (int i = 0; i<enemies.Count-1; i++)
{
var enemy1 = enemies[i];
for (int j=i+1; j<enemies.Count; j++)
{
var enemy2 = enemies[j]
}
这样您就可以避免自我检查并避免重复检查。