Комнаты - вид игровых ресурсов, место взаимодействия экземпляров объектов.
В отличии от остальных ресурсов, в списке комнат важен их порядковый номер.
Любую комнату можно охарактеризовать как
первая, последняя, предыдущая или следующая. Рассмотрим на примере.
Рассмотрим на конкретном примере. Допустим у нас есть такой список комнат
r_start
r_menu
r_01
r_02
r_end
Ясно, что r_start будет комнатой, которую можно назвать "первая". Но она же и является "предыдущей" для r_menu. В свою очередь r_menu будет "следующей" для r_start и "предыдущей" для r_01... И в конец концов r_end будет "последней" и "следующей" для r_02. Следует запомнить эту небольшую классификацию.
Также к комнатам относится 2 понятия:
индекс комнаты - название игрового ресурса; и
имя комнаты - её заголовок.
Теперь поясню про заголовок.
Заголовок (или имя) комнаты - надпись на окне приложения сверху.
Заголовок комнаты содержится в переменной room_caption (по умолчанию пустая строка). Через эту переменную можно напрямую изменять имя комнаты. Например (обратите внимание на событие):
room_caption="My first game"
или
caption="my game";
a=4
room_caption="It is "+caption+string(a);
Важно помещать изменение заголовка в событие Step, потому что каждый шаг имя комнаты сбрасывается (становится равным пустой строке), и приходится каждый шаг его возвращать.
Теперь обсудим основное свойство комнат - переходы.
Можно во время игры перейти в любую комнату при помощи
room_goto(индекс)
например
room_goto(r_menu)//r_menu комната из нашего списка (см. выше)
Но зачастую нам нужно перейти не в определённую комнату, а в "следующую" или "предыдущую" (вспоминайте классификацию)
Для этого пользуемся соответствующими функциями
room_goto_next() и
room_goto_previous()Помните, что для каждой комнаты уникальный набор из следующей и предыдущей комнаты.
Но тут получается заминка. У первой комнаты нет предыдущей, равно как и у последней комнаты не следующей. Здравый смысл (и кэп) подсказывают нам, что нужно выполнять проверку на возможность перейти. В этом нам помогут особые переменный (ВНИМАНИЕ! эти переменные нельзя изменить)
room - содержит индекс текущей комнаты
room_first - содержит индекс первой комнаты
room_last - содержит индекс последней комнаты
То есть проверка будет выглядеть следующим образом
if(room!=room_last)
{
room_goto_next()
}
или
if(room!=room_first)
{
room_goto_previous()
}
room_first и room_last можно использовать в качестве аргумента к функции room_goto(). Не запрещено также пользоваться choose, к примеру
room_goto(choose(room_last, room_first))
Для перехода в случайную комнату
из всех возможных пользуйтесь конструкцией
room_goto(irandom(room_last))
или, чтобы комнаты не повторялись...
do
{
p=irandom(room_last)
}until(p!=room)
room_goto(p)
Смысл этих записей мы непременно рассмотрим в одном из следующих уроках.
Последняя тема, которую мы заденем будет манипулирование комнатами "на лету"
"на лету" - значит во время исполнения игры, динамически, при помощи кода.
room_set_width(ind,w) - устанавливает ширину w для комнаты с индексом ind.
room_set_height(ind,h) - устанавливает высоту h для комнаты с индексом ind.
room_set_caption(ind,str) - устанавливает заголовок окна str для комнаты с индексом ind.
Также, хочу представить вам функцию, которая, возможно не часто будет использоваться в вашей игре, но она поможет вам немного сэкономить размер игры.
room_instance_add(ind,x,y,obj) - добавляет экземпляр объекта с индексом obj в точку с координатами (x,y) комнаты с индексом ind. Возвращает индекс создаваемого экземпляра (как и в instance_create, только instance_create создаёт объект в текущей комнате).
Давайте подумаем для чего может понадобиться эта функция? Если у вас есть несколько комнат, которые различаются одним или двумя объектами, то эта функция спасёт вас. Допустим такая ситуация:
Стартовая комната. В ней невидимый объект, который контролирует нажатие клавиш. Если нажали Q,то переходит в комнату, в которой другой невидимый объект пишет, что нажали Q-клавишу. Аналогично с клавишами W и E. Попробуем реализовать.
Прочитав внимательно, создадим необходимые ресурсы: 2 комнаты (стартовая и в которую переходим), 4 объекта (один в стартовой комнате и 3 для клавиш). В первом объекте (сразу поместите его в стартовую комнату) определяем 3 события: Key Press Q, Key Press W и Key Press E. Остальные три объекта назовём соответственно Qkey, Wkey и Ekey. У каждого в событии рисования поставим приблизительно следующее:
draw_text(3, 3, "Вы нажали клавишу Q")//не забудьте включить русский текст
draw_text(3, 3, "Вы нажали клавишу W")
draw_text(3, 3, "Вы нажали клавишу E")
И теперь в первом объекте (назовём его main) пропишем:
room_instance_add(room1, 0, 0, Qkey)
room_set_caption(room1, "Q key pressed!");
room_goto(room1)
Думаю сообразите что написать в событиях Key Press W и Key Press E
ВНИМАНИЕ! Комната room1 должна быть изначально пуста.
Протестируйте получившийся пример. Думаю объяснил более-менее понятно.
ВНИМАНИЕ! Если бы в реальной игре стояла
только такая задача, то решать бы её пришлось другим, более простым способом. В данном примере подразумевается, что объекты Qkey, Wkey и Ekey содержат в себе ещё километровые коды и исход игры зависит от того, какой объект поставить.
Думаю, на сегодня хватит.)
Задания.
Новички:
1) Создайте игру по описанию. В игре 2 комнаты и 2 объекта: один объект-контроллер (в первой комнате) и объект-переходник (во второй комнате). Если игрок нажмёт клавишу W, то предлагается ввести новую ширину окна и собственно ширина
другой комнаты меняется на новую. Аналогично при нажатии клавиши h те же операции с высотой. Сделайте так, что при введении пользователем отрицательного числа или нуля, выскакивало сообщение, говорящее, что нельзя вводить числа такого типа. После ввода числа пусть игра переходит в следующую комнату. Во второй комнате если нажать Пробел, то игра переходит обратно в первую комнату (прописать у второго объекта).
Среднечки:
1) Создайте игру по описанию. Первая комната - меню (2 пункта: Новая игра и Выйти. Большее количество пунктов приветствуется). При нажатии "Новая игра" действие переносится в другую комнату, где есть 3 объекта (к примеру синий, зелёный и красный шарик) и игрок (управление на стрелках). Реализуйте примерно следующее: если игрок сталкивается с синим шариком, то переходим в следующую комнату, где ждёт синий враг; с зелёным - зелёный враг; с красным - красный враг. В заголовке пусть пишется цвет врага. Для всего этого используйте манипулирование "на лету". У врагов должно быть разное количество жизней (чтобы отличать). Они должны двигаться рандомно (менять своё направление). Реализовать битву (например при нажатии на пробел, игрок стреляет: пуля летит к врагу и наносит ему урон). При смерти врага выводить сообщение о победе и переходить в комнату меню.
На самом деле всё не так сложно, как кажется, но на всякий случай я отвожу вам 2 недели на выполнение задания