基本上,当计算机和玩家发生碰撞时,此刻,我试图让玩家和计算机的速度与碰撞时的速度相反。以前可行,但是现在不行,因为即使玩家和计算机玩家的速度都发生了变化,似乎他们也会卡住。
我认为这是由于每帧检查更新方法等的次数,所以它的速度不断变化。
所以我只想在播放器和计算机发生碰撞时更改它,而不是在它们发生碰撞时继续更改它。
编辑:显示问题的视频链接(youtube.com/watch?v=oON4s2SRtso)
基本上,当计算机和玩家发生碰撞时,此刻,我试图让玩家和计算机的速度与碰撞时的速度相反。以前可行,但是现在不行,因为即使玩家和计算机玩家的速度都发生了变化,似乎他们也会卡住。
我认为这是由于每帧检查更新方法等的次数,所以它的速度不断变化。
所以我只想在播放器和计算机发生碰撞时更改它,而不是在它们发生碰撞时继续更改它。
编辑:显示问题的视频链接(youtube.com/watch?v=oON4s2SRtso)
当您检测到碰撞时,您不必只更改计算机和玩家的速度,还需要更改它们的位置。
例如,减去速度矢量(因为它是前一帧),以确保计算机和玩家没有碰撞。这样,当你改变它们的速度时,它们就不会卡住,而且速度只会改变一次。
编辑
当您的移动球员和球发生碰撞时,您必须暂时将其速度设置为 0,然后更改球的位置:
computerPlayer.Position.X = player.Position.X + offset
offset
从玩家的起点到对撞机边界的距离在哪里。
当您停止移动玩家时,您会反转之前的球速度(在将其设置为 0 之前),使其反弹并离开您。
根据我从您的评论和问题中得到的信息,您可以跟踪物体何时发生碰撞。当它们发生碰撞时,只需设置一个布尔值,提醒您对象已发生碰撞。每次检查碰撞时,只需重置布尔值。一个示例 sudo 代码
bool collision = false;
void CheckCollision(){
colliding = /* Colliding() */;
if(colliding && !collision){
collision = true;
//Manipulate directions, locations, etc.
}
else if(!colliding ){ //No collision
collision = false;
}
}
bool Colliding(){
return colliding;
}
有几种方法可以解决这个问题。这只是一个。这个解决方案可能不能很好地扩展,但对于一些小的东西,它可以工作。