Быть может кто-то из Вас знает игру Sims, к какому жанру она относиться? Жизненная симуляция, ролевая игра, там можно и дома строить..... |
Устройства ввода, перемещение объектов
Обработка состояния мыши
Создадим новый стандартный игровой проект (P3_2), модифицируем его таким образом, чтобы он соответствовал коду, приведенному в листинге 7.1. – то есть – подготовим все для рассмотрения концепций работы с мышью. Теперь добавим в код метода Update() такой код (листинг 7.3.).
MouseState mState = Mouse.GetState(); position.X = mState.X; position.Y = mState.Y;Листинг 7.3. Код, реализующий чтение состояния мыши и перемещение объекта
Для начала мы создали переменную mState типа MouseState – она хранит состояние мыши, полученное с помощью метода GetState() объекта Mouse. Теперь мы приравниваем координату X позиции спрайта текущей координате X мыши, то же самое делаем с координатой Y.
Запустив на выполнение данный пример, можно заметить, что спрайт перемещается в соответствии с перемещениями мыши, при выходе указателя мыши за пределы игрового окна, спрайт так же "уходит" с экрана. Ниже мы рассмотрим пример, показывающий, как избежать такого "ухода".
Состояние мыши, помимо еe координат, содержит и другую информацию. В частности – данные о нажатии клавиш, о состоянии колeсика прокрутки. Создадим пример, который демонстрирует перемещение спрайта к позиции игрового окна, в которой мы щелкнули мышью.
Создадим новый стандартный игровой проект (P3_3), код которого аналогичен листингу 7.1.
Добавим в раздел объявления переменных класса две переменных (листинг 7.4.).
bool is_MouseLB_Pressed = false; Vector2 new_position = new Vector2();Листинг 7.4. Переменные для определения факта нажатия на левую кнопку мыши и позиции, в которой было совершено нажатие
Первую переменную – is_MouseLB_Pressed будем устанавливать в True при нажатии на левую кнопку мыши, в переменную new_position будем записывать координаты, в которых произошло нажатие.
Добавим в метод Initialise() класса Game1 код, который отобразит указатель мыши в игровом окне. По умолчанию при перемещении мыши в пределы игрового окна указатель исчезает. Код, приведенный в листинге 7.5. позволяет отобразить указатель.
protected override void Initialize() { base.Initialize(); this.IsMouseVisible = true; }Листинг 7.5. Код для отображения указателя мыши в игровом окне
Здесь объект this представляет собой текущий игровой объект. Его свойство IsMouseVisible при установке в True включает отображение указателя в игровом окне.
Теперь дополним метод Update() так, как показано в коде, приведенном в листинге 7.6.
protected override void Update(GameTime gameTime) { // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); MouseState mState = Mouse.GetState(); if (mState.LeftButton ==ButtonState .Pressed) { is_MouseLB_Pressed = true; new_position.X = mState.X; new_position .Y = mState .Y; } if (is_MouseLB_Pressed) { if (new_position .X -position .X >0) { position .X +=1; } else { position .X-=1; } if (new_position .Y-position .Y>0) { position .Y+=1; } else { position .Y -=1; } if (position == new_position) { is_MouseLB_Pressed = false; } } }Листинг 7.6. Код метода Update для автоматического перемещения объекта к месту щелчка левой кнопки мыши
Сначала мы получаем текущее состояние мыши и сохраняем его в переменной mState. Далее проверяем, была ли нажата левая кнопка мыши. Для этого используем свойство mState.LeftButton и проверяем его равенство ButtonState.Pressed. Если равенство выполняется – устанавливаем переменную is_MouseLB_Pressed в True и записываем в переменную new_Position значения координат мыши в момент нажатия левой кнопки.
Далее, если переменная is_MouseLB_Pressed установлена в True, сравниваем текущую позицию объекта и позицию, в которой мы щелкнули левой кнопкой. Если разность координаты X новой и текущей позиций больше нуля, это значит, что объект расположен левее новой позиции и для перемещения к ней его координата X должна быть увеличена. Если разность меньше нуля – объект находится правее, его координата X будет уменьшена. Точно так же сравниваем координаты Y и модифицируем их. В конце мы проверяем, достиг ли объект заданной позиции. Если да – устанавливаем is_MouseLB_Pressed в False – это значит, что на следующем шаге цикла Update() мы не будем модифицировать координаты – объект достиг заданной позиции.
При запуске программы объект неподвижен. Если мы щелкнем мышью в игровом окне – он начнет перемещаться в позицию щелчка. Если объект уже двигается по направлению к позиции, в которой мы щелкнули мышью, а мы в это время щелкаем мышью в новой позиции – он меняет направление движения и движется к новой позиции.
Здесь реализован простой пример автоматического перемещения объекта.
Как упоминалось выше, подход с размещением кода перемещения игрового объекта в основном коде программы неудобен при разработке реальных проектов. Поэтому ниже мы рассмотрим пример разработки самостоятельного игрового объекта, содержащего собственный код, отвечающий за его перемещение. Здесь же мы реализуем проверку на допустимость следующего шага перемещения.