2016-06-10 2 views
1

J'essaie de faire un simple jeu de pong et j'ai deux problèmes que j'ai rencontrés et que je n'arrive pas à comprendre.Monogame - jeu Pong - restreindre la zone de la souris

Pour le jeu de pong je veux que la pagaie du joueur reste à la moitié et au plus bas de Y, ce qui signifie qu'il peut déplacer la pagaie dans la moitié de la «hauteur».

J'ai réussi à faire arrêter la palette au milieu, mais elle disparaît après avoir frappé au milieu. Est-il possible de rester dans la moitié de l'axe Y sans disparaître?

Et l'autre problème est que la pagaie et la zone du joueur semblent être dans la moitié supérieure et non dans la moitié inférieure.

Game1.cs

using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Graphics; 
using Microsoft.Xna.Framework.Input; 
using System; 
using System.IO; 

namespace Xong 
{ 
    /// <summary> 
    /// This is the main type for your game. 
    /// </summary> 
    public class Game1 : Game 
    { 
     GraphicsDeviceManager graphics; 
     SpriteBatch spriteBatch; 
     Texture2D redPaddle, bluePaddle, ball, blueBall, greyBall, bg1, bg2, bg3, bg4, elementBlue, elementRed; 

     int BluePaddleX = 104; 
     int BluePaddleY = 22; 

     int RedPaddleX = 104; 
     int RedPaddleY = 22; 

     int BallX = 22; 
     int BallY = 22; 


     public Game1() 
     { 
      graphics = new GraphicsDeviceManager(this); 
      Content.RootDirectory = "Content"; 
     } 


     /// <summary> 
     /// Allows the game to perform any initialization it needs to before starting to run. 
     /// This is where it can query for any required services and load any non-graphic 
     /// related content. Calling base.Initialize will enumerate through any components 
     /// and initialize them as well. 
     /// </summary> 
     protected override void Initialize() 
     { 
      // TODO: Add your initialization logic here 

      base.Initialize(); 
     } 

     /// <summary> 
     /// LoadContent will be called once per game and is the place to load 
     /// all of your content. 
     /// </summary> 
     protected override void LoadContent() 
     { 
      // Create a new SpriteBatch, which can be used to draw textures. 
      spriteBatch = new SpriteBatch(graphics.GraphicsDevice); 

      redPaddle = Content.Load<Texture2D>("paddleRed.png"); 

      bluePaddle = Content.Load<Texture2D>("paddleBlu.png"); 

      blueBall = Content.Load<Texture2D>("ballBlue.png"); 

      greyBall = Content.Load<Texture2D>("ballGrey.png"); 

      elementBlue = Content.Load<Texture2D>("element_blue_square_glossy.png"); 

      elementRed = Content.Load<Texture2D>("element_red_square_glossy.png"); 


      bg1 = Content.Load<Texture2D>("set1_background.png"); 

      bg2 = Content.Load<Texture2D>("set2_background.png"); 

      bg3 = Content.Load<Texture2D>("set3_background.png"); 

      bg4 = Content.Load<Texture2D>("set4_background.png"); 




      // TODO: use this.Content to load your game content here 
     } 

     /// <summary> 
     /// UnloadContent will be called once per game and is the place to unload 
     /// game-specific content. 
     /// </summary> 
     protected override void UnloadContent() 
     { 
      // TODO: Unload any non ContentManager content here 
     } 

     /// <summary> 
     /// Allows the game to run logic such as updating the world, 
     /// checking for collisions, gathering input, and playing audio. 
     /// </summary> 
     /// <param name="gameTime">Provides a snapshot of timing values.</param> 
     protected override void Update(GameTime gameTime) 
     { 
      if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) 
       Exit(); 

      // TODO: Add your update logic here 

      base.Update(gameTime); 
     } 

     /// <summary> 
     /// This is called when the game should draw itself. 
     /// </summary> 
     /// <param name="gameTime">Provides a snapshot of timing values.</param> 
     protected override void Draw(GameTime gameTime) 
     { 
      GraphicsDevice.Clear(Color.CornflowerBlue); 
      spriteBatch.Begin(); 

      MouseState mouseState = Mouse.GetState(); 


      int ScreenX = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width; 
      int ScreenY = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height; 

      int PlayerBoundaryX = (ScreenX/2) - (BluePaddleX/2); 
      int PlayerBoundaryY = (ScreenY/2) - (BluePaddleY/2); 

      spriteBatch.Draw(bg1, new Rectangle(0, 0, ScreenX, ScreenY), Color.White); 
      spriteBatch.Draw(redPaddle, new Vector2(ScreenX, ScreenY), Color.White); 

      if ((mouseState.Y < (PlayerBoundaryY/2)) && (mouseState.Y > 0)) 
      { 
       spriteBatch.Draw(bluePaddle, new Vector2(mouseState.X, mouseState.Y), Color.White); 
      } 
      else 
      { 
       spriteBatch.Draw(bluePaddle, new Vector2(mouseState.X, PlayerBoundaryY), Color.White); 
      } 



      spriteBatch.Draw(greyBall, new Vector2(405, 240), Color.White); 
      spriteBatch.End(); 
      // TODO: Add your drawing code here 

      base.Draw(gameTime); 
     } 





    } 
} 

enter image description here

+0

Je ne vois pas le code de votre souris, mais vous devez surveiller le mouvement de la souris. Si elles le déplacent en dehors de la plage que vous souhaitez restreindre, forcez-le dans la mesure de la limite. Par exemple, si vous voulez que le maximum soit 100 et qu'ils passent à 200, limitez la position de la souris à 100. – Frecklefoot

+0

@Frecklefoot Le code de la souris est celui-ci: if ((mouseState.Y <(PlayerBoundaryY/2)) && (mouseState .Y> 0)) { spriteBatch.Draw (bluePaddle, nouveau Vector2 (mouseState.X, mouseState.Y), Color.White); } sinon { spriteBatch.Draw (bluePaddle, nouveau Vector2 (mouseState.X, PlayerBoundaryY), Color.White); } – Brian

+0

Pourquoi vérifie-t-on le PlayerBoundaryY divisé par 2? Vous avez mentionné que la palette apparaît dans la moitié supérieure et non dans la moitié inférieure. Cela a probablement quelque chose à voir avec ça. – Frecklefoot

Répondre

0

Vous avez probablement besoin d'utiliser la méthode Mouse.SetPosition pour pousser le curseur sur votre rectangle désiré.

Je recommande également d'implémenter votre propre "souris de style FPS virtuelle" (chaque fois que vous obtenez les coordonnées relatives de la souris et de repousser le curseur de la souris au centre de la fenêtre). C'est souvent un bon choix si vous avez des limitations de mouvement pour le curseur.

+0

Aussi je suppose que vous créez Pong comme un exercice personnel, donc l'implémentation de votre propre souris virtuelle est un ajout intéressant =) Btw Je suis venu à ce problème exactement comme vous: J'ai créé Pong et nécessaire pour restreindre le mouvement de la souris . –