Привет всем, юные ГМ юзеры!

Сегодня я опишу вам авторские (мои) советы о том, как решать задачи ГМ.
Начнём так: чтобы решать возникнувший у вас вопрос, вы должны чётко сформулировать (поставить) задачу. Вот простой пример.
В начале игры показывают сообщение Привет! Через 2 секунды у игрока спрашивают число. После этого, когда он будет нажимать пробел, то будут показывать квадрат этого числа.
Найдём здесь несколько ключевых слов.
I раздел - События
1)
В начале игры или
Сначала. Выберем для этого событие Create (от англ Создание) (PS можно было бы и Game Start, но и Create
пока ошибкой не будет). Вспоминаем прошлый урок. Какой функцией можно показать сообщение? Конечно же show_message. Итог: в событии Create пишем
show_message("Привет!")
2)
Через n секунд. Это событие alarm. Только нужно разобраться с игровым временем. Зайдите в любую комнату, в вкладку Settings (Установки) и увидите поле room speed (Скорость). Это множитель времени. Это количество шагов, проходящих в 1 секунду. Это число содержится в переменной
room_speed. Это намного умнее и выгоднее записывать скорость комнаты в виде room_speed, так как если вы смените скорость комнаты, то вам не придётся менять его в коде. room_speed не константа, так что запись
room_speed=50
будет считаться вполне законной. По умолчанию стоит всегда 30. Всё игровое время измеряется в шагах.
Итак, если 1 секунда это 30 шагов, то 2 секунды соответственно = 2*30
Свойство alarm'а таково, что это событие нужно объявить где нибудь. Объявляется оно таким образом:
alarm[<число_от_0_до_11>]=<число_НЕОТРИЦАТЕЛЬНОЕ!>
Отрицательное число равносильно сбросу таймера. Совет: не насилуйте таймер. Ставьте его номер (в квадратных скобках) начиная с нуля и по порядку. Вам так будет намного легче. Вот мы с вами будем придерживаться этой прописной истинны и в событие Create
допишем
alarm[0]=2*30//равносильно двум секундам
Теперь можем перейти к самому событию Alarm. Их вообще 12 штук. Это значит, что одновременно можно запустить 12 таймеров. Мы запустили таймер с номером 0, значит событие у нас alarm0
num=get_integer('Введите любое число для дальнейшего использования', 0)//запрашиваем число
Этот этап пройден.
3)
Каждые n секунд - эта фраза воплощается в жизнь так же, как и предыдущая, только после всего кода в событии AlarmX должна стоять строчка
alarm[x]=n*30//где х - номер таймера (от 0 до 11); n - количество секунд
Для того, чтобы отсчитывались минуты, соответственно ещё умножаем на 60
Многие могут спросить: а почему не Step? Когда мы заводим таймер, то каждый шаг его значение убывает на 1, и, когда оно становится равным нулю, выполняется действие, предназначенное для него. Если мы поставим выбор таймера в Step, по каждый шаг оно будет оставаться неизменным, и событие alarm'а никогда не выполнится.
4)
Когда нажали <Клавиша>. (То есть у нас: Когда нажали <Пробел>). Тут важно понимать принципиальную разницу: "Когда нажали" (то есть сам момент нажатия) и "Всё время, пока зажата клавиша". Если первое, то читайте дальше, а если второе, то смотрите следующий пункт. В нашем случае подходит первый вариант. Это событие "нажатие клавиши" или Key Press (

). Выбираем это событие и ищем нужную нам клавишу из выпадающего меню (в нашем случае <Space>). Далее определяемся с кодом. Нас просят показать сообщение, содержащее квадрат введённого числа (num). Немного поразмыслив получаем
show_message(num*num)
или
show_message(sqr(num))
5)
Пока нажата клавиша - это другой вариант. Это просто событие Keyboard (

). Остальное остаётся
6)
Всё время. Тут то же нужно самого себя понять: что вам выгоднее, именно всё время или всё же через какой то определённый промежуток времени? Первое - это событие Step (от англ Шаг

); второе - событие Alarm (смотри выше)
7)
*Всё, что связано с мышью* - события мыши. И теперь познакомимся с двумя полуконстантами. Это означает, что они меняются в течении игры, но самостоятельно их менять нельзя.
mouse_x - содержит x-координату мыши
mouse_y - содержит y-координату мыши
Исходя из определения запись
mouse_x=5 или mouse_y=12
Будут просто преступлением. (выйдет ошибка проще говоря)
Координатная сетка мыши строится так же, как и обычная
Некоторые типы игр очень тесно связаны с мышью. К примеру альтернативное управление в ТДС:
direction=point_direction(x, y, mouse_x, mouse_y)
image_angle=direction
Между прочим это является типичным штампом.
8)
Когда <имя_объекта1(может даже сам)> сталкивается с <имя_объекта2(может даже сам)>Тут тоже должно быть понятно: событие столкновения объекта1 с объектом2. При этом если вы прописываете в объекте1, то столкновение первого со вторым, иначе столкновение второго с первым.
9)
Когда закончится анимация. Событие Animation End (вкладка Other - Другое). Обычно в действии пишут остановку анимации (image_speed=0) и т. д.
Тут всё по событиям. Переходим к действиям
II раздел - Действия
1)
Если <условие> , то <действие>
Используем оператор if
Конструкция будет выглядеть так
if(<условие>)
{
<действие>
}
Пример:
Если переменная vari будет равна 7 (
условие),
то переменная vari2 станет равна 1 (действие). В переводе на GML будет:
if(vari=7)
{
vari2=1
}
2)
иначе - уже знакомый нам оператор else. ВНИМАНИЕ! Нельзя установить else в отдельности от оператора if (если). То есть такие примеры как
else
{
sprite_index=s_up
}
или
if(a)
{
else
{
s-=1
}
}
Будут жёстко наказываться ГМ раннером. Будьте бдительны!
3)
<некоторое действие> повторяется n раз. Тут нужно выбрать один из операторов: for или repeat. О них подробней о них в уроке 0
repeat(n)// n - количество раз
{
<действие>
}
или
for(i=0; i<n; i+=1)
{
<действия>
}
4) До тех пор пока <условие> выполняется <действие>.
Нам на помощь придёт оператор while
while(условие)
{
действие
}
5)
Спрайт меняется на <имя_спрайта>. Согласно списку выше вы выбираете событие (нажатие клавиши, по истечению времени и т д)
6)
Анимация начинается проигрываться. Пишем image_angle=<скорость анимации>. Но предлагаю ещё раз почитать
тут как правильно выбрать скорость анимации.
7)
Остановить анимацию - действуем аналогично - image_speed=0. Обычно это ставят в событие Animation End, но вы в праве прописать это где угодно, на ваше усмотрение.
И напоследок вернёмся к примеру, который мы разбирали. У нас там написано через 2 секунды только спрашивают число. А если нажать пробел раньше, чем программа запросит число, то у нас вылезет ошибка (попробуйте так сделать). Это считается багом, и нам требуется его исправить. Самое простое - глянуть в
эту тему и узнать, что один из вариантов решения проблемы - объявить переменную num в событии Create.
num=0
Но тут получается небольшая загвоздка. Мы ничего не вводили, а по нажатию пробела показывается 0. Надо эту проблему тоже решать. Сейчас я продемонстрирую способ булевых переменных, который советую вам запомнить, потому что очень много пользовательских вопросов завязано на не знании этого способа.
1) Заведём переменную, которая должна отвечать за показ сообщения, на пример show
show=false//сообщения не показываем
2) Теперь поставим условие: если show даёт добро (или попросту имеет значение true), то показываем сообщение (II раздел, 1 пункт)
if(show)
{
//показываем сообщение (сами напишите)
}
3) Теперь надо определить, когда мы разрешаем показывать сообщения - это когда пройдёт 2 секунды. Значит идём в событие аларма и после того, как нас спросят о числе, мы напишем
//предыдущий код
show=true
Вот и всё.
Несмотря на простоту, этот способ часто используем и универсален. Главное уметь найти ситуацию, когда способ булевых переменных выгодно применять!
Урок окончен, но я вас задержу, чтобы сообщить новость. Наша импровизированная четверть подходит к концу. Следующий урок - контрольный. Его содержание вы сможете найти через неделю в соответствующем разделе. На его выполнение отводится 2 недели. За это время вы сможете выполнить все задания и сдать долги, переделать неудачные работы. Успехов!
Задания:
I Новички
1) Сделайте игру по следующему описанию:
Когда нажали клавишу вверх, то через 1 секунду показывается сообщение, в котором написано x- координата мыши. Когда нажали клавишу вниз, то через 2 секунды показывается сообщение, содержащее y-координату мыши
II Среднечки
1) Сделайте игру по следующему описанию:
Если нажали клавишу G, то программа запрашивает число. При нажатии клавиши Enter выводится квадратный корень этого числа. Вводит число можно только один раз, то есть если после этого нажимать клавишу G, то ничего происходить не будет. Используйте способ булевых переменных.