2017-03-16 2 views
2

Maintenant, quand j'appuie sur la barre d'espace, elle va aller à gauche ou à droite, je veux que la balle passe directement la première fois.Ensuite, quand la balle frappe un mur, bloque ou file, je veux que la balle en quelque sorte. C'est mon premier projet de jeu scolaire, c'est un jeu de pong d'une ligne.Comment déplacer la balle dans des directions différentes?

Editer: Modifier J'ai ajouté "boll_speed.X = random.Next (-1, 1);", et cela fonctionne parfaitement!

  • linje = ligne
  • liv = vit
  • boll = balle
  • Poäng = points
  • Je ne pas utiliser "blockröd = blockred" en ce moment
  • blockgrön = blockgreen

    public class Game1 : Game 
    { 
    GraphicsDeviceManager graphics; 
    SpriteBatch spriteBatch; 
    SpriteFont spritefont; 
    Texture2D linje_texture; 
    Texture2D boll_texture; 
    Texture2D blockröd_texture; 
    Texture2D blockgrön_texture; 
    Texture2D gameover_texture; 
    Rectangle linje_rect; 
    Rectangle boll_rect; 
    Rectangle blockröd_rect; 
    Rectangle blockgrön_rect; 
    Rectangle gameover_rect; 
    
    Vector2 linje_speed; 
    Vector2 boll_speed; 
    
    Random random; 
    
    int liv; 
    int poang; 
    int highscore; 
    
    List<Rectangle> block = new List<Rectangle>(); 
    
    bool Start = false; 
    
    public Game1() 
    { 
        graphics = new GraphicsDeviceManager(this); 
        Content.RootDirectory = "Content"; 
    
        graphics.PreferredBackBufferWidth = 760; 
        graphics.PreferredBackBufferHeight = 620; 
    } 
    
    protected override void Initialize() 
    { 
        linje_speed.X = 5f; 
        boll_speed.X = boll_speed.X = random.Next(-1, 1); 
        boll_speed.Y = 6f; 
        liv = 3; 
        poang = 0; 
    
        random = new Random(); 
    
        base.Initialize(); 
    } 
    
    protected override void LoadContent() 
    { 
        spriteBatch = new SpriteBatch(GraphicsDevice); 
        spritefont = Content.Load<SpriteFont>("Fonts/Myfont"); 
        linje_texture = Content.Load<Texture2D>("Pics/linje-lång"); 
        boll_texture = Content.Load<Texture2D>("Pics/boll"); 
        blockgrön_texture = Content.Load<Texture2D>("Pics/block-grön"); 
        blockröd_texture = Content.Load<Texture2D>("Pics/block-röd"); 
        gameover_texture = Content.Load<Texture2D>("Pics/GameOver"); 
        linje_rect = new Rectangle((Window.ClientBounds.Width - linje_texture.Width)/2, 580, linje_texture.Width, linje_texture.Height); 
        boll_rect = new Rectangle((Window.ClientBounds.Width - boll_texture.Width)/2, 556, boll_texture.Width, boll_texture.Height); 
        gameover_rect = new Rectangle((Window.ClientBounds.Width/2) - (gameover_texture.Width/2), (Window.ClientBounds.Height/2) - gameover_texture.Height/2, gameover_texture.Width, gameover_texture.Height); 
    
        block.Add(blockgrön_rect); 
        block.Add(blockröd_rect); 
        for (int i = 1; i < 5; i++) 
        { 
         for (int g = 1; g < 13; g++) 
         { 
          block.Add(new Rectangle((g * 63) - 60, (i * 40), blockgrön_texture.Width, blockgrön_texture.Height)); 
         } 
        } 
    } 
    
    protected override void UnloadContent() 
    { 
        // TODO: Unload any non ContentManager content here 
    } 
    
    protected override void Update(GameTime gameTime) 
    { 
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) 
         Exit(); 
        if (Start == true) 
        { 
         boll_rect.X += (int)boll_speed.X; 
         boll_rect.Y += (int)boll_speed.Y; 
        } 
    
        if(Start == false) 
        { 
         boll_rect.X = linje_rect.X + ((linje_texture.Width/2) - (boll_texture.Width/2)); 
        } 
        if (boll_rect.X > Window.ClientBounds.Width - boll_texture.Width || boll_rect.X < 0) 
         boll_speed.X *= -1; 
    
        if (boll_rect.Y > Window.ClientBounds.Height - boll_texture.Height || boll_rect.Y < 0) 
         boll_speed.Y *= -1; 
    
        if (boll_rect.Y > Window.ClientBounds.Height - boll_texture.Height) 
        { 
         liv -= 1; 
         Start = false; 
         boll_rect.X = (Window.ClientBounds.Width - boll_texture.Width)/2; 
         boll_rect.Y = 556; 
         linje_rect.X = (Window.ClientBounds.Width - linje_texture.Width)/2; 
         linje_rect.Y = 580; 
        } 
    
        KeyboardState ks = Keyboard.GetState(); 
        if (ks.IsKeyDown(Keys.Left)) 
        { 
         linje_rect.X -= (int)linje_speed.X; 
        } 
        else if (ks.IsKeyDown(Keys.Right)) 
        { 
         linje_rect.X += (int)linje_speed.X; 
        } 
        else if (ks.IsKeyDown(Keys.Space)) 
        { 
         Start = true; 
        } 
    
        if (linje_rect.X > Window.ClientBounds.Width - linje_texture.Width) 
         linje_rect.X = (Window.ClientBounds.Width - linje_texture.Width); 
    
        if (linje_rect.X < 0) 
         linje_rect.X = 0; 
    
        if (linje_rect.Intersects(boll_rect)) 
        { 
         boll_speed.Y *= -1; 
        } 
    
        base.Update(gameTime); 
    } 
    
    protected override void Draw(GameTime gameTime) 
    { 
        GraphicsDevice.Clear(Color.Black); 
    
        spriteBatch.Begin(); 
        if (liv > 0) 
        { 
         spriteBatch.Draw(linje_texture, linje_rect, Color.White); 
         spriteBatch.Draw(boll_texture, boll_rect, Color.White); 
         spriteBatch.DrawString(spritefont, "Liv kvar: " + liv, Vector2.Zero, Color.White); 
         spriteBatch.DrawString(spritefont, "Points: " + poang, new Vector2(350, 0), Color.White); 
         spriteBatch.DrawString(spritefont, "Highscore: " + highscore, new Vector2(660, 0), Color.White); 
         foreach (Rectangle g in block) 
         { 
          spriteBatch.Draw(blockgrön_texture, g, Color.White); 
         } 
        } 
        if (liv == 0) 
        { 
         spriteBatch.Draw(gameover_texture, gameover_rect, Color.White); 
        } 
        spriteBatch.End(); 
    
        base.Draw(gameTime); 
    } 
    } 
    

difficulté à ces pièces:

 if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) 
      Exit(); 
     if (Start == true) 
     { 
      boll_rect.X += (int)boll_speed.X; 
      boll_rect.Y += (int)boll_speed.Y; 
     } 

 if (boll_rect.X > Window.ClientBounds.Width - boll_texture.Width || boll_rect.X < 0) 
      boll_speed.X *= -1; 

     if (boll_rect.Y > Window.ClientBounds.Height - boll_texture.Height || boll_rect.Y < 0) 
      boll_speed.Y *= -1; 

 else if (ks.IsKeyDown(Keys.Space)) 
     { 
      Start = true; 
     } 

 if (linje_rect.Intersects(boll_rect)) 
     { 
      boll_speed.Y *= -1; 
      boll_speed.Y += random.Next(-100, 101)/100.0f; 
      boll_speed.X *= -1; 
      boll_speed.X += random.Next(-100, 101)/100.0f; 
     } 
+0

Alors quelle partie de ce code vous rencontrez des problèmes avec? – UnholySheep

+0

La balle dans le jeu de pong change habituellement la vitesse de 'y' (ou' x', je ne suis pas sûr de l'orientation de vos pagaies) en fonction de l'endroit où elle touche la pagaie, et probablement de la vitesse de la pagaie. En outre, il semble que la même question a déjà été [répondu sur gamedev] (http://gamedev.stackexchange.com/q/4253/38920). L'auteur de cette réponse a une page d'accueil avec un jeu de démo sur [richardcarter.org] (http://richardcarter.org/). – Groo

+0

Je peux copier tout le code, donc vous comprenez mieux. Fondamentalement, je veux que la balle aille bien la première fois. Quand j'appuie sur ESPACE au démarrage, mais cela va dans des directions différentes. Maintenant, il ne fait que monter et descendre tout le temps. Je vais regarder dans cette page! –

Répondre

0

Je vous penser à dire que vous voulez que la balle pour changer des directions aléatoires quand il atteint les limites ou la ligne de la fenêtre. Si oui:

Vous utilisez des valeurs constantes pour vos changements de direction. Ajoutez un randomizer pour multiplier votre boll_speed par.

Par exemple, dans pseudocode, au lieu de -1, faites aléatoire (-1).

+0

Okey, donc j'ai essayé de le faire, mais un peu déroutant comme vous pouvez le voir dans mon code édité là-haut. Le jeu s'écrase lorsque j'essaie de cliquer sur ESPACE pour libérer la balle maintenant: P –

+0

@LuckeGG, lorsque vous appuyez sur le bouton SPACE, vous voulez toujours des constantes pour monter et descendre. Pour revenir à votre code original: 'boll_speed.Y * = -1' fait monter ou descendre votre balle (sur l'axe Y). Si ça montait, ça va tomber. Si ça descendait, ça va monter. 'boll_speed.X * = -1' fait que votre balle va à gauche ou à droite (sur l'axe X). Quand la balle rebondit sur les murs ou la pagaie, vous voulez lui donner une valeur autre que -1 pour qu'elle soit inclinée. Essayez-le avec votre code original pour voir ce qui se passe. Ensuite, expérimentez avec 'random'. – leanne

+0

Merci, je l'ai changé en 'boll_speed.X = random.Next (-1, 1);' et cela fonctionne parfaitement. Avez-vous un peu touché le vôtre et maintenant ça marche! :) –

1

Random.Next(-1) devrait vous donner une erreur hors limites.

Vous pouvez utiliser quelque chose comme Random.Next(-200, 0)/100.0f, qui renverra un nombre négatif entre -2 et 0 (y compris -2, à l'exclusion de 0).

Mais remarquez que cette multiplication entraînera un ralentissement de la balle au fil du temps. Il peut atteindre le double de la vitesse actuelle, mais il peut ralentir jusqu'à près de 0 en une seule étape. Donc, je préférerais d'abord inverser la vitesse de la balle dans la direction y et garder la même chose dans x si vous frappez des lignes horizontales, et inverser dans x et garder dans y si vous frappez des lignes verticales. Ensuite, faites une addition aléatoire d'une constante de zéro-signifie.

boll_speed.Y *= -1; 
boll_speed.Y += random.Next(-100, 101)/100.0f; // Add random number between -1 and 1 with 0.01 precision. 
// and nearly the same for X. Depending on the lines hit. 
+0

Hm, si vous regardez mon code maintenant. J'ai réparé des choses comme tu l'as dit. Mais c'était un peu confus, ce que je devais faire. Mais il ne plante pas maintenant, et la balle peut rester coincée sur le côté gauche/droit. Mais la balle ne va pas droit tout le temps, juste à gauche et à droite. –

+0

@LuckeGG Désolé, je vais essayer d'être plus clair la prochaine fois :) Ca ne va pas tout droit parce que vous initialisez la vitesse en y avec 6f au lieu de 0. Mettez la vitesse en y à 0 et elle commencera tout droit. –

+0

Pas de problème, mais quand je mets le X à "0f" au lieu de "6f" il ira tout droit vers le haut et vers le bas quand j'appuie sur ESPACE. Mais ça ira tout droit tout le temps maintenant, même quand il frappe le toit supérieur? :) –

2

Je vais vous donner l'idée générique. S'il vous plaît adapter à votre exemple

Disons que vous voulez déplacer dans toutes les directions sur la carte, imaginez maintenant votre conseil d'administration en tant que matrice bi-dimensionnelle (tous vos pixels a un x, représentation y sur cette carte)

Le (0,0) marque le coin supérieur gauche de votre tableau, et votre (largeur, hauteur) marque le coin inférieur droit.Votre balle est au milieu de la planche sur la position (x, y), où x> 0 et x < largeur (de la planche) et y> 0 et y < hauteur.

Vous avez 8 base de directions différentes sur l'image ci-dessous

enter image description here

Maintenant, il est temps de traduire ces directions à une structure logique. Vous devez créer un tableau pour cela, disons que nous voulons commencer à partir de la direction NW. Je vais créer un tableau avec les nombres que vous devez ajouter à votre position (x, y) afin de continuer dans la direction que vous choisissez. Si vous voyez que je suis de créer une matrice bidimentional

enter image description here

Maintenant, c'est le pseudo-code pour votre idée:

int[,] directions = new int[,]{{-1,-1,-1,0,1,1,1,0}, {-1,0,1,1,1,0,-1,-1}}; 

    public void Move(Game game) 
    { 
     Point currentPosition = GetYourCurrentPosition(); //the x, y 
     int direction = GetYourRandomDirection() //this should be a random number between 0 and 7, beucase the array for directions has 8 positions. 


      int xDirection = directions[0, direction]; 
      int yDirection = directions[1, direction]; 

      //move inside the board forever 
      while(true) 
      { 
       while(ICanMoveTo(currentPosition.X + xDirection, currentPosition.Y + yDirection) 
       { 
       //keep moving on the same direction 
       currentPosition.X += xDirection; 
       currentPosition.Y += yDirection; 
       } 

       //if you can't move anymore in the same direction, then change 
       direction = GetYourRandomDirection(); 
       xDirection = directions[0, direction]; 
       yDirection = directions[1, direction]; 
      } 
     } 
+0

Très bonne idée, mais n'y a-t-il pas une solution plus simple que celle-ci? Donc, la balle se déplace tout d'abord en appuyant sur ESPACE, puis en déplaçant les directions au hasard après cela? :) –

+0

oui, si vous voulez passer au N (tout droit) alors vous devez définir par défaut la direction à 1, puis vous appuyez sur Espace, int direction = 1 => (pour obtenir tout le temps -1,0) alors vous pouvez passer aux autres – Zinov