Rambler's Top100
  Навигация :
  Оглавление
  Новости (Архив)
  Об этом проекте
  О программе GM
  Скачать
  Документация
  Русский Help
  Обучение
  Примеры
  Ресурсы
  Ссылки
  Прямая связь
 Русский Help 4.0 :
  Раздел 1
  Раздел 2
  Раздел 3
  Раздел 4
  Статистика :
Рейтинг@Mail.ru


The Game Maker Language

Игровой процесс

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

Перемещение (Moving around)

Очевидно, что важным аспектом игры является перемещение по игровому миру образцов объекта. Каждый образец имеет две встроенных переменных x и y, которые указывают местоположение образца. (Если быть точным, они указывают место c началом координат, где помещен спрайт. Позиция (0,0) - верхний левый угол комнаты. Ты можешь изменять позицию образца, изменяя его x и y переменные. Если ты хочешь, чтобы объект выполнял сложные перемещения, то данный способ вполне подходит. Ты обычно помещаешь данный код в событие шага (step event) для объекта.

Если объект двигается с постоянной скоростью и направлением, то существует более простой способ сделать это. Каждый образец объекта имеет горизонтальную скорость (hspeed) и вертикальную скорость (vspeed). Обе эти переменные обозначаются в пикселах на шаг. Положительная горизонтальная скорость означает движение направо, отрицательная горизонтальная скорость означает движение налево. Положительная вертикальная скорость - вниз и отрицательная вертикальная скорость - вверх. Таким образом ты должен установить эти переменные только единажды (например в событии создания) определив образцу объекта постоянное движение.

Доступно несколько различных способов для определения движения: использование направления (в градусах 0-359), и скорости (должна быть не-отрицателеной). Ты можешь устанавливать и читать данные переменные, чтобы определить произвольное движение. (Внутренне они изменяются в значениях для hspeed и vspeed). Также имеется трение (friction) и гравитация (gravity) и направление гравитации (gravity direction). Наконец, существует функция motion_add(dir,speed) для добавления движение к текущему.

И так суммируем полученные данные - каждый образец имеет следующие переменные и функции:
    x - Его x-позиция.
    y - Его y-позиция.
    xprevious - Его предыдущая x-позиция.
    yprevious - Его предыдущая y-позиция.
    xstart - Его стартовая x-позиция в комнате.
    ystart - Его стартовая y-позиция в комнате.
    hspeed - Горизонтальная составляющая скорости.
    vspeed - Вертикальная состовляющая скорости.
    direction - Его текущее направление (0-360, против часовой стрелки, 0 = направо).
    speed - Его текущая скорость (пикселей на шаг).
    friction - Текущее трение (пикселей на шаг).
    gravity - Текущее значение гравитации (пикселей на шаг).
    gravity_direction - Направление гравитации (270 - вниз).
    motion_set(dir,speed) - Устанавка движения с заданной скоростью (speed) в направлении dir.
    motion_add(dir,speed) - Добавить движение к текущему движению (как векторное добавление).
Существует большое количество доступных функций, которые помогут тебе определить нужное движений:
    place_free(x,y) - Возвращение, если образец помещенный в позицию (x, y) свободен от столкновений (collision-free). Обычно используется как проверка перед фактическим перемещением в новую позицию.
    place_empty(x,y) - Возвращение, если образец, помещенный в позицию (x, y) никого не встречает. Эта функция берет во внимание также не-твердые образцы.
    place_meeting(x,y,obj) - Возвращение, если образец, помещенный в позицию (x, y) встречает obj. Obj может быть объект в котором функция возвращает значение истинно (true) - встречается образец того объекта. Это может также быть идентификатор образца, специальное слово all означающее образец любого объекта, или специального слова other.
    place_snapped(hsnap,vsnap) - Возвращение, если образец выровнен со значениями сетки.

    move_random(hsnap,vsnap) - Перемещает образец в свободную случайную, фиксированную позицию, подобно соответствующему действию.
    move_snap(hsnap,vsnap) - Фиксирует образец, подобно соответствующему действию.
    move_towards_point(x,y,sp) - Перемещает образцы со скоростью sp в позицию (x, y).
    move_bounce_solid(adv) - Рекошет от твердых образцов, подобно соответствующему действию. adv указывает, использовать ли усовершенствованый рекошет (advance bounce), во внимание также берутся наклонные стены.
    move_bounce_all(adv) - Рекошет от всех образцов, а не только от твердых (solid).
    move_contact(dir) - Перемещает образец в направлении, пока не достигнута контактная позиция. Если в текущей позиции не имеется никакого столкновения, образец помещается непосредственно перед тем, как столкновение произойдет. Если столкновение уже имеется, образец перемещается в первую позицию, где больше не имеется никакого столкновения.

    distance_to_point(x,y) - Возвращает расстояние ограничивающего поля текущего образца к (x, y).
    distance_to_object(obj) - Возвращает расстояние образца к самому близкому образцу объекта (obj).

    position_empty(x,y) - Возвращение, если ничего не находится в позиции (x, y).
    position_meeting(x,y,obj) - Возвращения, если в позиции (x, y) имеется образец obj. Obj может быть объект, идентификатор образца, или ключевые слова self, other, или all.

Образцы (Instances)

Основными модулями (юнитами) в игре являются образцы различных объектов. В течение игрового процесса ты можешь изменять различные аспекты этих образцов. Также ты можешь создавать новые и уничтожать имеющиеся образцы. Помимо переменных связанных с перемещением, рассмотренных выше и переменных связанных с рисованием, обсуждаемых ниже, каждый образец имеют следующие переменные:
    object_index* - Индекс объекта этого образца. Не может быть изменен.
    id* - Уникальный идентификатор для образца (>=100000). (Обрати внимание, что при определении комнат идентификатор образца под мышью всегда указывается). mask_index - Индекс спрайта, используется как маска для столкновений. Присвой ему значение -1, чтобы сделать его тем же самым что и sprite_index.
    solid - Является ли образец твердым. Может быть изменено в течении игры.
    persistent - Является ли образец постоянным и вновь появляется при перемещении в другую комнату. Ты часто захочешь включить (persistent) в некоторые моменты. (Например, если ты возвращаешся в первую комнату).
Существует одна проблема когда имеешь дело с образцами. Не очень просто идентифицировать индивидуальные образцы. Они не имеют название. Когда имеется только один образец специфического объекта, ты можешь использовать название объекта, но иначе ты должен получить идентификатор образца. Это - уникальный идентификатор для образца. Ты можешь использовать его в инструкциях и как идентификатор объекта. К счастью существует множество переменных и подпрограмм, которые помогут тебе расположить идентификатор образца.
    instance_number* - Число образцов, в настоящее время существующих в комнате.
    instance_id[0..n-1]* - идентификатор специфического образца. Где n - номер образца.
Давай рассмотрим простенький пример. Предположим, что каждый модуль в твоей игре имеет специфическое здоровье (health) и ты хочешь расположить самое максимальное, ты можешь использовать следующий код:
    {
       maxid = -1;
       maxhealth = 0;
       for (i=0; i<instance_number; i+=1)
       {
         iii = instance_id[i];
         if (iii.object_index == unit)
         {
             if (iii.health > maxhealth)
             {maxid = iii; maxhealth = iii.health;}
         }
       }
    }
После этого, цикл maxid будет содержать идентификатор модуля с максимальным здоровьем. (Образцы в течение такого цикла не уничтожаются, потому что они будут автоматически удалены из массива и в результате ты запустишь пропуск образцов).
    instance_find(obj,n) - Возвращает идентификатор (n+1)'го образца типа obj. Obj может быть объект или ключевое слово all. Если он не существует, специальный объект не возвращается.
    instance_exists(obj) - Возвращает если существует образец типа obj exists. Obj может быть объект, идентификатор образца, или ключевое слово all.
    instance_number(obj) - Возвращает число образцов типа obj. Obj может быть объект или ключевое слово all.
    instance_position(x,y,obj) - Возвращает идентификатор образца типа obj в позиции (x, y). Когда в данной позиции несколько образцов - возвращается первый. Obj может быть объект или ключевое слово all. Если его не существует, специальный объект не возвращается.
    instance_nearest(x,y,obj) - Возвращает идентификатор образца типа obj (nearest) самый близкий к (x, y). Obj может быть объект или ключевое слово all.
    instance_furthest(x,y,obj) - Возвращает идентификатор образца типа obj (furthest) самый дальний от (x, y). Obj может быть объект или ключевое слово all.
    instance_place(x,y,obj) - Возвращает идентификатор образца типа obj встречаемый, когда текущий образец помещен в позицию (x, y). Obj может быть объект или ключевое слово all. Если его не существует, специальный объект не возвращается.
Следующие функции могут использоваться для создания и уничтожения образцов.
    instance_create(x,y,obj) - Создает образец obj в позиции (x, y). Функция возвращает идентификатор (id) нового образца.
    instance_destroy() - Уничтожает текущий образец.
    instance_change(obj,perf) - Изменяет образец в obj. Perf указывает, исполнить ли событие уничтожения и создания.
    position_destroy(x,y) - Уничтожить все образцы, чей спрайт содержит позицию (x, y).
    position_change(x,y,obj,perf) - Изменить все образцы в (x, y) в obj. Perf указывает, исполнить ли событие уничтожения и создания.

Синхронизация (Timing)

Хорошие игры требовают коректной синхронизации происходящих событий. К счастью Game Maker производит большинство синхронизации для тебя. Он определяет, что события происходят в постоянном темпе. Этот темп устанавливается при определении комнаты. Но ты можешь изменить его, используя для этого глобальную переменную (room_speed). Так например, ты можешь постепенно увеличивать скорость игры, делая ее более сложной, добавляя очень маленькое число (типа 0.001) к room_speed в каждом шаге. Если твоя машина медленная, скорость игры может не быть достигнута. Данный факт можно проверить, используя переменную (fps), которая постоянно контролирует фактическое число фреймов в секунду. Наконец, для некоторой продвинутой синхронизации ты можешь использовать переменную current_time, котораея дает число миллисекунд, с момента запуска компьютера. Существует полная коллекция доступных переменных (только первая может быть изменена):
    room_speed - Скорость игры в текущей комнате (в шагах за секунду).
    fps* - Число фреймов, которые фактически нарисованы за секунду.
    current_time* - Число миллисекунд, которые прошли начиная с момента запуска системы.
    current_year* - Текущий год.
    current_month* - Текущий месяц.
    current_day* - Текущий день.
    current_weekday* - Текущий день недели (1=воскресенье, ¦, 7=суббота).
    current_hour* - Текущий час.
    current_minute* - Текущая минута.
    current_second* - Текущая секунда.
Иногда ты возможно захочешь остановить игру на некоторое временя. Для этого, используй функцию бездействия (sleep).
    sleep(numb) - Бездействие номер миллисекунд.
И так, как ты должно быть знаешь, каждый образец имеет 8 разных сигнальных часов, которые ты можешь устанавить. Изменять значения (или получать значения) различных сигнальных часов можно используя следующую переменную:
    alarm[0..7] - Значение определяющее сигнальные часы. (Обрати внимание, что сигнальные часы модифицируются только тогда, когда сигнальное событие для объекта содержит действия!)

Комнаты и Игровой Счет (Rooms and score)

Игры работают в комнатах. Каждая комната имеет индекс, который обозначен названием комнаты. Текущая комната сохраняется в переменном (room). Ты не можешь быть уверен, что комнаты пронумерованы в последовательном порядке. Поэтому никогда не добавляй или не вычитай номер из переменной (room). Вместо этого используй функции и переменные, приведенные ниже. Вот типичная часть кода, который ты будешь использовать:
    {
      if (room != room_last)
      {
        room_goto_next();
      }
      else
      {
        game_end();
      }
    }
Существуют следующие переменные и функции, которые имеют дело с комнатами.
    room - Индекс текущей комнаты; может быть изменен, чтобы перейти в другую комнату, но лучше всего использовать отду из подпрограмм указанных ниже.
    room_first* - Индекс первой комнаты в игре.
    room_last* - Индекс последней комнаты в игре.
    room_goto(numb) - Переход в комнату с индексом номер.
    room_goto_previous() - Переход в предыдущую комнату.
    room_goto_next() - Переход в следующую комнату.
    room_restart() - Перезапускает текущую комнату.
    room_previous(numb) - Возвращает индекс комнаты перед номером (-1 = нет) но не переходит туда.
    room_next(numb) - Возвращает индекс комнаты после номера (-1 = нет).
    game_end() - Заканчивает игру.
    game_restart() - Перезапускает игру.
Комнаты имеют множество дополнительных свойств:
    room_width* - Ширина комнаты в пикселах.
    room_height* - Высота комнаты в пикселах.
    room_caption - Строка заголовка для комнаты, которая отображается в заголовке окна.
    room_persistent - Является ли текущая комната постоянной.
Многие игры предлагают игроку возможность сохранить игру и загрузить сохраненную игру. В Game Maker это происходит автоматически, когда игрок нажимает клавиши для сохранения и для загрузки. Ты можешь также сохранять и загружать игры изнутри части кода (обрати внимание, что загрузка имеет место только в конце текущего шага).
    game_save(string) - Сохранить игру в файлу со строкой названия.
    game_load(string) - Загрузить игру из файла со строкой названия.
Другой важный аспект многих игр, это игровой счет и количество жизней. Game Maker сохраняет список игровых результатов в глобальной переменной (score) и количество жизней в глобальной переменной (lives). Оба - обычно отображаются в заголовке окна. Ты можешь изменять счет, просто изменяя значение этой переменной. То же самое касается жизней. Если жизней больше чем 0 и они становятся меньше или равными 0, выполняется событие "нет больше жизней" (no-more-lives) для всех образцов. Если ты не хочешь отображать счет и жизни в заголовке, установи для переменной show_score значение - ложно. (Ты можешь также изменить все это в окне опций). Для более сложных игр лучше всего отображать игровой счет самостоятельно.
    score - Текущий счет.
    lives - Число жизней.
    show_score - Показывает игровой счет (и жизни).
Также имеется встроенный механизм, для сохранения списка лучших результатов. Он может содержать до десяти имен.

Генерирование событий (Generating events)

Как ты знаешь, Game Maker - полностью управляется событиями. Все происходящие действия - результат событий. Существует множество различных событий. События создания и уничтожения происходят, когда образец создается или уничтожается. В каждом шаге, система сначала обрабатывает сигнальные события. Затем она обрабатывает события клавиатуры и мыши, а затем событие шага. После этого образцы установливаются в их новые позиции после чего обрабатывается событие столкновения. В заключении используется события рисования (draw event), для того чтобы нарисовать образцы (обрати внимание, что когда имеются мультиплеерный вид, событие рисования вызывается многократно в каждом шаге). Ты можешь также применить событие к текущему образцу изнутри части кода. Доступны следующие функции:
    event_perform(type,numb) - Исполняет событие номера типа, типа к текущему образцу. Могут быть указаны следующие типы событий:
      ev_create
      ev_destroy
      ev_step
      ev_alarm
      ev_keyboard
      ev_mouse
      ev_collision
      ev_other
      ev_draw
    Когда имеются множественные события данного типа, номер (numb) может быть использован, для определения конкретного события. Для события сигнала (alarm event) номер может располагаться от 0 до 7. Для события клавиатуры (keyboard event) ты должен использовать клавишные коды для клавиш. Для событий мыши (mouse events) ты можешь использовать следующие константы:
      ev_left_button
      ev_right_button
      ev_middle_button
      ev_no_button
    Для события столкновения (collision event) ты указываешь индекс другого объекта. Для другого события ты можешь использовать следующие константы:
      ev_outside
      ev_boundary
      ev_game_start
      ev_game_end
      ev_room_start
      ev_room_end
      ev_no_more_lives
      ev_animation_end
    event_perform_object(obj,type,numb) - Эти функции работают точно так же как функции указанные выше, за исключением того, что в данном случае ты можешь определить события в другом объекте. Обрати внимание, что действия в этих событиях применяются к текущему образцу, а не к образцам данного объекта..
    event_user(numb) - В других событиях ты можешь также определять 8 событий пользователя. Они выполняются только, если ты вызываешь функции лежащие в диапазоне от 0 до 7.
    event_inherited() - Исполняет событие наследственности (inherited event). Работает только если образец имеет материнский объект.
Ты можешь получить информацию о текущем выполняемом событии используя следующие (read-only) переменные:
    event_type* - Тип текущего события начинающего выполнение.
    event_number* - Номер текущего события начинающего выполнение.
    event_object* - Индекс объекта для которого выполняется текущее событие.
    event_action* - Индекс действия, которое в настоящее время выполняется (0 - первое событие, и т.д.).

  Предыдущая страница   В начало   Следующая страница

© 2001 Simple Life & World

Цены на элитный алкоголь новый год.