2017-12-11 37 views
0

그래서 저는 monogame을 사용하여 pong 게임을 만들고 내 히트 감지에 문제가 있습니다. 공이 왼쪽 패들에 닿았을 때 방향을 바꾸기를 원하지만 어떤 이유로 공이 공이 패들의 양쪽을 지나가고 튀어 오르지 만 맨 위로 볼 수있게되면 튀어 오릅니다. 아무도 볼 수 없으면 튀어 오릅니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 박쥐 클래스Monogame 충돌 감지가 올바르게 작동하지 않습니다.

public class Bat : DrawableGameComponent 
{ 
    private SpriteBatch spriteBatch; 
    private Texture2D tex; 
    private Vector2 speed; 
    private Vector2 position; 
    private Vector2 stage; 
    public Rectangle Rectangle 
    { 
     get 
     { 
      return new Rectangle((int)position.X, (int)position.Y, tex.Width, tex.Height); 
     } 
    } 

    public Bat(Game game, 
     SpriteBatch spriteBatch, 
     Texture2D tex, 
     Vector2 position, 
     Vector2 speed, 
     Vector2 stage): base(game) 
    { 
     this.spriteBatch = spriteBatch; 
     this.tex = tex; 
     this.position = position; 
     this.speed = speed; 
     this.stage = stage; 
    } 

박쥐와 충돌 탐지를 추가 충돌 클래스 업데이트 방법

public override void Update(GameTime gameTime) 
{ 
    if (ball.Rectangle.Intersects(bat.Rectangle)) 
    { 

     ball.speed.Y = -Math.Abs(ball.speed.Y); 
     hitSound.Play(); 
    } 

    base.Update(gameTime); 
} 

그리고 게임 클래스의 내 코드 Heres는

Texture2D batTex = this.Content.Load<Texture2D>("Images/BatLeft"); 
Vector2 batPos = new Vector2(100,100); 
Vector2 batSpeed = new Vector2(4, 0); 
bat = new Bat(this, spriteBatch, batTex, batPos, batSpeed, stage); 
this.Components.Add(bat); 

SoundEffect dingSound = this.Content.Load<SoundEffect>("Music/ding"); 

CollisionDetection cd = new CollisionDetection(this, ball, bat, dingSound); 
this.Components.Add(cd); 
+0

, 방망이와 공의 사각형은 (대신 고유 변수의'Rectangle' 클래스를 사용하는) 정의되지 않은, 표준으로 사각형을 사용해보십시오 get 메소드가없는 변수. 공공 변수에서 즉시 호출하십시오. – Steven

+0

여기에도 원 - 사각형 충돌이 필요합니다. –

답변

0

때마다 공의 사각형이 당신이 bal의 방향을 바꾸고있는 외륜의 직사각형과 교차합니다. 난 속도 야. 이 메서드는 개체의 위쪽 또는 아래쪽에만 충돌 할 때 잘 동작합니다.

공이 패들의 상단과 충돌 할 때마다, 사각형이 패들의 직사각형을 관통합니다. 공의 현재 하향 속도를 상향 속도로 되돌리면 공의 직사각형을 외륜의 직사각형에서 완전히 제거 할 수 있습니다. 당신의 공은 측면 충돌 때마다


{0, ballspeed}
에서
{0, -ballSpeed}
에 공의 속도 변화는 대부분 패들의 사각형에서 공의 사각형을 확보하는 것만으로는 충분하지 않습니다. 사각형에서 자유롭지 않으면 다음 업데이트에서 방향을 다시 반전시켜 이전 업데이트를 취소합니다. 외륜이 움직일 때까지 공은 사각형에 계속 머물러있게됩니다.

문제를 해결하려면 공이 패들의 상단, 측면 또는 하단에 영향을 미치는지 확인해야합니다. 그런 다음 공의 움직임을 적절하게 조정하십시오. 내가 도울 수

// Moves and checks for collision on the Y-axis 

position.Y += ball.speed.Y; 
if (Hitbox().Intersects(obstacle)) 
{ 
    position.Y -= ball.speed.Y; 
    ball.speed.Y = -ball.speed.Y; 
} 

// Moves and checks for collision on the X-axis 

position.X += ball.speed.X; 
if (Hitbox().Intersects(obstacle)) 
{ 
    position.X -= ball.speed.X; 
    ball.speed.X = -ball.speed.X; 
} 

희망 :

당신이 여기에서 시작하는 나의 옛 충돌 감지 방법 중 하나의 예입니다. 내 설명이나 코드에 대해 질문이 있으시면 언제든지 물어보십시오. 그것의 외모에서

-GHC