2013-03-14 2 views
-2

내가총알 충돌

XNA 4.0에서 2D 슈팅 게임을 만드는 중이라서 내 게임에 총알을 가지고 있고 그 위치가 동일한 경우는 확인하려고 할 때 내가 적으로 충돌을 얻으려고 노력하지만 해요

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); 
    } 
} 

}

충돌 검사 :

적 그렇지

총알 촬영을한다 0

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

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

제발 도와주세요!

+0

태그가 말하는 C 코드가 표시되지 않습니다. –

+0

이것이 C? –

+0

글 머리 기호가 'velocity'값만큼 증가하는 것처럼 보입니다. 그러면 '꿀벌'의 위치를 ​​바로 건너 뛸 수 있습니까? –

답변

0

정확하게 동일하지 않으면 부동 소수점을 비교하지 마십시오. 따라서 포지션을 계산한다면 일치하지 않을 것입니다. 총알 위치가 작은 값 범위 내에 있는지 테스트해야합니다.

1
bullet.position == bee.position 

positionfloat 좌표 제조 된 Vector2이다. 총알과 꿀벌이 부유물의 정확도와 정확히 같은 위치에있을 가능성은 거의 없습니다!

두 개의 경계 사각형이 겹치는 지 여부에 따라 충돌 감지를 다시 생각해야합니다.

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 등을 사용하는 것입니다.