1

我有一个计算机图形课程的作业,我们是否必须更改游戏代码。课程本身完全是关于理论的,所以我们几乎必须自己弄清楚代码,我从来没有用 C# 编程过,很抱歉我的无知。

每当我的玩家精灵被一个盒子击中时,我希望生命变量减 1。然而,只要它被击中,它就会一直下降。我明白为什么会发生这种情况,但我不知道如何阻止它。

这是检查两个对象是否发生碰撞的代码。

if (b.BoundBox.Intersects(player.BoundSphere)){
    player.hit = true;
}

在播放器的更新功能中,我有:

if(hit){
    lives -= 1
}

我怎样才能让它只递减一次,而不是不断地递减?

4

2 回答 2

3

发生这种情况是因为它会不断检测到它正在发生碰撞,只要其中一个对象的一部分在另一个对象内部,它就会说它正在发生碰撞。

解决此问题的方法是,当对象发生碰撞时,设置一个表示对象已发生碰撞的布尔值,然后启动一个计时器,持续多少秒。当布尔值设置为 true 时,当对象碰撞时它不会减少生命值,但如果它是 false 则会减少生命值。计时器到时,将值设置为 false,以便它们可以继续碰撞。这使对象有时间离开另一个对象的“内脏”。

编辑:

这是一个非常简单的解决方法,可能不适用于您的情况(因为我不知道游戏规则)。一个更完整的解决方案是将对象推开,使其不再发生碰撞,或者预测每个对象将在哪里更新,并防止它们实际发生碰撞。

于 2013-10-22T05:00:55.440 回答
1

你不需要一个计时器来解决这个问题,只要声明另一个bool来跟踪你是否更新了生活。

if (b.BoundBox.Intersects(player.BoundSphere) && !player.hit)
{
    player.hit = true;
    player.updated = false;
}

在您的播放器更新中:

if (hit && !updated)
{
    lives -= 1
    updated = true;
}

但是,如果您想使用计数器,只需声明:

TimeSpan timer = new TimeSpan(0, 0, x); //where x is how many seconds you need

然后在Update方法中:

timer -= gameTime.ElapsedGameTime;
if (timer <= TimeSpan.Zero)
{
   // do what you want
}
于 2013-10-22T23:13:28.673 回答