2

基本上,当计算机和玩家发生碰撞时,此刻,我试图让玩家和计算机的速度与碰撞时的速度相反。以前可行,但是现在不行,因为即使玩家和计算机玩家的速度都发生了变化,似乎他们也会卡住。

我认为这是由于每帧检查更新方法等的次数,所以它的速度不断变化。

所以我只想在播放器和计算机发生碰撞时更改它,而不是在它们发生碰撞时继续更改它。

编辑:显示问题的视频链接(youtube.com/watch?v=oON4s2SRtso)

4

2 回答 2

2

当您检测到碰撞时,您不必只更改计算机和玩家的速度,还需要更改它们的位置。
例如,减去速度矢量(因为它是前一帧),以确保计算机和玩家没有碰撞。这样,当你改变它们的速度时,它们就不会卡住,而且速度只会改变一次。

编辑

当您的移动球员和球发生碰撞时,您必须暂时将其速度设置为 0,然后更改球的位置:

computerPlayer.Position.X = player.Position.X + offset

offset从玩家的起点到对撞机边界的距离在哪里。
当您停止移动玩家时,您会反转之前的球速度(在将其设置为 0 之前),使其反弹并离开您。

于 2013-09-27T11:29:48.907 回答
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;
}

有几种方法可以解决这个问题。这只是一个。这个解决方案可能不能很好地扩展,但对于一些小的东西,它可以工作。

于 2013-09-27T16:54:31.280 回答