C # XNA Положение мыши - PullRequest
       8

C # XNA Положение мыши

5 голосов
/ 27 октября 2011

У меня есть некоторые проблемы с моими координатами мыши в XNA - 0x0 произвольно находится рядом (но не в) с верхним левым углом моего экрана.

Я сейчас запускаю игру в оконном режиме, но координаты основаны на экране, а не на окне игры (хотя документация XNA говорит мне, что должно быть иначе)

Заранее спасибо!

Вот код:

namespace TheGame
{
   class Mousey
   {
      static public Vector2 pos;
      static private Texture2D tex;
      static public MouseState mouseState;
      static public MouseState previousState;

      //static public Mousey()
      //{
      //}

      static public void Update()
      {
         previousState = mouseState;
         mouseState = Mouse.GetState(); //Needed to find the most current mouse states.
         pos.X = mouseState.X; //Change x pos to mouseX
         pos.Y = mouseState.Y; //Change y pos to mouseY
      }

      //Drawing function to be called in the main Draw function.
      static public void LoadContent(ContentManager thecontent)
      {
         tex = thecontent.Load<Texture2D>("mousey");
      }

      static public void Draw(SpriteBatch batch) //SpriteBatch to use.
      {
         batch.Draw(tex, pos, Color.White); //Draw it using the batch.
      }

      static public bool LBP()
      {
          if (mouseState.LeftButton == ButtonState.Pressed && previousState.LeftButton ==                      ButtonState.Released)
          {
              return true; 
          }
          else 
          { 
              return false; 
          }
      }   
   }
}

Ответы [ 4 ]

4 голосов
/ 22 апреля 2012

В game.cs:

//sets the windows mouse handle to client bounds handle

Mouse.WindowHandle = Window.Handle;
3 голосов
/ 22 октября 2012
private IntPtr intPtr;

    public MouseControle(int w, int h, IntPtr intPtr)
    {
        screenwidth = w;
        screenheight = h;
        this.intPtr = intPtr;
        Mouse.WindowHandle = intPtr;
    }

Это работает для меня;)

Чтобы использовать это, я добавляю это к своему игровому компоненту, используя этот класс:

mouse = new MouseControle(((Game1)Game).setscreen.width, 
((Game1)Game).setscreen.height, 
((Game1)Game).Window.Handle);

Надеюсь, это поможет sombody: D

1 голос
/ 27 октября 2011

Вы пробовали что-нибудь попроще, как это?

protected override void Draw( GameTime gameTime )
{
    graphics.GraphicsDevice.Clear( Color.CornflowerBlue );

    base.Draw( gameTime );

    MouseState current_mouse = Mouse.GetState();
    Vector2 pos = new Vector2(current_mouse.X, current_mouse.Y);

    batch.Draw(tex, pos, Color.White);
}

Может быть некоторое время между прорисовкой и обновлением, из-за того, как работает синхронизация в XNA, возможно, это причина воспринимаемого смещения пикселя?

И ... вы уверены, что правильно "настроили" свой спрайт?Координаты относятся к окну игры, поэтому в документации сказано:

Еще одна вещь: почему вы используете статические поля?Мне действительно не нравится этот выбор, анти-шаблон.Используйте поля класса, а не статические поля.

Также ... я думаю, вы рисуете значок мыши, верно?Предположим, что XNA начинает рисовать текстуру из указанной точки. Вы уверены, что текстура имеет правильную форму с левой верхней точкой в ​​качестве конца стрелки мыши?

Я нашел хороший пример, который вам может понравиться: http://azerdark.wordpress.com/2009/07/08/displaying-cursor-xna/

Учтите также, что вы можете включать и отключать обычный курсор мыши в ОС Windows с помощью IsMouseVisible = true;

0 голосов
/ 27 октября 2011

Ваш вызов отрисовки вообще не компенсирует текстуру. Если часть «указателя» вашего изображения не находится в позиции 0,0 (вверху слева) вашей текстуры, позиционирование будет казаться отключенным.

Добавьте Console.WriteLine(pos); к своему обновлению, чтобы увидеть позицию, к которой оно рисует. Не забудьте удалить это после отладки, потому что writeline убьет вашу производительность.

Попробуйте один из перегруженных вызовов SpriteBatch.Draw (), который учитывает «источник», который позволяет вам решить, какая точка текстуры должна быть нарисована в этой позиции. В следующем коде настройте Vector 2 в зависимости от того, как нарисована ваша текстура.

batch.Draw(tex, pos, null, Color.White, 0.0f, new Vector2(10, 10), SpriteEffects.None, 0.0f);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...