Лекция: УНИЧТОЖЕНИЕ ПУЛИ, КОГДА ОНА ПРОПАДАЕТ ИЗ ВИДА

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


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

 

Комментарий (Comment)
Вы можете добавлять в свои программы комментарии. Все что находится в строке после символа // не читается программой. Данный символ используется внутренне и указывает конец строки.
Стиль Паскаль (Pascal)
Интерпретатор в действительности довольно слабый. Но Вы также можете использовать программы, подобные написанным на Паскале. Вы можете использовать (begin) и (end) для разграничивания блоков, := для присваивания и даже добавлять слово (word) в операторе if или do в цикле (while). Например, следующая программа также допустима:
begin
x := 10;
while x>0 do
begin
if x=5 then x:=x-5 else x:=x-1;
end;
end;

 

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

 

Конструкции С (With)
Как было сказано выше, существует возможность читать и изменять значение переменных в других образцах. Но в большинстве случаев Вы захотите сделать с другими образцами что-то более существенное. Например — предположим, что Вы хотите переместить все шарики вниз на 8 пикселов. Вы могли бы предположить, что добиться этого можно следующей частью кода
ball.y = ball.y + 8;
Но это не верно. Правая сторона присваивания получает значение y-координаты первого шарика и добавляется к нему 8. Затем это новое значение устанавливается как y-координата для всех шариков. Таким образом, в результате все шарики получают ту же самую y-координату. Инструкция
ball.y += 8;
будет иметь точно такой же эффект, потому как это — просто сокращение первой инструкции. Так, каким же образом сделать это? Для этой цели имеется инструкция with. Его глобальная форма
with (<выражение>) <инструкция>
<выражение> указывает один или большее количество образцов. Для этого Вы можете использовать идентификатор (id) образца, имя объекта (чтобы указать все образцы этого объекта) или один из специальных объектов (all, self, other, noone). <инструкция> теперь выполняется для каждого из обозначенных образцов, как будто этот образец — текущий (self) образец. Таким образом, чтобы переместить все шарики на 8 пикселов вниз, Вы можете напечатать.
with (ball) y += 8;
Если Вы хотите выполнить многочисленные (multiple) инструкции, поместите вокруг них фигурные скобки. Так например, чтобы переместить все шарики в случайную позицию, Вы можете использовать
with (ball)
{
x = random(room_width);
y = random(room_height);
}
Обратите внимание, что в пределах инструкции(ий), обозначенный образец стал самостоятельным (self) образцом. В пределах инструкций оригинал самостоятельного образца стал другим (other) образцом. Так например, чтобы переместить все шарики в позицию текущего образца, Вы можете напечатать
with (ball)
{
x = other.x;
y = other.y;
}
Использование инструкции (with) является чрезвычайно мощным инструментом. Позвольте привести еще несколько примеров. Чтобы уничтожить все шарики, Вы печатаете
with (ball) instance_destroy();
Если взрывается бомба и Вы хотите уничтожить все образцы рядом с собой, можно использовать:
with (all)
{
if (distance_to_object(other) < 50) instance_destroy();
}

Многопользовательские игры в GameMaker
Играть против компьютерного противника забавно. Но гораздо интереснее играть против реального человека. Делать игры для нескольких игроков также относительно просто, потому что Вам не приходится беспокоиться о создании сложного Искусственного Интеллекта для своего компьютерного противника. Вы конечно можете усадить двух играющих перед одним монитором и использовать для управления различные клавиши или другие устройства ввода, но намного интереснее, когда каждый играющий находится за своим собственным компьютером. А еще веселее если, один из игроков находится вообще по другую сторону океана. Game Maker имеет поддержку многопользовательского режима (мультиплеера в простонародии). Только учтите, что создание многопользовательской игры, действительно заслуживающей внимания, с хорошей синхронизацией и без тормозов — довольно трудная задача. Данный раздел содержит краткое описание имеющихся возможностей. На авторском WEB сайте доступна обучающая программа с более подробной информацией.
Установка соединения
Для связи между двумя компьютерами, необходим какой-нибудь протокол связи. Как и большинство игр, Game Maker предлагает четыре разных типа соединения: IPX, TCP/IP, Модемное и Последовательное (Serial) соединения. IPX соединение (или если быть более точным, протокол) работает, почти полностью прозрачно. Он может использоваться, для того чтобы играть в игрушки с другими людьми по одной локальной сети. Для работы требуется чтобы он был установлен на Вашем компьютере. (Если он не работает, загляните в документацию по Windows. Выберите элемент Сеть (Network) в панели управления (control panel) Windows и добавьте IPX протокол.) TCP/IP — межсетевой (Интернет) протокол. Он может использоваться, для того чтобы играть с другими игроками по Интернет, предполагается что Вы знаете их IP адрес. По локальной (местной) сети Вы можете использовать его без, указания адреса. Модемное подключение производится посредством модема. Вы должны произвести некоторые настройки модема (строка инициализации и номер телефона) чтобы использовать его. Наконец, при использовании последовательной линии (прямое соединение между компьютерами) Вы должны настроить большое некоторое количество параметров порта. Доступны четыре функции GML, которые могут быть использованы для инициализации данных соединений:
mplay_init_ipx()- инициализирует IPX подключение.
mplay_init_tcpip(addr)- инициализирует TCP/IP подключение. addr — строка, содержащая веб адрес или IP адрес, например 'www.gameplay.com' или '123.123.123.12', возможно сопровождаемый номером порта (например ':12'). Указание адреса необходимо только в процессе сеанса соединения (смотри ниже). В локальной сети никакие адреса не нужны.
mplay_init_modem(initstr,phonenr)- инициализирует модемное подключение. initstr — строка инициализации для модема (может быть пустой). phonenr — строка, которая содержит номер телефона, для дозвона (например '0201234567'). Номер телефона необходим только в момент сеанса подключения.
mplay_init_serial(portno,baudrate,stopbits,parity,flow)- инициализирует последовательное подключение. portno — номер порта (1-4). baudrate — скорость передачи данных в бодах, которая будет использоваться (100-256К). stopbits указывает число стопбитов (0 = 1 bit, 1 = 1.5 bit, 2 = 2 bits). parity — указывает четность (0=none, 1=odd, 2=even, 3=mark). И flow указывает на тип управления потоком данных (0=none, 1=xon/xoff, 2=rts, 3=dtr, 4=rts и dtr). Возвращает, если вызов успешный. Типичный вызов — mplay_init_serial(1,57600,0,0,4). Укажите 0 как первый параметр, чтобы открыть диалог пользователя, для изменения настроек.
Ваша игра должна вызвать одну из этих функций только однажды. Все функции сообщают, если ни были успешны. Отсутствие успешного выполнения функции, может свидетельствовать о том, что не установлен специфический протокол или он не поддерживается Вашей машиной. Для проверки наличия успешного подключения, Вы можете использовать следующую функцию
mplay_connect_status()- возвращает состояние текущего подключения. 0 = нет подключения, 1 = IPX подключение, 2 = TCP/IP подключение, 3 = модемное подключение и 4 = последовательное подключение.
Окончание вызова подключения
mplay_end()- завершает текущее соединение.
При использовании TCP/IP подключения Вы можете захотеть сообщить человеку, что Вы хотите начать игру с указанием адреса ip своего компьютера. Следующая функция поможет Вам:
mplay_ipaddress()- возвращает IP адрес Вашей машины (например '123.123.123.12') как строку. Вы можете например отобразить это где-нибудь на экране. Обратите внимание, что эта функция медленная, так-что не вызывайте ее часто.
Сеансы создания и соединения
В тот момент, когда Вы подключаетесь к сети, в этой сети могут быть запущены и выполняться множество различных игр. Мы назовем их сеансами. Эти различные сеансы могут соответствовать различным играм или одной и той же игре. Игра должна уникально идентифицировать себя в сети. К счастью, Game Maker делает это для Вас. Единственная вещь, которую Вы должны знать, заключается в том, что, когда Вы изменяете игровой идентификатор в окне опций эти идентификационные данные изменяются. Таким образом Вы можете избежать ситуации, когда люди со старой версией Вашей игры смогут играть с людьми имеющими новую версию.
Если Вы хотите запустить новую многопользовательскую игру, Вы должны создать новый сеанс. Для этого Вы можете использовать следующую подпрограмму:
mplay_session_create(sesname,playnumb,playername)- создает новый сеанс для текущего подключения. sesname — строка, указывающая название сеанса. playnumb — номер, который указывает максимальное число играющих, разрешенных в данной игре (используйте 0 для произвольного числа). playname — Ваше имя как игрока. Возвращает, если успешна.

Один образец игры должен создать сеанс. Другой образец(цы) этой игры должны присоединиться к данному сеансу. В действительности это немного сложнее. Вы сначала должны посмотреть, какие сеансы доступны и затем выбрать нужный для присоединения. Существуют три подпрограммы, необходимые для этого:
mplay_session_find()- ищет все сеансы, которые доступны для подключения игроков и возвращает число найденных сеансов.
mplay_session_name(numb)- возвращает имя номера сеанса numb (0 — первый сеанс). Эта подпрограмма может быть вызвана, только после вызова предыдущей подпрограммы.
mplay_session_join(numb,playername)- создает твой сеанс присоединения номер numb (0 — первый сеанс). playername — Ваше имя как игрока. Возвращает, если успешно.
Имеется еще одна подпрограмма, которая может изменять режим сеанса. Должна быть вызвана перед созданием сеанса:
mplay_session_mode(move)- устанавливает, реально или нет переместить сеанс с хостом на другой компьютер, когда хост отключается. Перемещение должно быть истинно или ложно (по умолчанию).
Чтобы проверить состояние текущего сеанса, Вы можете использовать следующую функцию
mplay_session_status()- возвращает состояние текущего сеанса. 0 = нет сеанса, 1 = созданный сеанс, 2 = соединенный сеанс.
Игрок может остановить сеанс, используя следующую подпрограмму:
mplay_session_end()- заканчивает сеанс для данного игрока.
Игроки
Каждый образец игры, который присоединяется к сеансу является игроком. Как было сказано выше, игроки имеют свои имена. Существуют три подпрограммы, предназначенные для работы с игроками.
mplay_player_find()- ищет всех игроков в текущем сеансе и возвращает число найденных игроков.
mplay_player_name(numb)- возвращает имя игрока номер numb (0 — первый игрок, это всегда ты сам). Эта подпрограмма может быть вызвана после вызова предыдущей подпрограммы.
mplay_player_id(numb)- возвращает уникальный идентификатор номера игрока numb (0 — первый игрок, всегда Вы сами). Эта подпрограмма может вызываться только после вызова первой подпрограммы. Данный идентификатор используется при отправке и приеме сообщений к и от индивидуальных игроков.
Общие данные (Shared data)
Коммуникация общих данных — вероятно самый простой способ синхронизировать игру. Все коммуникации скрыты от Вас. Существует набор из 10000 значений, которые являются общими для всего что содержится в игре. Каждый объект может устанавливать значения и читать значения. Game Maker проверяет, чтобы каждый объект видел те же самые значения. Значения могут быть реальными или строковыми. Доступны только две подпрограммы:
mplay_data_write(ind,val)- записывает значение val (строку или реальное) в локацию ind (ind между 0 и 10000).
mplay_data_read(ind)- возвращает значение в локацию ind (ind между 0 и 10000). Первоначально все значения равны 0.
Чтобы синхронизировать данные на разных машинах, Вы можете использовать гарантируемый режим, который проверяет изменения прибытия на другую машину (но который является медленным) или не-гарантируемый. Изменить это можно используя следующую подпрограмму:
mplay_data_mode(guar)- устанавливает, использовать или нет гарантируемую передачу для общих данных. guar должен или быть истинно (по умолчанию) или ложно.
Сообщения
Второй коммуникационный механизм, который поддерживает Game Maker, это посылка и прием сообщений. Игрок может посылать сообщения одному или всем игрокам. Игроки могут видеть, если прибыли сообщения и принимать соответствующие меры. Сообщения могут быть отправлены в гарантируемый режим, в котором Вы будете уверены, что они прибыли (но он может оказаться медленным) или в не-гарантируемом режиме, который является более быстрым.
Существуют следующие подпрограммы передачи сообщений:
mplay_message_send(player,id,val)- посылает сообщение указанному игроку (либо на идентификатор, либо на имя; используйте 0, чтобы послать сообщение всем игрокам). id — целочисленный идентификатор сообщения, и val — значение (реальное или строка). Сообщение посылается в не-гарантируемом режиме.
mplay_message_send_guaranteed(player,id,val)- посылает сообщение указанному игроку (либо идентификатор либо имя; используйте 0, чтобы послать сообщение всем игрокам). id — целочисленный идентификатор сообщения, и val — значение (реальное или строка). Сообщение посылается в гарантируемом режиме.
mplay_message_receive(player) — принимает следующее сообщение из очереди сообщений, исходящих от указанного игрока (идентификатор или имя). Используйте 0 для сообщений от любого игрока. Подпрограмма возвращает, если действительно имеется новое сообщение. При этом Вы можете использовать следующие подпрограммы, чтобы узнать его содержание:
mplay_message_id() — возвращает идентификатор последнего полученного сообщения.
mplay_message_value() — возвращает значение последнего полученного сообщения.
mplay_message_player() — возвращает игрока, который послал последнее полученное сообщение.
mplay_message_name() — возвращает имя игрока, который послал последнее полученное сообщение.
mplay_message_count(player) — возвращает количество сообщений, оставшихся в очереди от игрока (используйте 0, чтобы сосчитать все сообщение).
mplay_message_clear(player) — удаляет все сообщения, оставшиеся в очереди от игрока (используйте 0, чтобы удалить все сообщение).
Некоторые уточнения вышесказанного. Прежде всего, если Вы хотите послать сообщение только определенному игроку, Вас нужно знать его уникальный идентификатор (id). Как уже сообщалось ранее, Вы можете получить его используя функцию mplay_player_id(). Данный идентификатор игрока, используется также при приеме сообщений от определенного игрока. В качестве альтернативы, Вы можете дать имя игроку, как строку. Если многие игроки имеют такое же имя, то сообщение получит только первый.
Во-вторых, Вы могли бы поинтересоваться, почему каждое сообщение имеет целочисленный идентификатор. Причина в том, что он помогает Вашему приложению посылать различные типы сообщений. Получатель может проверять тип сообщения, используя идентификатор и принять соответствующие действия. (Поскольку, если не гарантируется, что сообщения прибудут, то посылка идентификатора и значения в разных сообщениях могла бы вызвать серьезные проблемы).

 

Сегодня я хочу рассказать вам, как нужно грамотно создавать коммерческие (в данном случае shareware) игры. Правда, в весьма общих, чертах. Расположим все это дело по пунктам:

1. При отсутствии опыта в написании игр, для начала вам будет сложно написать играбельную игру с нуля, вполне возможно, что у вас получатся красивые рисунки, хороший движок, но самое сложное это все сбалансировать и заставить «играть», поэтому для начала вы выбираете прототип для игры, с условием того, что прототип удовлетворяет требованиям шароварных игр. Вы выбираете прототип игры (лучше несколько), так же с условием, чтобы он нравился если не всей, то большинству из вашей команде;

2. Поиграв в прототип (техническая демо-версия), оцениваете свои возможности, оставляете из прототипа только игровой баланс, и основные моменты геймплея, после придумываете СВОЕГО героя, свой сценарий и идеи, делаете арты для будущего героя, врагов, пишите дизайн-документ;

3. После утверждения основных правил игры и специфики будущего проекта художники работают над общим скрином из будущей игры, тем временем программисты оценивают размер игры, требования к ресурсам возможность добавления эффектов и пр., для того чтобы фантазия художников и сценаристов не перевалила за рамки максимально размера игры :) Максимум для Shareware игры это 10 мегабайт, и уже если игра действительно очень концептуальна, то можно остановится на 30, но в этом случае придется отказаться от ключей и предоставлять пользователю возможность скачивать полную версию игры после покупки;

4. После утверждения пункта 3 начинается работа над движком и моделирование героев. Но, если у вас есть Game Maker или любой другой движок, то считайте, что часть работы уже сделана;

5. При наличии функционального движка и моделей (когда герой как минимум может ходить по экрану) начинается работа по продумыванию эффектов (взрывы, сверкание, анимированный задний фон и многое другое);

6. Далее идет альфа-версия игры;

7. После альфы начинается работа над интерфейсом (если есть ресурсы это можно делать параллельно созданию альфы), ограничениями, подсказками хелпами и пр. действия для преподнесения игры конечному пользователю, тем временем так же балансируется геймплей (с учетом оригинальной игры) и отлавливаются баги. Этим же временем составляется звуковая схема и документ на написание музыки и звуков. По мере готовности, документов заказывается озвучка к игре;

8. Далее идет бета версия. Эта версия отправляется на тестирование тестерам вашего издателя или всем желающим потестить игру людям. После бета тестинга отлавливаются окончательные баги, и игра выходит в продажу;

9. Далее начинается сопровождение игры. Сюда входит выпуск постоянных апдейтов и патчей к игре. В случае с шароварными играми выпускать патчи по третьей цифре (1.0Х) не разумно, т.к. пользователь не будет выкачивать вашу игру каждый раз из-за того, что вы исправили небольшой баг. Выпускаются новые по второй цифре (1.Х). Напомню вам, что это означает (может быть, кто-то не знает): разница во второй цифре означает, что это тот же программный продукт с неизменной системой управления, но отличающийся дополнительными функциями, добавленными по заявкам пользователей.

9.5. Ну и подсчет прибыли, разумеется, от тяжких трудов и бессонных ночей. Можно и погулять немного, расслабиться :-).

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

Статья была написана еще в 2004 году.

Спрайты и изображения в GML
Для каждого объекта определяется спрайт его отождествляющий. Это может быть одиночное изображение, или он может состоять из нескольких изображений. Для каждого образца объекта программа рисует на экране соответствующее изображение, с началом его координат (как определено в свойствах спрайта) в позиции (x, y) образца. В случае если имеется несколько изображений, они циклически прокручиваются, для получения анимационного эффекта. Существует несколько переменных, которые используют разные способы, рисования изображений. Они могут быть использованы, для того чтобы изменять эффекты. Каждый образец имеет следующие переменные:
visible — Если видимость истинна (1), изображение рисуется, иначе этого не происходит. Невидимые образцы остаются активными и вызывают события столкновения; только при этом Вы их не видите. Установка видимости как ложная полезна например для объектов контроллера (делайте их не-твердым телом, чтобы избежать генерации событий столкновения) или скрытых переключателей.
sprite_index — Индекс текущего спрайта для образца. Вы можете изменять его, чтобы присвоить образцу другой спрайт. Как значение Вы можете использовать названия различных спрайтов, которые Вы определили. Изменение спрайта не изменяет индекс в настоящее время видимой части изображения.
sprite_width* — Указывает ширину спрайта. Это значение не может быть изменено, но возможно Вы захотите использовать данную переменную.
sprite_height* — Указывает высоту спрайта. Это значение не может быть изменено, но возможно и оно Вам вдруг понадобится.
sprite_xoffset* — Указывает смещение спрайта по горизонтали определенное в свойствах спрайта. Это значение не может быть изменено.
sprite_yoffset* — Указывает смещение спрайта по вертикали определенное в свойствах спрайта. Это значение не может быть изменено.
image_number* — Количество изображений из которых состоит текущий спрайт для образца (не может быть изменено).
image_index — Когда изображение имеет, несколько циклически прокручиваемых под-изображений. Данная переменная указывает рисуемый в данный момент фрагмент картинки (они пронумерованы, начиная с 0). Вы можете изменить текущее изображение, изменив эту переменную. Программа продолжит циклически прокручивать фрагменты изображения, начиная с указанного вновь индекса.
image_single — Иногда Вам может понадобится, чтобы был отображен только определенный фрагмент изображения, и чтобы циклическая прокрутка всех имеющихся фрагментов не производилась. Это может быть достигнуто, установкой для переменной индекса фрагмента изображения, которое Вы хотите увидеть (первый (начальный) фрагмент изображения имеет индекс 0). Укажите для переменной значение -1, чтобы циклически прокручивались все части изображения. Это бывает полезно, когда объект имеет несколько различных видом. Например, предположим что у Вас есть объект, который может вращаться, и Вы создаете спрайт, имеющий фрагменты изображений для различных направлений (движение против часовой стрелки). Тогда, в событии шага данного объекта Вы можете установить.
{
image_single = direction * image_number/360;
}
image_speed — Скорость, с которой Вы циклически прокручиваете фрагменты изображения. Значение 1 указывает, что каждый шаг мы получает следующее изображение. Меньшие значения прокручивают фрагменты картинки медленнее, рисуя каждый фрагмент по разу. Большие значения пропускают некоторые фрагменты картинки, чтобы сделать движение более быстрым.
depth — Как правило изображения рисуются в том виде, в котором были созданы образцы. Вы можете изменить это, устанавливая глубину изображения. Значение по умолчанию — 0, если Вы не установили иное значение в свойствах объекта. Чем выше значение, тем дальше будет находится образец на экране. (Вы также можете использовать отрицательные значения). Образцы с более высокой глубиной будут расположены позади образцов с более низкой глубиной. Установка глубины гарантирует, что образцы будут нарисованы в том виде, какой Вам нужен (например самолет позади облака). Фоновые изображения должны иметь высокую (положительную) глубину, а картинки переднего плана должны иметь низкую (отрицательную) глубину.
image_scale — Коэффициент масштабирования, делает изображения большие или меньше оригинального. Значение 1 указывает нормальный размер. Изменение масштаба также изменяет значения для ширины и высоты изображения и влияет на события столкновения, как и следовало бы ожидать. Но учтите, что масштабированное изображение (в особенности, когда Вы делаете его меньше) затрачивает больше времени, для прорисовки. Изменение масштаба может использоваться, для получения эффекта трехмерности.
image_alpha — Значение прозрачности (alpha), для использования при рисовании изображения. Значение 1 — нормальная установка; значение 0 полностью прозрачно. Используйте с осторожностью. При рисовании частично прозрачных изображений уходит больше времени и замедляется игра.
bbox_left* — Левая сторона поля ограничения, используемого изображения образца (масштабирование учитывается).
bbox_right* — Правая сторона поля ограничения, используемого изображения образца.
bbox_top* — Верхняя сторона поля ограничения, изображения образца.
bbox_bottom* — Нижняя сторона поля ограничения, изображения образца.
Спрайты используют большое количество памяти. Чтобы рисовать их достаточно быстро, нужно сохранять их в видео памяти. Вы можете указать, какие именно спрайты должны быть сохранены в видео памяти. Также Вы можете указать, чтобы некоторые спрайты загружались только при необходимости. Такие спрайты будут выгружены из памяти по окончанию уровня. Вы можете частично управлять данными процессами используя для этого код. Существуют следующие функции:
sprite_discard(numb) — Освобождает (видео) память, используемую спрайтом. Если спрайт имеет свойство «загрузить на использование» (load-on-use), то он будет полностью удален из памяти. Иначе, его копия останется в обычной памяти (которой как правило всегда не хватает) и спрайт может быть при необходимости восстановлен.
sprite_restore(numb) — Восстанавливает спрайт в (видео) памяти. Как правило это происходит автоматически, по мере необходимости спрайта. Но иногда могут возникнуть проблемы, в особенности когда установлена «load-on-use», и спрайт имеет большой размер. Таким образом Вы можете насильно загрузить его, например в начале уровня, в котором данный спрайт необходим.
discard_all()- Выгружает из памяти все спрайты, фоны и звуки, которые имеют установку «load-on-use».
Когда игра использует много разных, больших по размеру, изображений со спрайтами, это делает игровой файл большим и как следствие значительно замедляется загрузка. Также, если Вы хотите сохранить их в памяти, в момент когда они понадобятся, это значительно увеличивает объем требуемой памяти. Как альтернативу, Вы можете использовать изображения спрайтов к игре в виде (.bmp, .jpg или .gif файлов; другие форматы не поддерживаются) и загружать их в процессе игры. Для этого существуют три подпрограммы:
sprite_add(fname,imgnumb,precise,transparent,videomem,loadonuse,xorig,yorig) — Добавляет изображение, сохраненное в файле fname в набор ресурсов спрайта. Поддерживаются только bmp, jpg и gif изображения. Если изображение в формате bmp или jpg, оно может включать стрипы (полосы), содержащие несколько фрагментов изображений для спрайта, располагаемые рядом с друг другом. Используйте imgnumb, для указания их числа (1 для одиночного изображения). Для (анимированных) gif изображений, этот параметр не используется; используется число изображений имеющихся в gif файле. precise указывает, должна ли использоваться точная проверка столкновений. transparent — указывает, является ли изображение частично прозрачным, videomem — указывает, должен ли спрайт быть сохранен в видео памяти и loadonuse — указывает, должен ли спрайт быть загружен только когда он используется. xorig и yorig — указывают позицию начала координат в спрайте. Функция возвращает индекс нового спрайта, чтобы Вы могли тогда его использовать, для рисования спрайта или назначения его в качестве переменной sprite_index образца. Когда происходит ошибка возвращается единица (1).
sprite_replace(ind,fname,imgnumb,precise,transparent,videomem,loadonuse,xorig,yorig) — То же самое что и выше, но в данном случае спрайт с индексом ind заменяется. Функция возвращает, если замена была успешной.
sprite_delete(ind) — Удаляет спрайт из памяти, освобождая используемую память. (Он больше не может быть восстановлен).
ПРЕДУПРЕЖДЕНИЕ: Если Вы в течение игры сохраняете игровое состояние (записываете игру), добавленные или замененные спрайты, в записанной игре, не сохраняются. Таким образом, если Вы позже загрузите записанную игру, их там не будет. Также существуют некоторые сложности, связанные с авторским правом на распространение и использование gif файлов, с Вашими (коммерческими) приложениями. В связи с чем советуем не использовать их.

 

Экранные заставки, лучшие результаты и другое
Многие игры имеют так называемые экранные заставки (Splash). Такие экраны отображают видео, картинки или какой-то текст. Часто они используются в начале игры (как вступление), в начале уровня или в конце игры (например информация об авторе). В Game Maker подобные экраны с текстом, изображениями или видео можно показать в любой момент в течение всей игры. Игра при этом приостанавливается, и на экране отображается нужная экранная заставка. Ниже указаны функции, которые Вы можете использовать:
show_text(fname,full,backcol,delay) — Отображает текстовую экранную заставку. Fname — название текстового файла (.txt или .rtf). Вы должны поместить этот файл в папку с игрой. Также, когда Вы создаете автономную (stand-alone) версию своей игры, не забудьте добавить файл к ней (или вставить в саму игру). full — указывает, отображать ли данную информацию в полно-экранном режиме. Backcol — цвет фона, и delay — задержка в секундах перед возвращением в игру. (Для того чтобы вернуться в игру, пользователь может в любой момент нажать мышью на экране).
show_image(fname,full,delay) — Отображает экранную заставку с картинкой. fname — название файла с изображением (только .bmp, .jpg и .wmf файлы). Вы должны поместить данный файл в папку с игрой. full — указывает, отображать ли картинку в полно-экранном режиме. delay — задержка в секундах перед возвращением в игру.
show_video(fname,full,loop) — Отображает экранную заставку с видео. fname — название файла с видео (.avi, .mpg). Вы должны поместить этот файл в папку с игрой. full — указывает, отображать ли картинку в полно-экранном режиме. loop — указывает использовать ли циклическое проигрывание видео.
show_info() — Отображает окно с игровой информацией.
Существует множество других функций, предназначенных для вывода на экран сообщений, вопросов, меню с вариантами, или диалог, в котором играющий может вводить число, строку, либо указать цвет или имя файла:
show_message(str) — Отображает диалоговое окно со строкой в виде сообщения.
show_message_ext(str,but1,but2,but3)- Отображает диалоговое окно со строкой в виде сообщения и до трех кнопок. But1, but2 и but3 содержат текст кнопки. Пустая строка означает, что кнопка не отображается. Функция возвращает номер нажатой кнопки (0, если пользователь нажимает клавишу Esc).
show_question(str) — Отображает вопрос; возвращает истинно, когда игрок выбирает да и ложно при ином варианте.
get_integer(str,def)- Спрашивает у игрока номер в диалоговом окне. str — сообщение. def — отображаемый по умолчанию номер.
get_string(str,def)- Спрашивает у игрока строку в диалоговом окне. str — сообщение. def — отображаемое по умолчанию значение.
message_background(back)и- Устанавливает фоновое изображение для всплывающего окна — любой из функций приведенных выше. back — должен быть один из фонов, определенных в игре.
message_button(spr)- Устанавливает спрайт, используемый для кнопок во всплывающем окне. spr — должен быть спрайт, состоящий из трех изображений, первое изображение содержит кнопку, когда та не нажата и мышь находится в стороне, второе содержит изображение, когда мышь находится поверх кнопки, но та еще не нажата и третье изображение — нажатая кнопка.
message_text_font(name,size,color,style)- Устанавливает шрифт для текста во всплывающем окне.
message_button_font(name,size,color,style)- Устанавливает шрифт для кнопок во всплывающем окне.
message_input_font(name,size,color,style)- Устанавливает шрифт для поля ввода во всплывающем окне.
message_mouse_color(col)- Устанавливает цвет шрифта для кнопок во всплывающем окне, когда мышь оказывается над ними.
message_input_color(col)- Устанавливает цвет фона для поля ввода, во всплывающем окне.
message_caption(show,str)- Устанавливает заголовок для всплывающего окна. show указывает, нужно ли отображать границу (1) или нет (0), и str указывает заголовок, если граница отображается.
message_position(x,y)- Устанавливает позицию всплывающего окна на экране.
show_menu(str,def) — Отображает всплывающему меню. str указывает текст меню. Он состоит из различных пунктов меню с вертикальной областью между ними. Например, str = 'menu0|menu1|menu2'. Когда выбирается первый пункт, возвращает 0 и т.д. Когда игрок выбирает no item (не выбран ни один пункт), возвращает значения по умолчанию def.
get_color(defcol) — Запрашивает у игрока цвет. defcol — цвет по умолчанию. Если игрок нажимает (Cancel), возвращает значение -1.
get_open_filename(filter,fname) — Спрашивает у игрока имя файла для открытия с данным фильтром. Фильтр имеет форму 'name1|mask1|name2|mask2|...'. Маска содержит различные опции с точкой и запятой между ними. * означает любую строку. Например: 'bitmaps|*.bmp;*.wmf'. Если игрок нажимает (Cancel), возвращает пустую строку.
get_save_filename(filter,fname) — Спрашивает имя файла для сохранения с данным фильтром. Если игрок нажимает (Cancel), возвращает пустую строку.
get_directory(dname) — Запрашивает каталог. dname — название по умолчанию. Если игрок нажимает (Cancel), возвращает пустую строку.
get_directory_alt(capt,root)- Альтернативный способ запросить каталог. capt — название, которое будет отображено. root — корень дерева каталогов, который будет отображен. Используйте пустую строку, чтобы отобразить все дерево. Если игрок нажимает (Cancel), возвращает пустую строку.
show_error(str,abort)- Отображает стандартное сообщение об ошибке (и/или записывает его в log файл). abort — указывает должна ли игра прерваться.
Один специальный всплывающий экран — список лучших результатов, который используется в каждой игре. Существуют следующие функции:
highscore_show(numb) — Отображает таблицу лучших результатов. numb — новый игровой счет. Если имеющийся игровой счет достаточен для добавления в список, игрок может ввести свое имя. Используйте -1 чтобы просто показать текущий список.
highscore_clear() — Очищает список лучших результатов.
highscore_add(str,numb) — Добавляет игрока с именем (str) и счетом (numb) в список.
highscore_value(place) — Возвращает счет игрока на указанное место (1-10). Данная функция может быть использована, для рисования своего собственного списка лучших результатов.
highscore_name(place) — Возвращает имя человека на данное место (1-10).
Обратите особое внимание, что ни один из указанных всплывающих экранов не может быть отображен, если игра выполняется в исключительном графическом режиме!

 

Константы (Constants) в GML
Существуют следующие константы:
true Equal to 1 — истинно Равняется 1.
false Equal to 0 — ложно Равняется 0.
pi Equal to 3.1415… — Пи Равняется 3.1415...

 

Поддержка Джойстика в GameMaker
Хотя это может показаться странным, но Game Maker фактически имеет поддержку джойстика. Движения джойстика создают события клавиатуры 1 — 9 как на цифровой клавиатуре. Эти четыре кнопки генерируют события клавиатуры для символов A, B, C и D. Следовательно Вы можете воздействовать на них. Только учтите, что Вы не получите эту информацию при помощи функции keyboard_check(), потому что данная функция проверяет клавиатуру. Вместо этого существует целый набор функций, для работы с джойстиком. Game Maker поддерживает до двух джойстиков. Все указанные функции как параметр берут идентификатор джойстика.
joystick_exists(id) — Возвращает, если идентификатор джойстика (1 или 2) существует.
joystick_direction(id) — Возвращает клавиатурный код (vk_numpad1 к vk_numpad9) определяющий направление идентификатора джойстика (1 или 2).
joystick_check_button(id,numb) — Возвращает, если кнопка джойстика нажата (номер в диапазоне 1-4).
joystick_xpos(id) — Возвращает позицию (-1 до 1) X оси идентификатора джойстика.
joystick_ypos(id) — Возвращает y-позицию джойстика.
joystick_zpos(id) — Возвращает z-позицию джойстика (если он имеет z-ось).

 

 

Ролевые Истины. Часть 1: Как легко организовать систему опыта, level up’ов и характеристик в вашей игре Ролевые Истины. Часть 1: Как организовать систему опыта, level up’ов и характеристик в вашей игре

Здравствуйте, игроделы! Каждый любитель РПГ’шек, я уверен, после прохождения (или в процессе) какой-либо игрушки, загорался желанием создать свой собственный шедевр. Но если руки и «доходили» до этого, то почти всегда энтузиазм спадал на написании ролевой системы, и прокачки героя. Когда я только познакомился с Game Maker’ом, я тоже хотел сделать супер крутую РПГ. Уже продумал сюжет, героев, и всякие навороты придумал, но застопорился на этом самом месте. Тогда я ещё был только новичком в GM, поэтому забросил проект. Много позже я вновь вернулся к этой идее, уже подкреплённый средним знанием GML, и основными приёмами Гейм Мэйкера. В этой статье я расскажу, как я решил подобную проблему.
Для начала добавьте в ваш проект, спрайты игрока, пули и врага. Создайте для них объекты. Откройте объект игрока, сделайте так, чтобы он мог передвигаться по экрану и стрелял (как это сделать, подробно описано во многих статьях, поэтому я не стану снова переписывать сюда то, чего и так навалом). Теперь в объекте пули сделайте, чтобы при выстреле она летела куда нужно (это тоже описано во многих статьях).И, наконец в объекте врага ничего делать не нужно.
Добавьте ещё один любой спрайт, который вам нравится, и присвойте его новому объекту, (спрайт можете выбрать первый попавшийся, так как его всё равно не будет видно, а делается это просто для удобства). В нашем новом объекте в событие Create поставьте действие Set the value of variable. В поле переменной укажите global.experience (название переменной может быть любое, но не забудьте, что она отвечает за опыт), а значение оставьте 0. Это действие добавляет новую глобальную переменную опыта и присваивает ей значение 0. В событие Draw добавьте действие установки шрифта (Set a font for drawing text), в котором выберите шрифт, который вам больше нравится, и действие Draw a text, в нём запишите такую фразу: 'Опыт:'+string(global.experience), и поставьте галочку рядом с полем Relative. Сдублируйте данный объект три раза и на время отложите его.

В первой копии настройки действий должны быть такими (если какие-то поля не указанны, значит, их переправлять не нужно):
Create=> Set the value of variable=>Variable: global.level Value: 0
Draw=>Draw a text=>Text: 'Уровень: '+string(global.level)

Во второй:
Create=> Set the value of variable=>Variable: global.strenght Value: 5
Draw=>Draw a text=>Text: 'Сила: '+string(global.strenght)

В третьей:
Create=>Set the value of variable=>Variable: global.lovkost Value: 3
Draw=>Draw a text=>Text: 'Ловкость: '+string(global.lovkost)

Почти всё. Далее снова откройте первый объект «с опытом», и в событие Step добавьте такой код:

if global.experience>100
{
show_message('Вы получили новый уровень!')
if global.level<10
{
global.strenght+=1
}
if global.level<5
{
global.lovkost+=1
}
global.level+=1
global.experience=0
}

Этот код к томуже вводит некоторые ограничения на переменные, чтобы герой не был слишком супермэном. Разместите все объекты в комнате, и запустите игру. Если вы всё сделали правильно, то всё должно работать. Но пока ваши уровень, сила и ловкость ни на что не влияют. Оставите это так, мы, конечно не можем, поэтому придётся слегка переправить объект пули. Откройте его и удалите действия полёта пули. Вместо них в событие Create добавьте действие Set direction and speed of motion. В строке direction укажите направление полёта пули, а в строке speed пропишите следующее: global.lovkost. Это заставит пулю лететь со скоростью равной показателю ловкости. В событие столкновения пули с врагом добавьте такой код:

global.experience+=global.strenght
instance_destroy()

Более ничего делать не надо, можете запускать игру и прокачиваться в своё удовольствие.

При написании статьи использовалась программа версии 5.3А

 

 

Фоновые изображения (Backgrounds) в GML
Каждая комната может иметь до 8 фоновых изображений. Также имеется цвет для фона. Вы можете изменить любой из параметров фонов из части кода, используя следующие переменные (обратите внимание, что некоторые — массивы, которые располагаются от 0 до 7, указывают на разные фоны):
background_color — Цвет фона для комнаты.
background_showcolor — Очищать ли окно с окрашенным фоном.
background_visible[0..7] — Является ли определенное фоновое изображение видимым.
background_foreground[0..7] — Является ли фон в действительности изображением переднего плана (foreground).
background_index[0..7] — Индекс фонового изображения для фона (background).
background_x[0..7] — X позиция фонового изображения.
background_y[0…7] — Y позиция фонового изображения.
background_width[0…7]* — Ширина фонового изображения.
background_height[0…7]* — Высота фонового изображения.
background_htiled[0..7] — Горизонтальные ли плитки.
background_vtiled[0..7] — Вертикальные ли плитки.
background_hspeed[0..7] — Скорость горизонтального скроллинга фона (пикселей за шаг).
background_vspeed[0..7] — Скорость вертикального скроллинга фона (пикселей за шаг).
background_alpha[0..7] — Значение прозрачности (alpha), для использования при рисовании фона. Значение 1 — нормальная установка; значение 0 полностью прозрачно. Используйте с осторожностью. При рисовании частично прозрачного фона затрачивается больше времени и замедляется игра.
Фоновые изображения используют большое количество памяти. Чтобы рисовать их, достаточно быстро, бывает полезно сохранять их в видео памяти. Вы можете указать, какие фоны должны быть сохранены в видео памяти. Также Вы можете определить, какие фоны должны быть загружены только по мере необходимости. Такие фоны будут выгружены из памяти по окончанию уровня. Вы можете частично управлять данными процессами используя код. Существуют следующие функции:
background_discard(numb) — Освобождает (видео) память, используемую для фонового изображения. Если фон имеет свойство «load-on-use», то он будет полностью удален из памяти. Иначе, его копия останется в обычной памяти и такой фон может быть восстановлен в любой момент, когда это будет необходимо.
background_restore(numb) — Восстанавливает фоновое изображение в (видео) памяти. Обычно это происходит автоматически, когда фон необходим. Но иногда могут возникнуть проблемы, в особенности когда установлена опция «load-on-use», и фон большой. Таким образом Вы можете насильно загрузить его, например в начале уровня, в котором данный фон необходим.
discard_all()- Выгружает из памяти все спрайты, фоны и звуки, которые имеют установку «load-on-use».
Когда игра использует много разных, больших по размеру, фоновых изображений, это делает игровой файл большим и как следствие значительно замедляется загрузка. Также, если Вы хотите сохранить их в памяти, в момент когда они понадобятся, это значительно увеличивает объем требуемой памяти. Как альтернативу, Вы можете использовать фоновые изображения к игре в виде (.bmp, .jpg или .gif файлов; другие форматы не поддерживаются) и загружать их в процессе игры. Для этого существуют три подпрограммы. Другое использование, когда Вы хотите позволить игроку выбирать фоновое изображение. Также, Вы можете захотеть сохранить изображение из игры и использовать его позже в виде фона (например для программы рисования). Наконец, сложные фоны, сохраненные в виде jpg файлов используют намного меньше памяти. Имеются функции:
background_add(fname,transparent,videomem,loadonuse) — Добавляет изображение, сохраненное в файле fname в набор фоновых ресурсов. Поддерживаются только bmp, jpg и gif изображения. transparent указывает, является ли изображение частично прозрачным, videomem указывает, должен ли фон быть сохранен в видео памяти и loadonuse указывает, должен ли фон быть загружен только когда он используется. Функция возвращает индекс нового фона, чтобы Вы могли его тогда использовать, для рисования фона или назначения его в качестве переменной background_index[0], чтобы сделать его видимым в текущей комнате. Когда происходит ошибка возвращается -1.
background_replace(ind,fname,transparent,videomem,loadonuse) — То же самое что и выше, но в данном случае фон с индексом ind заменяется. Функция возвращается, если ли замена была успешной. Если фон в настоящее время является видимым в данной комнате, то он также может быть заменен.
background_delete(ind) — Удаляет фон из памяти, освобождая используемую память. (Он больше не может быть восстановлен).
ПРЕДУПРЕЖДЕНИЕ: Если Вы в течение игры ты сохраняете игровое состояние (записываете игру), добавленные или измененные фоновые изображения, в записанной игре, не сохраняются. Таким образом, если Вы позже загрузите записанную игру, их там не будет больше. Также существуют некоторые сложности, связанные с авторским правом на распространение и использование gif файлов, с Вашими (коммерческими) приложениями. В связи с чем советуем не использовать их.

 

Файлы

 

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

 

file_text_open_read(fname) Открывает файл с указанным именем для чтения. Функция возвращает id файла, что должно быть использовано в других функциях. Вы можете открыть много файлов в то же самое время (32 максимум). Не забывайте закрывать их, когда они завершат свои действия.

file_text_open_write(fname) Открывает указанный файл для записи и создаёт файл, если он не существует. Функция возвращает id файла, что должно быть использовано в других функциях.

file_text_open_append(fname) Открывает указанный файл для добавления данных при завершении, создаёт их, если они не существует. Функция возвращает id файла, что должно быть использовано в других функциях.

file_text_close(fileid) Закрывает файл с заданным id.

file_text_write_string(fileid,str) Записывает строку в файл с заданным id.

file_text_write_real(fileid,x) Записывает реальную величину в файл с заданным id.

file_text_writeln(fileid) Записывает символ новой строки в файл.

file_text_read_string(fileid) Читает строку из файла с заданным id и возвращает эту строку. Строка заканчивается в конце линии.

file_text_read_real(fileid) Читает реальную величину из файла и возвращает эту величину.

file_text_readln(fileid) Пропускает остальную часть линии в файл и начинает в начале следующей строки.

file_text_eof(fileid) Возвращает, если достигнуто окончание файла.

 

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

 

file_exists(fname) Возвращает, когда файл с заданным именем существует (истина) или не существует (ложь).

file_delete(fname) Удаляет файл с заданным именем.

file_rename(oldname,newname) Переименовывает файл с именем oldname в newname.

file_copy(fname,newname) Копирует файл fname в newname.

directory_exists(dname) Возвращает, если существует указанная директория.

directory_create(dname) Создаёт директорию с заданным именем (включая путь к ней), если она не существует.

file_find_first(mask,attr) Возвращает имя первого файла, который подходил маске и атрибутам. Если такой файл не существует, возвращается пустая строка. Маска может содержать путь и может содержать специальные символы, например 'C:\temp\*.doc. Атрибуты предоставляют дополнительные файлы, которые Вы хотите видеть. (Так что нормальные файлы всегда возвращаются, когда они подходят маске.) Вы можете добавить следующие константы, чтобы увидеть тип файлов:

 

fa_readonly файлы только для чтения

fa_hidden скрытые файлы

fa_sysfile системные файлы

fa_volumeid файлы тома-идентификатора

fa_directory директории

fa_archive архивные файлы

 

 

file_find_next() Возвращает имя следующего файла, который подходит заданной маске и атрибутам. Если такой файл не существует, то возвращается пустая строка.

file_find_close() Должно быть вызвано после обработки всех файлов, чтобы освободить память.

file_attributes(fname,attr) Возвращает, если файл имеет все атрибуты в attr. Используйте комбинацию вышеуказанных констант.

 

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

 

filename_name(fname) Возвращает часть имени указанного файлового имени с расширением, но без пути.

filename_path(fname) Возвращает часть пути указанного файлового имени, включая обратную косую черту.

filename_dir(fname) Возвращает часть директории указанного файлового имени, это нормально, так же как и полный путь, но за исключением обратной косой черты.

filename_drive(fname) Возвращает информацию устройства filename.

filename_ext(fname) Возвращает часть расширения указанного файлового имени, включая подачу точки.

filename_change_ext(fname,newext) Возвращает указанное файловое имя, с расширением (включая точку) изменённое в новое расширение. Используйте пустую строку как новое расширение. Вы также можете удалить расширение.

 

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

 

file_bin_open(fname,mod) Открывает файл с указанным именем. Режим указывает, что может подходить файлу: 0 = чтение, 1 = запись, 2 = как чтение, так и запись. Функция возвращает id файла, что должно быть использовано в других функциях. Вы можете открыть многочисленные файлы в то же самое время (32 максимум). Не забывайте закрывать их, как только они завершат свои действия.

file_bin_rewrite(fileid) Перезаписывает файл с заданным id, то есть, очищает его и начинает записывать в начале.

file_bin_close(fileid) Закрывает файл с заданным id.

file_bin_size(fileid) Возвращает размер (в байтах) файла с заданным id.

file_bin_position(fileid) Возвращает текущую позицию (в байтах; 0 — первая позиция) файла с заданным id.

file_bin_seek(fileid,pos) Перемещает текущую позицию файла на указанную позицию. Чтобы добавить позицию перемещения файла по размеру с перезаписываемым файлом.

file_bin_write_byte(fileid,byte) Записывает байт данных в файл с заданным id.

file_bin_read_byte(fileid) Читает байты данных из файла и возвращает его.

 

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

 

Следующие три переменные предназначенные «только для чтения» могут быть полезны:

 

game_id* Уникальный идентификатор для игры. Вы можете использовать его, если Вам нужны уникальные имена файлов.

working_directory* Прокладывает директорию для игры. (Не включая обратную косую черту.)

temp_directory* Создаёт временную директорию для игры. Вы можете загрузить временные файлы в эту папку. Они будут удалены в конце игры.

 

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

 

parameter_count() Возвращает число параметров командной строки (отметьте, что само имя программы — одно из них.

parameter_string(n) Возвращает параметры командной строки n. Первый параметр имеет индекс 0. Это — имя программы.

 

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

 

environment_get_variable(name) Возвращает величину (строки) переменной среды с заданным именем.

 

Реестр

 

Если Вы захотите загрузить небольшое количество информации между запусками игры — существует более простой механизм, чем использование файла. Вы можете использовать регистр. Реестр является большой базой данных, поддерживаемой Windows, чтобы следить за своего рода установочными параметрами программ. Вход имеет имя и величину. Вы можете использовать как строки, так и реальные величины. Для этого существуют следующие функции:

 

registry_write_string(name,str) Создаёт вход в реестр с заданной величиной имени и строки.

registry_write_real(name,x) Создаёт вход в реестр с заданным именем и реальной величиной.

registry_read_string(name) Возвращает строку, которое содержит заданное имя. (Имя должно существовать — в противном случае возвращается пустая строка.)

registry_read_real(name) Возвращает реальную строку, которая содержит заданное имя. (Имя должно существовать. В противном случае возвращается число 0.)

registry_exists(name) Возвращает существующее заданное имя.

 

На самом деле величины в реестре сгруппированы в ключах. Все вышеуказанные программы работают в величинах в пределах ключей, особенно те, которые создаются для Вашей игры. Ваша программа может использовать это, чтобы получить определённую информацию о системе, когда игра работает. Вы можете также прочитать величины в других ключах. Вы также можете записать их, но будьте очень осторожны. ВЫ ЛЕГКО МОЖЕТЕ УНИЧТОЖИТЬ СВОЮ СИСТЕМУ таким образом. (Запись не разрешена в безопасном режиме.) Отметьте, что ключи опять же устанавливаются в группах. Следующие программы по умолчанию работают в группе HKEY_CURRENT_USER. Но Вы можете изменить корневую группу. Так, например, если Вы хотите обнаружить текущую временную директорию, используйте

 

path = registry_read_string_ext('\Environment','TEMP');

 

Существуют следующие функции:

 

registry_write_string_ext(key,name,str) Создаёт вход в ключе реестра с заданной величиной имени и строки.

registry_write_real_ext(key,name,x) Создаёт вход в ключ реестра с заданным именем и реальной величиной.

registry_read_string_ext(key,name) Возвращает строку, это заданное имя в указанных ключевых хранилищах. (Имя должно существовать. В противном случае — возвращается пустая строка.)

registry_read_real_ext(key,name) Возвращает реальный ключ с заданным именем в указанных ключевых хранилищах. (Имя должно существовать. В противном случае вовращается число 0.)

registry_exists_ext(key,name) Возвращает существующее заданное имя в заданном ключе.

registry_set_root(root) Устанавливает корень для других программ. Используйте следующие величины:

 

0 = HKEY_CURRENT_USER

1 = HKEY_LOCAL_MACHINE

2 = HKEY_CLASSES_ROOT

3 = HKEY_USERS

 

INI файлы

 

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

 

[Form]

 

Top=100

 

Left=100

 

Caption=The best game ever

 

[Game]

 

MaxScore=12324

 

Этот файл содержит две секции: первая — Форма вызова, и вторая — название Игры. Первая секция содержит три пары. Первые две пары имеют реальную величину, пока третья имеет величину строки. Такие файлы INI легко могут создаваться и изменяться в Game Maker. Для этого существуют следующие функции:

 

ini_open(name) Открывает файл INI с указанным именем. Файл ini должен быть загружен в одну папку с игрой!

ini_close() Закрывает к настоящему времени открытый INI файл.

ini_read_string(section,key,default) Читает величину строки указанного ключа в указанной секции. Когда ключ или секция не существует, значение возвращается по умолчанию.

ini_read_real(section,key,default) Читает реальную величину указанного ключа в указанной секции. Когда ключ или секция не существует, значение возвращается по умолчанию.

ini_write_string(section,key,value) Записывает величину строки для указанного ключа в указанной секции.

ini_write_real(section,key,value) Записывает реальную величину для указанного ключа в указанной секции.

ini_key_exists(section,key) Возвращает существующий указанный ключ в указанной секции.

ini_section_exists(section) Возвращает существующую указанную секцию.

ini_key_delete(section,key) Удаляет указанный ключ из указанной секции.

ini_section_delete(section) Удаляет указанную секцию.

 

Выполняемые программы

 

Game Maker также имеет возможность запускать внешние программы. Для этого доступны две функции: execute_program и execute_shell. Функция execute_program запускает программу и, возможно, некоторые аргументы. Эта функция может ожидать завершения программы (пауза игры) или продолжения игры. Функция execute_shell открывает файл. Это может быть любой файл, для которого определена некоторая ассоциация, например html файл, текстовый файл и т.п. Или это может быть программой. Эта функция не может ожидать завершения, а продолжит игру.

 

execute_program(prog,arg,wait) Выполнять программу prog с аргументами arg. wait — указывает ожидания перед завершением.

execute_shell(prog,arg) Выполняет программу (или файл) в оболочке.

 

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

 

secure_mode* Игра работает в Безопасном режиме.

 

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

 

sound_play(index) Проигрывает указанный звук. Если звук является фоновой музыкой, то текущая фоновая музыка останавливается.

sound_loop(index) Проигрывает звук с указанным именем непрерывно. Если звук является фоновой музыкой, то текущая фоновая музыка останавливается.

sound_stop(index) Останавливает звук с указанным именем. Если имеются множественные звуки с этим индексом проигрывающимися одновременно, то все будут остановлены.

sound_stop_all() Останавливает все звуки.

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

 

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

 

sound_volume(index,value) Изменяет громкость для указанного звука (0 = низкий уровень, 1 = высокий).

sound_global_volume(value) Изменяет основную громкость для всех звуков (0 = низкий уровень, 1 = высокий).

sound_fade(index,value,time) Изменяет громкость для указанного звука на новое значение (0 = низкий уровень, 1 = высокий) в течение указанного времени (миллисекунд). Это может быть использовано, чтобы ослабевать или усиливать музыку.

sound_pan(index,value) Изменяет панораму для указанного звука (-1 = влево, 0 = центр, 1 = вправо).

sound_background_tempo(factor) Изменяет темп фоновой музыки (если это midi файл). factor — указывает показатель, с которым будет ускоряться темп. Значение 1 относиться к нормальному темпу. Большие значения — более быстрый темп, меньшие значения — медленный темп. Значения должны бы

еще рефераты
Еще работы по информатике