ГлавнаяРегистрацияВход
Приветствую Вас Гость | RSS
Главная » Статьи » Game Maker » Game Maker

Игровой процесс(часть 2)

Отключение образцов

Когда Вы создаёте большую комнату, например, в платформенных играх с небольшим видом, много образцов объекта находится за пределами вида. Такие образцы всё ещё активны и выполняют указанные события. Также, например, выполнение столкновения проверяет, будут ли эти образцы объекта приняты во внимание. Это может затратить много времени. (Например, часто бывает не важно, что образец объекта находиться за пределами перемещения вида.) Чтобы решить эту проблему Game Maker содержит некоторые функции, чтобы деактивировать и активировать образцы объекта. Перед их использованием, Вы должны ясно понимать, как они работают.

Когда Вы деактивируете образцы объекта, то они, в некотором значении, удаляются из игры. Они не являются больше видимыми, и любые события для них не выполняются. И для всех действий и функций они уже больше не существуют. Это экономит много времени, но Вы должны быть всё же осторожны. Например, когда Вы удаляете все образцы объекта конкретного типа, деактивированные образцы объекта не удаляются (поскольку они не существуют). Так что не думайте, что играющий нажатием клавиши может открыть деактивированную дверь.

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

Вот доступные подпрограммы:

instance_deactivate_all(notme) Деактивирует все образцы объекта в комнате. Если notme - истина, то вызываемый образец объекта не деактивируется (обычно это то, что Вам нужно).
instance_deactivate_object(obj) Деактивирует все образцы объекта в комнате заданного объекта obj. Вы можете также использовать все, чтобы указать, что все образцы объекта должны быть деактивированы; или идентификатор образца объекта, чтобы деактивировать индивидуальный образец объекта.
instance_deactivate_region(left,top,width,height,inside,notme) Деактивирует все образцы объекта в указанную область (то есть, если окошки bounding box пролегают частично в области). Если установлена ложь, то образцы объекта находящиеся за пределами области деактивируются. Если notme - истина, то вызываемый образец объекта не деактивируется (обычно это то, что Вам нужно).
instance_activate_all() Активирует все образцы объекта в комнате.
instance_activate_object(obj) Активирует все образцы объекта в комнате заданного объекта obj. Вы можете также использовать все, чтобы указать, что все образцы объекта должны быть активированы; или идентификатор образца объекта, чтобы активировать индивидуальный образец объекта.
instance_activate_region(left,top,width,height,inside) Активирует все образцы объекта в указанной области. Если установлена ложь, то образцы объекта находящиеся за пределами области будут активированы.

Например, чтобы деактивировать все образцы объекта за пределами вида и активировать их в виде, Вы можете вставить следующее коды в событии шага движущегося персонажа:

{
  instance_activate_all();
  instance_deactivate_region(view_xview[0],view_yview[0],
                        view_wview[0],view_hview[0],false,true);
}

На практике, Вы могли бы захотеть использовать область немного большую, чем область вида.

 

Синхронизация

Хорошие игры требуют осторожную синхронизацию определённых событий. К счастью 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) "Заморживает" игру на numb миллисекунд.

Вы уже должны знать, что каждый образец объекта имеет 12 таймеров, которые Вы можете установить. Чтобы изменить значения (или получить значения) другого таймера, используйте следующие переменные:

alarm[0..11] Значение для указанного таймера. (Не забудьте, что таймер будет вести отсчёт только в том случае, если событие таймера для объекта содержит действия!)

Мы рассматриваем это для комплекса вопросов по синхронизации. Вы можете также использовать ресурс тайм-лайна. Каждый образец объекта может связать с собой ресурс тайм-лайна. Следующие переменные имеют дело именно с этим:

timeline_index Идентификатор тайм-лайна, связанный с текущим объеком. Если переменная равняется -1, то объект не будет использовать тайм-лайны.
timeline_position Содержит текущую позицию установленного тайм-лайна Вы можете изменить это, чтобы пропустить определённые части или чтобы их повторить.
timeline_speed Скорость шага тайм-лайна. (По умолчанию, за один шаг позиция тайм-лайна увеличивается на единицу.) Если значение больше чем 1, то несколько моментов могут случиться в течение одного и того же такта. Они будут все выполнены в правильном порядке, так что никакие действия не будут пропущены.

 

 

Комнаты

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

{
  if (room != room_last)
  {
    room_goto_next();
  }
  else
  {
    game_end();
  }
}

Следующие переменные и функции имеют отношение к комнатам.

room Cодержит индекс текущей комнаты, но Вы лучше используйте подпрограммы ниже.
room_first* Содержит индекс первой комнаты в игре.
room_last* Содержит индекс последней комнаты в игре.
room_goto(numb) Совершает переход в комнату с идентификатором 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 это происходит автоматически, когда пользователь нажимает <F5> для сохранения и <F6> для загрузки. Вы можете также сохранять и загружать игры из части кода (отметьте, что загрузка будет происходить только в конце текущего шага).

game_save(string) Cохраняет игру в файл с именем string.
game_load(string) Загружает игру из файла с именем string.

Пожалуйста, поймите, что сохраняются только основные данные игры. Если, например, проигрывается определённый отрезок музыки, то точная его позиция не сохраняется. Также не сохраняются изменённые ресурсы. Не сохраняются и такие вещи как: дата-структуры, частицы и установки многопользовательской игры.

Переходы

Когда Вы перемещаетесь от одной комнаты к другой, Вы можете выбрать переход. Чтобы установить переход, Вы должны использовать переменную transition_kind. Если Вы устанавливаете значение большее чем 0, то будет использоваться соответствующий переход. Оно затрагивает только следующий переход, после чего значение сбрасывается на 0, который не указывает никакого перехода.

transition_kind устанавливает переход между комнатами. Вы можете использовать следующие встроенные значения

0 = no effect (нет эффекта)
1 = Create from left (появление слева на право)
2 = Create from right (появление справа на лево)
3 = Create from top (появление сверху вниз)
4 = Create from bottom (появление снизу вверх)
5 = Create from center (появление из центра)
6 = Shift from left (выдвиг слева на прово)
7 = Shift from right (выдвиг справа на лево)
8 = Shift from top (выдвиг сверху вниз)
9 = Shift from bottom (выдвиг снизу вверх)
10 = Interlaced from left (чередующееся появление слева на право)
11 = Interlaced from right (чередующееся появление справа на лево)
12 = Interlaced from top (чередующееся появление сверху вниз)
13 = Interlaced from bottom (чередующееся появление снизу вверх)
14 = Push from left (сдвиг слева на прово)
15 = Push from right (сдвиг справа на лево)
16 = Push from top (сдвиг сверху вниз)
17 = Push from bottom (сдвиг снизу вверх)
18 = Rotate to the left (появление из центра с вращением против часовой)
19 = Rotate to the right (появление из центра с вращением по часовой)
20 = Blend the rooms (плавное проявление)
21 = Fade out and in (исчезание и появление)

transition_steps указывает число шагов в переходе. Больше шагов - дольше переход. По умолчанию 80.
transition_define(kind,name) с помощью этой функции вы можете создавать ваши собственные переходы. Для этого Вы должны определить скрипт (возможно в пакете расширения), чтобы сделать переход. С этой функцией Вы сможете добавить переход в систему. kind - это индекс перехода (или нового или существующего перехода). name - это название скрипта. Обратите внимание, что название скрипта - строка! Поэтому, оно должно заключаться в кавычки. Скрипт должен содержать пять параметров: изображение предыдущей комнаты, изображение следующей комнаты, ширина изображения, высота изображения и доля перехода (между 0 и 1). Этого хватит для рисования изображения, используя эти две поверхности.
transition_exists(kind) эта функция проверяет, существует ли переход такого вида.

Пожалуйста, обратите внимание, что переходы не работают при использовании 3D графики. Также, переходы работают неправильно, когда размеры комнат не одинаковые.

 

 

Игровой счёт

Другим важным аспектом многих игр является: игровой счёт и показатели здоровья и количества жизней. Game Maker следит за игровым счётом, используя глобальную переменную score; и за количеством жизней, используя глобальную переменную lives. Вы можете изменить игровой счёт просто изменением значений этой переменной. Это также относится к здоровью и жизням. Если жизней больше чем 0 и становится меньше либо равно 0, то событие no-more-lives не выполняется для всех образцов объекта. Если Вы не хотите показывать игровой счёт и количество жизней в заголовке, то установите переменную show_score и т.п. в ложь. Также Вы можете изменить заголовок. Для более сложных игр, Вы лучше сами составьте показатель игрового счёта.

score Cодержит текущий игровой счёт.
lives Содержит текущее количество жизней.
health Содержит текущее здоровье (0-100).
show_score Определяет, отражать ли игровой счёт в заголовке окна или нет.
show_lives Определяет, отражать ли количество жизней в заголовке окна или нет.
show_health Определяет, отражать ли текущее здоровье в заголовке окна или нет.
caption_score Определяет, что будет написано перед значением игрового счёта в заголовке окна.
caption_lives Определяет, что будет написано перед значением жизней в заголовке окна.
caption_health Определяет, что будет написано перед значением здоровья в заголовке окна.

 

 

 

Генерация событий

Как Вы уже знаете, Game Maker является полностью управляемым событиями. Все действия случаются после результатов событий. Есть множество различных событий. События создания и уничтожения случаются, когда образец объекта создаётся или уничтожается. В каждом шаге, сначала система проводит операции события сигнала-таймера. Затем, оперирует события клавиатуры и события мыши, а затем событие шага. После того, как образцы объектов будут установлены в свои новые позиции, после чего прооперируется событие столкновения. Наконец, используется событие рисования для рисования образцов объекта (отметьте, что когда есть много видов, то событие рисования вызывается многочисленное количество раз в каждом шаге). Вы можете также применить события к текущему образцу объекта из части кода. Следующие функции существуют:

event_perform(type,numb) Выполняет событие numb, указанного типа type для текущего образца объекта. Следующие типы событий могут быть указаны:

ev_create
ev_destroy
ev_step
ev_alarm
ev_keyboard
ev_mouse
ev_collision
ev_other
ev_draw
ev_keypress
ev_keyrelease

Когда имеются многочисленные события заданного типа, numb может использоваться, чтобы определить точное событие. Для события сигнала-таймера, numb может колебаться от 0 до 11. Для события клавиатуры, Вы должны использовать клавиатурный код для клавиш. Для событий мыши, Вы можете использовать следующие константы:

ev_left_button
ev_right_button
ev_middle_button
ev_no_button
ev_left_press
ev_right_press
ev_middle_press
ev_left_release
ev_right_release
ev_middle_release
ev_mouse_enter
ev_mouse_leave
ev_mouse_wheel_up
ev_mouse_wheel_down
ev_global_left_button
ev_global_right_button
ev_global_middle_button
ev_global_left_press
ev_global_right_press
ev_global_middle_press
ev_global_left_release
ev_global_right_release
ev_global_middle_release
ev_joystick1_left
ev_joystick1_right
ev_joystick1_up
ev_joystick1_down
ev_joystick1_button1
ev_joystick1_button2
ev_joystick1_button3
ev_joystick1_button4
ev_joystick1_button5
ev_joystick1_button6
ev_joystick1_button7
ev_joystick1_button8
ev_joystick2_left
ev_joystick2_right
ev_joystick2_up
ev_joystick2_down
ev_joystick2_button1
ev_joystick2_button2
ev_joystick2_button3
ev_joystick2_button4
ev_joystick2_button5
ev_joystick2_button6
ev_joystick2_button7
ev_joystick2_button8

Для события столкновения, Вы присваиваете идентификатор другого объекта. Наконец, для другого события, Вы можете использовать следующие константы:

ev_outside
ev_boundary
ev_game_start
ev_game_end
ev_room_start
ev_room_end
ev_no_more_lives
ev_no_more_health
ev_animation_end
ev_end_of_path
ev_close_button
ev_user0
ev_user1
ev_user2
ev_user3
ev_user4
ev_user5
ev_user6
ev_user7
ev_user8
ev_user9
ev_user10
ev_user11
ev_user12
ev_user13
ev_user14
ev_user15

Для события шага Вы присваиваете идентификатор, который может использовать следующие константы:

ev_step_normal
ev_step_begin
ev_step_end

event_perform_object(obj,type,numb) Позволяет назначить для текущего объекта событие numb типа type, указанные в объекте obj. События будут исполнены для текущего, а не для указанного объекта obj.
event_user(numb) В других событиях, Вы можете также определить 16 пользовательских событий. numb - число от 0 до 15.
event_inherited() Выполняет унаследованное событие. Это работает только в том случае, если образец объекта имеет родительский объект.

Вы можете получить информацию о текущем событии, используя следующие переменные "только для чтения":

event_type* Тип события, начавшего выполняться.
event_number* Номер события, начавшего выполняться.
event_object* Идентификатор объекта, в котором выполняется текущее событие.
event_action* Идентификатор действия, которое в данный момент выполняется (0 - первое в событии и т.д.).

 

 

Дополнительные переменные и функции

Вот некоторые переменные и функции, которые имеют дело с ошибками.

error_occurred Указывает, произошла ли ошибка
error_last Содержит последнее сообщение об ошибке
show_debug_message(str) Показывает строку в отладочном режиме

Следующее функций позволяет Вам проверить то, что если определённые переменные существуют, то Вы можете их установить и получить различные величины. Во всех этих функциях, имя переменной проходит как строка!

variable_global_exists(name) Возвращает, если глобальная переменная с заданным именем (строки) существует.
variable_local_exists(name) Возвращает, если локальная переменная с заданным именем (строки) существует для текущего образца объекта.
variable_global_get(name) Возвращает значение глобальной переменной с заданным именем (строки).
variable_global_array_get(name,ind) Возвращает значение индекса ind глобальной переменной массива с заданным именем (строки).
variable_global_array2_get(name,ind1,ind2) Возвращает значение индекса ind1,ind2 глобальной 2-мерной переменной массива с заданным именем (строки).
variable_local_get(name) Возвращает значение локальной переменной с заданным именем (строки).
variable_local_array_get(name,ind) Возвращает значение индекса ind локальной переменной массива с заданным именем (строки).
variable_local_array2_get(name,ind1,ind2) Возвращает значение индекса ind1,ind2 локальной 2-мерной переменной массива с заданным именем (строки).
variable_global_set(name,value) Устанавливает глобальную переменную с заданным именем (строки) в заданное значение.
variable_global_array_set(name,ind,value) Устанавливает индекс ind в глобальную переменную массива с заданным именем (строки) в заданное значение.
variable_global_array2_set(name,ind1,ind2,value) Устанавливает индекс ind1,ind2 в глобальную 2-мерную переменную массива с заданным именем (строки) в заданное значение.
variable_local_set(name,value) Устанавливает локальную переменную с заданным именем (строки) в заданное значение.
variable_local_array_set(name,ind,value) Устанавливает индекс ind в локальную переменную массива с заданным именем (строки) в заданное значение.
variable_local_array2_set(name,ind1,ind2,value) Устанавливает индекс ind1,ind2 в локальную 2-мерную переменную массива с заданным именем (строки) в заданное значение.

Например, Вы можете написать:

{
  if variable_global_exists('ammunition')
    global.ammunition += 1
  else
    global.ammunition = 0
}

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

Вы можете изменить приоритет программы, используя следующую функцию:

set_program_priority(priority) Устанавливает приоритет для программы. Вы можете указать величину между -3 и +3. Величина -3 означает, что программа запустится только в том случае, если никакой другой работающий процесс не требует времени обработки, или установлен иначе, или когда все другие процессы находятся в режиме ожидания. Величины -2 и -1 - низкий приоритет, так что другие процессы получат больший приоритет. 0 - нормальная величина. +1 и +2 дают более высокий приоритет, протекающий, возможно, в более высокой скорости и более плавном потоке игры. Но другие процессы получат значительно меньше времени для обработки. +3 указывает режим в реальном времени. В режиме реального времени, в основном, всё время выделяется для игры. Это может привести к серьёзным проблемам с любым из других работающих приложений. Также события клавиатуры и, например, закрытие окна не может быть записано Windows. Так что лучше используйте это когда хотите использовать всё время процессора. Проверьте это перед использованием тщательней.

 

Категория: Game Maker | Добавил: Strateg (27.12.2010)
Просмотров: 4447 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Меню сайта

-=ЯП=-

Конструктор\Движки

Игроделу

Наш опрос
Оцените мой сайт
Всего ответов: 58

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

DiamonD
Бесплатный конструктор сайтов - uCoz