2013-07-30 1 views
0

Dans mon jeu de pong, j'ai une balle et deux pagaies. Je veux donc que lorsque ball.ballRect.x < 5 est true, score.greenScore incréments comme si: score.greenScore++;XNA - Changer la position des rectangles

Et cela fonctionne bien, mais je veux aussi en sorte que la balle se déplace vers le centre de l'écran.

Ainsi, dans Game1.cs Je l'ai fait:

public void ScoreAdder() 
    { 
     if (ball.ballRect.X < 5) 
     { 
      score.blueScore++; 
      ball.ballRect = new Rectangle((int)400, (int)250, ball.ballTexture.Width, ball.ballTexture.Height); 
     } 

    } 

Il remonte au centre et ajoute le score, mais maintenant il ne sera pas écouter les collisions.

Dans mes Ball.cs Je dessine que le rectangle, comme:

spriteBatch.Draw(ballTexture, ballRect, Color.White);

Parce que quand j'utilise la position Vector2, la balle apparaîtra même pas sur l'écran.

+1

Quel est votre code de collision? – Cyral

+1

On dirait que vous devez mettre à jour votre variable ballRect pour refléter la nouvelle position de votre balle. – jgallant

+0

Avez-vous essayé les réglages Position.X à rect.X, et Position.Y à rect.Y lorsque vous réapparaissez? – Cyral

Répondre

1

Avez-vous réinitialisé le Position lorsque vous remettez la balle au centre?

Vous pourriez jamais profiter des propriétés avec ceci, et avoir le point Position au Rectangle ou vice-versa.

public Vector2 BallPosition 
{ 
    get 
    { 
     return ballPosition; 
    } 
    set 
    { 
     ballRectangle.X = value.X; 
     ballRectangle.Y = value.Y; 
     ballPosition = value; 
    } 
} 
private Vector2 ballPosition 

Je ne suis pas sûr de la façon dont vous gérez la collision et tout, mais chaque fois que vous définissez la position qu'elle défendra le rectangle, vous pouvez également essayer le contraire, où vous définissez le rectangle et il se synchronise avec le position.

1

Je ne sais pas comment vous encapsuler la logique de la balle, mais voici comment je pourrais essayer de le faire. L'utilisation d'une classe comme celle-ci garantit que toute la logique interne de la boule est dans un endroit de sorte que le rectangle de dessin résultant peut être prédit basé sur la position et les limites. Plus de balles qui disparaissent de l'utilisation de vector2!

public class Ball 
{ 
private Vector2 _position; 
private Vector2 _velocity; 
private Point _bounds; 

public Vector2 Position { get { return _position; } set { _position = value; } } 
public Vector2 Velocity { get { return _velocity; } set { _velocity = value; } } 
public int LeftSide { get { return (int)_position.X - (_bounds.X/2); } } 
public int RightSide { get { return (int)_position.X + (_bounds.X/2); } } 
public Rectangle DrawDestination 
{ 
    get 
    { 
     return new Rectangle((int)_position.X, (int)_position.Y, _bounds.X, _bounds.Y); 
    } 
} 

public Ball(Texture2D ballTexture) 
{ 
    _position = Vector2.Zero; 
    _velocity = Vector2.Zero; 
    _bounds = new Pointer(ballTexture.Width, ballTexture.Height); 
} 

public void MoveToCenter() 
{ 
    _position.X = 400.0f; 
    _position.Y = 250.0f; 
} 

public void Update(GameTime gameTime) 
{ 
    _position += _velocity; 
} 
} 

Ensuite, dans votre mise à jour/dessiner code:

class Game 
{ 
void Update(GameTime gameTime) 
{ 
    // ... 

    ball.Update(gameTime); 

    if(ball.LeftSide < LEFT_BOUNDS) 
    { 
     score.blueScore++;  
     ball.MoveToCenter(); 
    } 
    if(Ball.RightSide > RIGHT_BOUNDS) 
    { 
     score.greenScore++; 
     ball.MoveToCenter(); 
    } 

    // ... 
} 

void Draw(GameTime gameTime) 
{ 
    // ... 

    _spriteBatch.Draw(ballTexture, ball.DrawDestination, Color.White); 

    // ... 
} 
} 

Souvenez-vous de moduler également la vitesse de la balle par le temps de trame écoulé.

Questions connexes