2013-07-29 4 views
0

В моей игре в понг у меня в основном есть два весла, мяч, который настроен на отскок от всех стен/весла, он работал нормально, но теперь после первого удара с помощью весла , он начинает обнаруживать столкновения не так, не могли бы вы, пожалуйста, посмотрите на этот код, чтобы посмотреть, что случилось:XNA - Ball Обнаружение столкновения неправильное после первого столкновения

Ball.cs:

public class Ball 
{ 
    GreenPaddle gPaddle; 
    BluePaddle bPaddle; 
    public Texture2D ballTexture; 
    public Vector2 ballPosition; 
    public Rectangle ballRect; 
    public float speed = 1f; 
    bool movingUp, movingLeft; 

    public Ball(GreenPaddle paddle, BluePaddle paddleb) 
    { 
     this.gPaddle = paddle; 
     this.bPaddle = paddleb; 
     movingLeft = true; 
     movingUp = true; 
    } 

    public void LoadContent(ContentManager Content) 
    { 

     ballTexture = Content.Load<Texture2D>("ball"); 
     ballPosition = new Vector2(380, 225); 
     ballRect = new Rectangle((int)ballPosition.X, (int)ballPosition.Y, 
      20, 20); 

    } 

    public void Update(GameTime gameTime) 
    { 
     BallMovement(); 
     CollideWithPaddles(); 
    } 

    public void Draw(SpriteBatch spriteBatch) 
    { 
     spriteBatch.Draw(ballTexture, ballRect, Color.White); 
    } 

    public void BallMovement() 
    { 
     if (movingUp) { ballPosition.Y -= speed; ballRect.Y -= (int)speed; } 
     if (!movingUp) { ballPosition.Y += speed; ballRect.Y += (int)speed; } 
     if (movingLeft) { ballPosition.X -= speed; ballRect.X -= (int)speed; } 
     if (!movingLeft) { ballPosition.X += speed; ballRect.X += (int)speed; } 

     if (ballPosition.Y < 83) 
     { 
      movingUp = false; 
     } 
     if (ballPosition.Y >= 500) 
     { 
      movingUp = true; 
     } 

    } 


    public void CollideWithPaddles() 
     { 

      if (ballRect.Intersects(gPaddle.gpRect)) 
       movingLeft = false;  
      if (ballRect.Intersects(bPaddle.bpRect)) 
       movingLeft = true; 

     } 
    } 

И в моих Game1.cs я есть эту часть, я может возникнуть проблема:

public bool BallHitEffect() 
    { 
     //Plays an effect/animation when ball hits the paddle 
     if (gPaddle.gpRect.Intersects(ball.ballRect) || bPaddle.bpRect.Intersects(ball.ballRect)) 
     { 
      ball.speed += 0.5f;//Makes the ball go faster every paddle-hit. 
      return true; 
     } 
     else { return false; } 
    } 

И в моем методе Game1.cs Update у меня есть это для анимации:

//If it is not already playing and there is collision, start playing 
     if (!IsPlaying && BallHitEffect()) 
      IsPlaying = true; 
     //Increment the frameTimePlayed by the time (in milliseconds) since the last frame 
     if (IsPlaying) 
      frameTimePlayed += gameTime.ElapsedGameTime.TotalMilliseconds; 
     //If playing and we have not exceeded the time limit 
     if (IsPlaying && frameTimePlayed < animationTime) 
     { 
      animatedSprite.Update(gameTime); 
      // And increment your frames (Using division to figure out how many frames per second) 
     } 
     //If exceeded time, reset variables and stop playing 
     else if (IsPlaying && frameTimePlayed >= animationTime) 
     { 
      frameTimePlayed = 0; 
      IsPlaying = false; 
      // TODO: Possibly custom animation.Stop(), depending on your animation class 
     } 

анимация является 800x400, каждое изображение/плитка 200х200.

ответ

0

Проблема в том, что когда мяч сталкивается, вы увеличиваете скорость на 0,5. Однако, когда вы перемещаете hitbox, вы округлите скорость. Это означает, что hitbox перемещается на 1 каждый кадр, но мяч на 0,5

+0

Ой, я вижу, вы знаете, как это исправить? Я пробовал, но не добился успеха. X) –

+0

Вы можете просто увеличить скорость на 1 вместо 0.5. – davidsbro

Смежные вопросы