我正在制作一个游戏,让敌人向上,向下,向左,向右四个方向移动。目前,当敌人在我的游戏中与岩石发生碰撞时,他们就会卡在那里。敌人的行动取决于他们的行动" int变量是; 1向右移动,2向左移动,3向下移动,4向上移动。因此,根据碰撞时它们的移动变量,它们应该朝相反的方向移动,直到它们不再发生碰撞。
敌人移动代码
public void enemyMove()
{
movetime--;
if (move == 1)
{
position.X += speed;
if (position.X > 1320)
{
move = rand.Next(1, 5);
position.X -= 5;
enemyMove();
}
}
if (move == 2)
{
position.X -= speed;
if (position.X < 160)
{
move = rand.Next(1, 5);
position.X += 5;
enemyMove();
}
}
if (move == 3)
{
position.Y += 5;
if (position.Y > 780)
{
move = rand.Next(1, 5);
position.Y -= 5;
enemyMove();
}
}
if (move == 4)
{
position.Y -= 5;
if (position.Y < 120)
{
move = rand.Next(1, 5);
position.Y += 5;
enemyMove();
}
}
}
岩石碰撞代码(e是敌人类,这是敌人移动代码所在的位置)
if (e.boundingBox.Intersects(r.boundingBox))
{
switch (e.move)
{
case 1:
{
e.position.X -= e.speed;
//e.move = 2;
break;
}
case 2:
{
e.position.X += e.speed;
//e.move = 1;
break;
}
case 3:
{
e.position.Y -= e.speed;
//e.move = 4;
break;
}
case 4:
{
e.position.Y += e.speed;
//e.move = 3;
break;
}
}
}
我注意到它碰撞时会改变它的移动变量的线条,因为到目前为止它应该没问题,但是敌人会一直卡住。当我确实将这些线条取消注释时,敌人会在6秒的时间内获得自由,并且#34; spazzing&#34; out(不能想出更好的描述方式)。
如果您需要查看更多代码以便提供帮助,请询问,我会为您提供
答案 0 :(得分:0)
为enemy
发生碰撞并尝试纠正时添加一个布尔标志 - 正如此代码所示,if(e.boundingBox.Intersects(r.boundingBox))
检查每一帧,从而导致一系列无限转向
同时研究射线投射和先验碰撞检测,因为这可以帮助解决嗡嗡声问题,并且可以防止在墙壁中间嵌入一半的视觉实例来处理碰撞和纠正所需的几帧。