Rambler's Top100
  Навигация :
  Оглавление
  Новости (Архив)
  Об этом проекте
  О программе GM
  Скачать
  Документация
  Русский Help
  Обучение
 
Примеры
  Ресурсы
  Ссылки
  Прямая связь
  Статьи:
  Platform
  Platform v4.2
  Maze    
  Статистика :



Как научить компьютерного персонажа стрелять?


Автор © 2001 Chronic
Перевод и адаптация © 2002 Игорь Князев

Содержание урока:

1. Введение;
2. Стрельба в одном направлении;
3. Использование переменной для стрельбы в разных направлениях;
4. Создание паузы между выстрелами;
5. Уничтожение пули, когда она пропадает из вида.

ВВЕДЕНИЕ

Вопрос "Как научить компьютерного персонажа стрелять?" часто задается на различных форумах! Данный урок предназначен именно для тех кто еще не знает как это делается или тех, кому нужна дополнительная информация.

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

Если Ваши пули должны на протяжении всей игры перемещаться только в одном направлении, например как в играх стиля "Space Invader", тогда все достаточно просто, но вот когда встает вопрос о перемещении пуль в различых направлениях - тогда реализация данной системы несколько усложняется.

Направление движения любого объекта расчитывается по сторонам света (для примера можно использовать компас). В дальнейшем рекомендуем использовать предлогаемую схему при выборе направления полета ваших пуль (снарядов).

Перед тем как приступить непосредственно к прочтению и реализации урока, предлогаем Вам запустить Game Maker (мы используем версию 4.2a) и создать все необходимое, а именно:

  • Добавить спрайт главного игрового персонажа;
  • Добавить спрайт пули;
  • Создать объект главного игрового персонажа;
  • Создать объект пули;
  • Создать комнату и добавить в нее объект главного игрового персонажа.


  • Все это рекомендуем сделать заблаговременно, чтобы потом уже не отвлекаться на подобные 'мелочи'.

    СТРЕЛЬБА В ОДНОМ НАПРАВЛЕНИИ

    В самом начале урока (в соответствии с компасом) выбираем направление для полета нашей пули.

    В событии CREATE объекта вашей пули поместим действие 'Set direction and speed of motion' - это такая иконка (с синими стрелками, торчащими в разные стороны) и затем укажем желаемое направление полета пули, введя соответствующую цифру в окошке 'direction', после чего укажем скорость с которой наша пуля должна перемещаться - введя соответствующую цифру в поле 'speed', в окошке RELATIVE галочку ставить не нужно.

    Теперь в объекте главного игрового персонажа в событии выстрела (в нашем случае это клавиша 'Space') поместим действие 'Create an instance of an object' - иконка (светящаяся лампочка) которая находится во вкладке OBJECTS - выбираем спрайт пули и устанавливаем координаты создания пули X=0, Y=0 при этом пуля будет создана в верхнем левом углу комнаты. Чтобы образец пули был создан рядом со спрайтом главного героя необходимо в поле RELATIVE поставить галочку, если Вы забыли ее поставить, то вернитетесь и сделайте это.

    Теперь, запустим нашу игру и проверим что получилось - выстрелив (при нажатии клавиши "Space") мы видим что пуля создается в верхнем левом углу, относительно спрайта нашего главного героя (это произойдет если размер спрайта пули отличается от размера спрайта игрового персонажа), после чего она летит в установленном направлении.

    Для того чтобы исправить это недоразумение, мы должны подправить X и Y координаты в действии 'Create an instance of an object'.

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

    Пример:

    Если Ваш игровой персонаж всегда смотрит лицом вперед и стреляет вверх/вниз, габариты спрайта игрового персонажа - 20, а ширина спрайта пули - 6, то разделите пополам ширину спрайта игрового персонажа, чтобы вычислить его центр, в нашем случае это 10, а половина ширины пули - 3. Далее из половины ширины спрайта главного героя вычитаем половину ширины пули 10-3=7, затем изменяем значение координаты X на 7 чтобы отцентровать выстрел пули..., при этом по оси Y наша пуля все еще продолжает накладываться на изображение героя, чтобы исправить и это недоразумение нам снова нужно вычислить высоту спрайта пули и затем установить для оси Y отричательное значение высоты спрайта пули, у нас должна получиться слудующая расстановка...

      X = 7  Y = -6

    Теперь пуля должна быть создана правильно без смещений.

    ИСПОЛЬЗОВАНИЕ ПЕРЕМЕННОЙ ДЛЯ СТРЕЛЬБЫ В РАЗНЫХ НАПРАВЛЕНИЯХ

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

    IMAGE_SINGLE - команда, которая в спрайте состоящем из нескольких изображений (фреймов), использует фрейм с определенным индексом.

    Создаем спрайт для главного игрового персонажа в котором он расположен (смотрит) во всех 4 направлениях (вверх, вниз, влево и направо).

    ОБРАТИТЕ ВНИМАНИЕ: Если Вы хотите чтобы Ваш игровой персонаж был анимированный, тогда придется использовать 4 мульти-фреймных (анимированных) спрайта, вместо одного спрайта с 4 персонажами развернутыми (смотрящими) в разные стороны. Рассматриваемая ниже методика не будет работать, при использовании более чем одного спрайта.

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

    В событиях для клавиш направлений нашего игрового персонажа (для каждой клавиши) добавляем иконку 'X=2' которая находится в списке действий во вложении CODE и помещаем в поле 'variable' переменную 'image_single', значение (new value) будет различное в зависимости от выбранной клавиши...
      Клавиша | Значение
      ------------------------------
      UP          |  0
      RIGHT    |  1
      DOWN    |  2
      LEFT      |  3
    Как и раньше в событии выстрела (клавиша 'Space') добавляем действие 'Create instance' (светящаяся лампочка).

    Теперь в событии CREATE объекта пули нужно поместить приведенный ниже сценарий, копируем весь текст находящийся между словами --- врезка ---
      ------------------------------ врезка -----------------------------
      {
      if (player.image_single = 0)
      {
      x = player.x+player.sprite_width/2-[ПШП];
      y = player.y-[ВП];
      direction = 90;
      }
      if (player.image_single = 1)
      {
      x = player.x+player.sprite_width;
      y = player.y+player.sprite_height/2-[ПВП];
      direction = 0;
      }
      if (player.image_single = 2)
      {
      x = player.x+player.sprite_width/2-[ПШП];
      y = y+player.sprite_height;
      direction = 270;
      }
      if (player.image_single = 3)
      {
      x = player.x-[ШП];
      y = player.y+player.sprite_height/2-[ПВП];
      direction = 180;
      }
      speed = 2
      }

      ---------------------------- врезка ---------------------------
    В данном коде необходимо внести некоторые изменения, а именно в позиции [], для этого воспользуемся обозначениями указанными ниже...

      [ШП] = Ширина Пули
      [ВП] = Высота Пули
      [ПШП] = Половина Ширины пули
      [ПВП] = Половина Высоты Пули

    Когда Вы будете добавлять ваши значения, НЕ используйте скобки [], только указывайте цифру.

    Теперь давайте более подробно рассмотрим небольшой фрагмент сценария...
      if (player.image_single=0)
      {
      x = player.x+player.sprite_width/2-[ПШП];
      y = player.y-[ВП];
      direction=90;
      }
    Взглянем на первую строку сценария, эта часть проверяет условие истинности (TRUE), в данной строке проверяется является ли переменная image_single объекта player равной 0, если проверяемая часть равна (equal) 0, в таком случае сее означает что выражение ИСТИННО и тогда выполняется сценарий заключенный в круглые {} скобки, если проверяемое выражение не истинно, то данный кусок кода пропускается и проверяется следующую его часть.

    Предположим что рассмотренная часть истинна и проверяем следующую часть сценария заключенного в круглые {} скобки.
      x = player.x+player.sprite_width/2-[ПШП];
      y = player.y-[ВП];
      direction = 90;
    Первая строка кода изменяет ось Х объекта player, исполняемый код является не очень комплексным уравнением, зато позволяет получить более близкие значения...

    ОБРАТИТЕ ВНИМАНИЕ: я заменил [ПШП] значением половины ширины пули
      player.x+player.sprite_width/2-3;
    "player.x"                       - Возвращает значение оси Х для объекта player
    "player.sprite_width/2-3" - Возвращает ширину спрайта для объекта главного
                                             героя, затем делит её на 2, после чего вычитает 3.

    ОК с первой строкой разобрались..., теперь давайте рассмотрим следующее уравнение...

    ОБРАТИТЕ ВНИМАНИЕ: я заменил [ВП] значением высоты пули
      y = player.y-6;
    "player.y-6" - Возвращает значение оси Y для объекта player после чего                      вычитаем 6.

    Причина по которой мы использовали переменные подобные player.x связаны с тем, что мы не можем использовать фиксированное число, так как ось X и Y игрового персонажа изменяется, когда главный герой перемещается по комнате/уровню. Если бы мы использовали фиксированные числа подобно указанным ниже...
      x = 100+12-3;
      y = 100-6;
    это сделало бы ось X и Y пули (потому что объект запускается из сценария) всегда равной 'X=103 и Y=94 ' (значение уравнений).

    Оставшиеся части изучаемого сценария несколько отличаются друг от друга, но тем не менее все они используют одни и те же 'правила поведения', а последняя строка сценария "speed=2" устанавливает скорость, с которой наша пуля перемещается, увеличивая данное значение мы увеличим скорость.

    СОЗДАНИЕ ПАУЗЫ МЕЖДУ ВЫСТРЕЛАМИ

    Оба примера в данном уроке вызывают эффект 'быстрого огня', но это можно исправить, используя СИГНАЛЬНОЕ событие и изменив действие в клавише 'огня' на данный сценарий.
      ---------------------- врезка ---------------------
      {
      if (canshoot=1)
      {
      instance_create(x, y, bullet);
      alarm[0]=room_speed/2;
      canshoot=0;
      }
      }

      --------------------- врезка -----------------------
    Данный сценарий проверяет, является ли переменная canshoot=1 и если данное равенство ИСТИННО, то в объекте главного героя в его позиции по оси X, Y, создается пуля, устанавливая ALARM 0 в половину скорости комнаты, изменяя затем переменную canshoot на 0. Это означает, что когда Вы нажимаете клавишу огонь в следующий раз, то пуля создана не будет, так как при проверке будет возвращено значение ЛОЖНО, в связи с тем что значение canshoot не равно 1.

    Для этого в событии ALARM 0 объекта главного героя помещаем иконку действия X=2 со следующими установками...
      variable = canshoot
      new value = 1
    Вместо указания числа, при установке значения для ALARM 0 в коде для клавиши 'огня', мы используем значение 'room_speed/2', при этом пуля будет создаваться каждые пол секунды, потому что значение room_speed всегда равно 1 секунде реального времени. Используя такую вещь как значение скорости комнаты, мы добиваемся эффекта создания промежутков между появлением каждой последующей пули.

    В заключении мы должны присвоить для переменной canshoot стартовое значение, иначе при использовании вышеприведенного сценария мы получим ошибку, для этого в событии CREATE объекта игрового персонажа добавляем действие X=2 с такими же установками, какие мы использовали в событии ALARM 0.

    УНИЧТОЖЕНИЕ ПУЛИ, КОГДА ОНА ПРОПАДАЕТ ИЗ ВИДА

    Единственную вещь которую не стоит забыть выполнить, это уничтожить пули улетающие за границы комнаты. Это очень просто сделать - используя действие 'Destroy the instance' (иконка с мусорным баком), поместив ее в событии OUTSIDE бъекта пули.


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



    Любые предложения или вопросы по данной теме Вы всегда можете направить по адресу gamemaker [at] e1.ru с обязательным указанием темы.

    Если же у вас появится желание предложить на всеобщее обозрение свои уроки или просто интересную информацию по созданию игр при помощи GameMaker, то милости просим, присылайте свои работы на наш E-Mail, с указанием темы 'Tutorial' или непосредственным указанием на предмет урока. Мы обязательно опубликуем вашу работу на нашем сайте с обязательным указанием автора!

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


    [ Вернуться в основной раздел ]

    © 2002 Simple Life & World

    Смотрите кофе растворимый на развес у нас на сайте.