Движение мыши XNA - PullRequest
       20

Движение мыши XNA

0 голосов
/ 08 августа 2011

Я уже делал несколько игр в XNA и собираюсь начать новый проект. Одна вещь, которую я хотел бы сделать - это движение мыши.

Просто чтобы уточнить (поскольку я видел, что некоторые подобные вопросы приводят к путанице), я хочу получить движение мыши. Не положение курсора или изменение положения от одного кадра к следующему. Я просто хотел бы данные о том, как мышь была перемещена.

В моей предыдущей игре я просто сбросил (скрытый) курсор на середину области просмотра и посмотрел на изменение положения. Однако это кажется немного обманом и приводит к некоторым грязным вычислениям в моем коде.

Так есть ли способ вернуть движение мыши в программу?

Спасибо, Matt

Edit:

В ответ на первый комментарий. Положение курсора, к которому я обращаюсь в этом случае, является положением на экране указателя мыши. Движение мыши, к которому я обращаюсь, - это физическое движение мыши.

Кажется, что в XNA слово "мышь" является синонимом указателя (или курсора).

Проблема, с которой я столкнулся, заключается в том, что, несмотря на перемещение мыши влево, я не могу получить это движение в программе, поскольку курсор находится на краю экрана.

Ответы [ 3 ]

3 голосов
/ 08 августа 2011

Класс MouseState включает, помимо прочего, только положение курсора мыши.Эта позиция, как вы упомянули, обрезает края экрана.Невозможно определить, перемещал ли пользователь мышь, кроме как через класс MouseState.В частности, отсутствует свойство MouseDirection, MouseTangent или MouseAngle, которое указывает, в каком направлении была перемещена мышь.

В качестве временного решения можно вызвать SetPosition , чтобы навести курсор на серединуэкран, так что вы всегда можете узнать, в каком направлении движется мышь.Фактически, SetPosition даже рекомендует такой подход:

При использовании этого метода для получения относительного ввода, такого как в игре от первого лица, устанавливайте положение мыши в центре окна игры каждыйРамка.Это позволит вам читать движение мыши по обеим осям с наибольшей степенью детализации.

0 голосов
/ 11 августа 2011

Если вы хотите фактическое движение мыши, вы можете просто создать массив или список последних движений мыши, которые сбрасываются при данном событии, например.elapsedtime > 1f или IsMouseReleased.это будет выглядеть примерно так:

List<Vector2> Movement = new List<Vector2>();    

public override void Update(GameTime gameTime)
{
    MouseState pms;
    MouseState ms = Mouse.GetState();

    pms = ms;

    Movement.Add(pms.X - ms.X, pms.Y - ms.Y);

    if(ms.LeftButton == ButtonState.Released){ Movement.Clear(); }

    base.Update(gameTime);
}
0 голосов
/ 08 августа 2011

Мое понимание XNA очень ограничено, так как разработка игр не является моей основной линией разработки.

С учетом сказанного, для того, что я понимаю относительно поведения XNA, вам действительно нужно рассчитать изменение положения между кадрами, чтобы увидеть, насколько сильно двигалась мышь.

С изменением координаты X-Y вы можете получать все виды данных на основе этой простой меры.

...