0

我只想在我在 XNA 游戏工作室的 2D 游戏中创建的一艘船上发生陆地碰撞时处理分数。Life(Score) 在 GameLife 类中被设置为 100 个名为 Life 的变量……

当两个物体相撞时,我想将生命减少 2 点...

但问题是当船在陆地上相撞时,生命会立即变为负值,直到船物体远离陆地物体......请帮帮我......

此处提供了代码

`private void HandleLandCollition(List<LandTile> landtiles)
{
    foreach (LandTile landtile in landtiles)
    {
        rectangle1 = new Rectangle((int)landtile.position.X - landtile.texture.Width / 2,
                    (int)landtile.position.Y - landtile.texture.Height / 2,
                    landtile.texture.Width, landtile.texture.Height);//land object

        rectangle2 = new Rectangle((int)position.X - texture.Width / 2,
                    (int)position.Y - texture.Height / 2,
                    texture.Width, texture.Height);//rectangle2 is defined to ship object
        if (rectangle1.Intersects(rectangle2))
        {
            shiplife.Life = shiplife.Life - 2;
        }
    }
}
4

1 回答 1

1

您的问题可能是您每帧都调用此方法。通常 XNA 每秒调用 Update() 60 次,所以如果你的船接触陆地一秒钟,它会失去 2*60 = 120 生命值,这会导致你看到的负值。

我的解决方案是这样的:

protected override void Update(GameTime gameTime)
{
    float elapsedTime = (float) gameTime.ElapsedTime.TotalSeconds;
    HandleCollision(landtiles, elapsedTime);
}
float landDamagePerSecond = 2;
private void HandleLandCollision(List<LandTile> landtiles, float elapsedTime)
{
    shipRectangle= new Rectangle((int)position.X - texture.Width / 2,
                (int)position.Y - texture.Height / 2,
                texture.Width, texture.Height);//rectangle2 is defined to ship object

    foreach (LandTile landtile in landtiles)
    {
                landRectangle= new Rectangle(
                (int)landtile.position.X - landtile.texture.Width / 2,
                (int)landtile.position.Y - landtile.texture.Height / 2,
                landtile.texture.Width, landtile.texture.Height);//land object

        if (landRectangle.Intersects(shipRectangle))
        {
            shiplife.Life -= landDamagePerSecond * elapsedTime;
        }
    }
}

elapsedTime 是自最后一帧被调用以来的时间,将其乘以地块每秒对船造成的伤害将导致船在接触地块时每秒损失 2 点生命值;)

于 2012-10-27T20:07:59.913 回答