netlib.narod.ru< Назад | Оглавление | Далее >

Ввод в игре

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

Использование игрового пульта Xbox 360

Когда вы создаете новый проект XNA типа Windows Game, метод Update класса Game1 уже содержит код для работы с пользовательским вводом.

// Позволяет выйти из игры
if (GamePad.GetState(PlayerIndex.One).Buttons.Back ==
                                     ButtonState.Pressed)
    this.Exit();

Этот код представляет класс GamePad: основную точку входа для получения пользовательского ввода с игрового пульта Xbox 360. Если вы исследуете свойства и методы GamePad, воспользовавшись Visual C# Express IntelliSense, то легко поймете, как использовать метод GetState для получения текущего состояния кнопок (структура Buttons), джойстиков (структура ThumbSticks), крестовины (структура DPad) и курков (структура Triggers). Также имеется свойство, информирующее вас о том, подключен ли пульт (IsConnected).

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

Давайте посмотрим, как можно использовать эту информацию для усовершенствования вашего примера.

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

// Меняем местоположение спрайта 2 используя левый джойстик
mySprite2.position.X +=
         GamePad.GetState(PlayerIndex.One).ThumbSticks.Left.X;
mySprite2.position.Y -=
         GamePad.GetState(PlayerIndex.One).ThumbSticks.Left.Y;

Рассмотрим операции, выполняемые в показанном коде: вы прибавляете свойство X левого джойстика к координате X спрайта и вычитаете свойство Y из соответствующей координаты спрайта. Если вы думаете, что это странно, вернитесь назад к разделу «Двухмерная и экранная системы координат» в этой главе: координата X увеличивается слева направо, а координата Y увеличивается сверху вниз. Свойства X и Y джойстика находятся в диапазоне от –1 до 1, в зависимости от того, как сильно вы нажали на джойстик вправо или вниз (положительные значения) или влево и вверх (отрицательные значения).

Сделать чтобы игровой пульт вибрировал, когда sprite1 сталкивается с sprite2 достаточно просто: измените код проверки столкновений в методе Update класса Game1 согласно следующему фрагменту:

if (mySprite1.Collides(mySprite2))
{
    mySprite1.velocity *= -1;
    GamePad.SetVibration(PlayerIndex.One, 1.0f, 1.0f);
}
else
    GamePad.SetVibration(PlayerIndex.One, 0f, 0f);

Теперь запустите программу и перемещайте спрайт с помощью пульта. Когда спрайты сталкиваются игровой пульт вибрирует.

СОВЕТ
Второй и третий аргументы метода SetVibration должны находиться в диапазоне от 0 до 1 и определяют скорость для левого (низкочастотного) и правого (высокочастотного) электромоторов. Вы можете включить в вашу программу код для создания различных типов вибрации в зависимости от игровых условий — например, в зависимости от того, левой или правой стороной сталкивается персонаж игрока.

Использование клавиатуры

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

KeyboardState keyboardState = Keyboard.GetState();

if (keyboardState.IsKeyDown(Keys.Up))
    mySprite2.position.Y -= 1;
if (keyboardState.IsKeyDown(Keys.Down))
    mySprite2.position.Y += 1;
if (keyboardState.IsKeyDown(Keys.Left))
    mySprite2.position.X -= 1;
if (keyboardState.IsKeyDown(Keys.Right))
    mySprite2.position.X += 1;

Использование мыши

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

if (mySprite2.position.X < Mouse.GetState().X)
    mySprite2.position.X += 1;
if (mySprite2.position.X > Mouse.GetState().X)
    mySprite2.position.X -= 1;
if (mySprite2.position.Y < Mouse.GetState().Y)
    mySprite2.position.Y += 1;
if (mySprite2.position.Y > Mouse.GetState().Y)
    mySprite2.position.Y -= 1;

netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz