当我在XNA游戏工作室的2D游戏中创建的船上碰撞时,我只想处理得分。生命(得分)在游戏生活类中被定为100变量生命......
当两个物体碰撞时,我想减少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;
}
}
}
答案 0 :(得分: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点生命值;)