2013-03-14 146 views
-2

我想提出一个2D射击游戏在XNA 4.0子弹碰撞

我有一颗子弹在我的游戏,我试图让它与敌人发生冲突,但是当我试图检查其位置等于敌人它不

子弹射击:

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using Microsoft.Xna.Framework.Graphics; 
    using Microsoft.Xna.Framework; 

namespace Moba_Turtle1 
{ 
    class Bullet 
    { 
    Texture2D bulText; 

    float timer; 
    float interval = 2; 

    public bool shot = false; 

    public Vector2 velocity; 
    bool canChange = true; 

    public Vector2 position; 
    public Vector2 lastPosition; 
    Vector2 orgin; 

    public Bullet (Texture2D newText, Vector2 newPos) 
    { 
     bulText = newText; 
     position = newPos; 
    } 

    public void Update (GameTime gameTime) 
    { 


     if (Moba_Turtle1.Character.direction == true && canChange == true) 
     { 
      canChange = false; 
      velocity.X = 50f; 
     } 

     if (Moba_Turtle1.Character.direction == false && canChange == true) 
     { 
      canChange = false; 
      velocity.X = -50f; 
     } 


     position = position + velocity; 
    } 

    public void Draw(SpriteBatch spriteBatch) 
    { 
     spriteBatch.Draw(bulText, position, null, Color.White, 0f, orgin, 1.0f, SpriteEffects.None, 0); 
    } 
} 

}

碰撞检查:

foreach (BeeAi bee in Bees) 
     { 
      { 
       if (bullet.position == bee.position) 
        bulCol = true; 
      } 
     } 

     if (bulCol == true) 
      bullets.Clear(); 

请帮助!

+0

我没有看到您的标签所谈论的C代码。 – 2013-03-14 22:24:21

+0

当这成为一个C? – 2013-03-14 22:24:28

+0

看起来子弹增加了“速度”值,所以他们可能跳过“蜜蜂”的位置? – 2013-03-14 22:26:28

回答

0

不要比较花车,因为除非它们完全相同,否则它们将不相等。所以如果你计算的位置,你不会得到一个匹配。你应该测试子弹的位置是否在一个小范围内。

1
bullet.position == bee.position 

positionVector2,其由float坐标。子弹和蜜蜂与浮子的精确度完全相同的位置是极不可能的!

您需要重新考虑您的碰撞检测是否沿着两个边界矩形重叠的线。

0

问题是,正如别人提到的那样,你几乎不会碰到蜜蜂的相同位置。

一个简单的办法可以使你的循环是这样的:

foreach (BeeAi bee in Bees) 
{ 
    foreach (Bullet bullet in bullets) 
    { 
     if ((bullet.position - bee.position).Length() <= 10f) 
     { 
      bulCol = true; 
     } 
    } 
} 

但是这也可能失败很容易,如果子弹的速度足够高。

我建议你看看Ray,BoundingSphere,BoundingBox和Rectangle。

如果你的子弹始终只是水平移动,或者只是垂直移动,那么最简单和最好的解决方法是制作一个矩形,它跨越子弹移动最后一帧的距离,并使用Rectangle.Contains或其他东西。