2016-06-10 6 views
1

나는 단순한 탁구 게임을 만들려고 노력하고 있는데, 나는 마주 쳤고 알아낼 수없는 두 가지 문제가 있습니다.Monogame - Pong game - 마우스 영역 제한

탁구 경기에서 나는 선수의 외륜이 Y의 절반 이하로 남아 있기를 원합니다. 즉 그는 '피치'의 절반 이내에 외륜을 움직일 수 있습니다.

나는 중앙에서 패들을 멈출 수 있었지만, 중간에 타격을 가하면 dsappearing했다. 사라지는 일없이 Y 축의 절반 이내에 유지하는 것이 가능합니까?

다른 문제는 플레이어의 외륜과 영역이 아래쪽 절반이 아니라 상단 절반에있는 것처럼 보입니다.

은 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

마우스 코드가 표시되지 않지만 마우스의 움직임을 모니터링해야합니다. 그들이 그것을 제한하고자하는 범위 밖으로 움직이면, 경계의 범위까지 강요하십시오. 예를 들어 최대 값을 100으로 지정하고 200으로 이동하려면 마우스 위치를 100으로 제한하십시오. – Frecklefoot

+0

@Frecklefoot 마우스 코드는 다음과 같습니다. 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); } – Brian

+0

PlayerBoundaryY를 2로 나눈 값을 확인하는 이유는 무엇입니까? 당신은 외륜이 하반부가 아니라 상반부에 나타나는 것을 언급했습니다. 아마 그것과 관련이 있습니다. – Frecklefoot

답변

0

당신은 아마 원하는 사각형에 커서를 뒤로 밀어 Mouse.SetPosition 방법을 사용해야합니다.

또한 일반적인 마우스 클래스 위에 자신의 "가상 FPS 스타일 마우스"(각각의 진드기는 상대적인 마우스 좌표를 가져 와서 실제 마우스 커서를 창 가운데로 밀어 넣는 것이 좋습니다)를 구현하는 것이 좋습니다. 커서에 대한 이동 제한 사항이있는 경우에는 종종 좋은 선택입니다.

+0

또한 Pong을 개인 운동으로 만드는 것 같아서 가상 마우스를 구현하는 것도 좋은 방법입니다. Btw 나는이 문제를 정확히 수행했습니다. 나는 Pong을 만들고 마우스 움직임을 제한해야했습니다. . –