
Существует большое количество переменных и функций, которые ты можешь использовать,
для определения игрового процесса. Они в частности влияют на перемещение и создание
образцов, синхронизацию, и обработку событий.
Перемещение (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
|