Game Maker - создание игр | HellRoom Games
Июнь 19, 2025, 02:30:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Ссылки на события
  • Новый урок в школе GML: Май 01, 2011 - Май 04, 2011
Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Урок 5. Практические советы. ПКР№1  (Прочитано 27587 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Hummer
scio me nihil scire
GM Pro user
*

Репутация: 335
Offline Offline

Пол: Мужской
Награды:
2000 сообщений!За постоянность! [100 дней на форуме]За лояльность! [+300 репутации]Знаток Game Maker!За помощь новичкам!
API: Game Maker 8.0 Pro
Деятельность: GML, С++, OpenGL, Java. Бывший Директор бывшей школы GML
Сообщений: 2573


« : Апрель 29, 2011, 12:00:58 »

Привет всем, юные ГМ юзеры!
Сегодня я опишу вам авторские (мои) советы о том, как решать задачи ГМ.
Начнём так: чтобы решать возникнувший у вас вопрос, вы должны чётко сформулировать (поставить) задачу. Вот простой пример.

Цитировать
В начале игры показывают сообщение Привет! Через 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.
Код: (Create)
num=0
Но тут получается небольшая загвоздка. Мы ничего не вводили, а по нажатию пробела показывается 0. Надо эту проблему тоже решать. Сейчас я продемонстрирую способ булевых переменных, который советую вам запомнить, потому что очень много пользовательских вопросов завязано на не знании этого способа.
1) Заведём переменную, которая должна отвечать за показ сообщения, на пример show
Код: (Create(ничего не убираем, а постоянно дополняем))
show=false//сообщения не показываем
2) Теперь поставим условие: если show даёт добро (или попросту имеет значение true), то показываем сообщение (II раздел, 1 пункт)
Код: (Нажатие пробела)
if(show)
{
//показываем сообщение (сами напишите)
}
3) Теперь надо определить, когда мы разрешаем показывать сообщения - это когда пройдёт 2 секунды. Значит идём в событие аларма и после того, как нас спросят о числе, мы напишем
Код: (Alarm0)
//предыдущий код
show=true
Вот и всё.
Несмотря на простоту, этот способ часто используем и универсален. Главное уметь найти ситуацию, когда способ булевых переменных выгодно применять!

Урок окончен, но я вас задержу, чтобы сообщить новость. Наша импровизированная четверть подходит к концу. Следующий урок  - контрольный. Его содержание вы сможете найти через неделю в соответствующем разделе. На его выполнение отводится 2 недели. За это время вы сможете выполнить все задания и сдать долги, переделать неудачные работы. Успехов!

Задания:
I Новички
1) Сделайте игру по следующему описанию:
Когда нажали клавишу вверх, то через 1 секунду показывается сообщение, в котором написано x- координата мыши. Когда нажали клавишу вниз, то через 2 секунды показывается сообщение, содержащее y-координату мыши

II Среднечки
1) Сделайте игру по следующему описанию:
Если нажали клавишу G, то программа запрашивает число. При нажатии клавиши Enter выводится квадратный корень этого числа. Вводит число можно только один раз, то есть если после этого нажимать клавишу G, то ничего происходить не будет. Используйте способ булевых переменных.
« Последнее редактирование: Сентябрь 04, 2011, 10:40:18 от Hummer » Записан

Есть вещи, которые нельзя объяснить. Для всего остального есть Справка
Рандом-рандом-рандомище (с)

C++ & OpenGL
illidan
Участник
****

Репутация: 10
Offline Offline

Пол: Мужской
API: Game Maker 8.0 Pro
Деятельность: ...
Сообщений: 114

Архимаг


« Ответ #1 : Май 01, 2011, 17:20:28 »

Спасибо за уроки... ;)
Записан

"Во тме ночной, при свете дня, злу не укрыться от меня!"
G_CCompany
Посетитель
**

Репутация: 2
Offline Offline

API: 8.0 Pro
Сообщений: 40


« Ответ #2 : Май 01, 2011, 17:22:09 »

Уже сделал задание :)
Записан
Hummer
scio me nihil scire
GM Pro user
*

Репутация: 335
Offline Offline

Пол: Мужской
Награды:
2000 сообщений!За постоянность! [100 дней на форуме]За лояльность! [+300 репутации]Знаток Game Maker!За помощь новичкам!
API: Game Maker 8.0 Pro
Деятельность: GML, С++, OpenGL, Java. Бывший Директор бывшей школы GML
Сообщений: 2573


« Ответ #3 : Май 01, 2011, 17:31:48 »

Ну я планирую ещё задание добавить

Добавлено: Май 01, 2011, 17:32:29
Но если чесно прошлые на мой взгляд были лучше!
А что такое?
Записан

Есть вещи, которые нельзя объяснить. Для всего остального есть Справка
Рандом-рандом-рандомище (с)

C++ & OpenGL
G_CCompany
Посетитель
**

Репутация: 2
Offline Offline

API: 8.0 Pro
Сообщений: 40


« Ответ #4 : Май 01, 2011, 17:35:45 »

Я думаю, что здесь как бы больше повторения, ничего нового, вот он и говорит, что раньше было лучше.
Hummer, уточнение к заданию для среднечков: если нажал клавишу G, то больше её нажимать нельзя, даже если не нажал Enter?
Записан
Hummer
scio me nihil scire
GM Pro user
*

Репутация: 335
Offline Offline

Пол: Мужской
Награды:
2000 сообщений!За постоянность! [100 дней на форуме]За лояльность! [+300 репутации]Знаток Game Maker!За помощь новичкам!
API: Game Maker 8.0 Pro
Деятельность: GML, С++, OpenGL, Java. Бывший Директор бывшей школы GML
Сообщений: 2573


« Ответ #5 : Май 01, 2011, 17:38:10 »

А не проще задание для новичков, раз ты там записан?
На контрольной это не простится.
Записан

Есть вещи, которые нельзя объяснить. Для всего остального есть Справка
Рандом-рандом-рандомище (с)

C++ & OpenGL
G_CCompany
Посетитель
**

Репутация: 2
Offline Offline

API: 8.0 Pro
Сообщений: 40


« Ответ #6 : Май 01, 2011, 18:01:45 »

А не проще задание для новичков, раз ты там записан?
На контрольной это не простится.
Мне просто интересно. Неужели я и спросить не могу?
Записан
Hummer
scio me nihil scire
GM Pro user
*

Репутация: 335
Offline Offline

Пол: Мужской
Награды:
2000 сообщений!За постоянность! [100 дней на форуме]За лояльность! [+300 репутации]Знаток Game Maker!За помощь новичкам!
API: Game Maker 8.0 Pro
Деятельность: GML, С++, OpenGL, Java. Бывший Директор бывшей школы GML
Сообщений: 2573


« Ответ #7 : Май 01, 2011, 18:39:34 »

ок
Hummer, уточнение к заданию для среднечков: если нажал клавишу G, то больше её нажимать нельзя, даже если не нажал Enter?
Да. G можно нажать один и только один раз
Записан

Есть вещи, которые нельзя объяснить. Для всего остального есть Справка
Рандом-рандом-рандомище (с)

C++ & OpenGL
illidan
Участник
****

Репутация: 10
Offline Offline

Пол: Мужской
API: Game Maker 8.0 Pro
Деятельность: ...
Сообщений: 114

Архимаг


« Ответ #8 : Май 02, 2011, 00:16:25 »

Я думаю, что здесь как бы больше повторения, ничего нового, вот он и говорит, что раньше было лучше.
Ну ты почти прав.
PS : это не значит, что этот плохой!!! Уважуха Это чисто мое субьективное мнение. Удачи в написании следующих уроков. Буду ждать! ;)
Записан

"Во тме ночной, при свете дня, злу не укрыться от меня!"
redeek789789789
«Старожил форума»
******

Репутация: 42
Offline Offline

Пол: Мужской
Награды:
500 сообщений!За постоянность! [10 дней на форуме]
API: Game Maker 8.0 Pro
Деятельность: 3d model, GM, GML,осваиваю C#, HTML, Paint.net
Сообщений: 530



« Ответ #9 : Май 06, 2011, 14:12:45 »

спасибо ;) ;) ;)
Записан

illidan
Участник
****

Репутация: 10
Offline Offline

Пол: Мужской
API: Game Maker 8.0 Pro
Деятельность: ...
Сообщений: 114

Архимаг


« Ответ #10 : Май 06, 2011, 15:28:56 »

Кстати Hummer можно спросить: сколько всего планируется уроков (примерно хотябы), и будет в них изложено все о ГМЛ?

P.S. Удачи в написании сл. уроков. И спасибо! ;)
Записан

"Во тме ночной, при свете дня, злу не укрыться от меня!"
Hummer
scio me nihil scire
GM Pro user
*

Репутация: 335
Offline Offline

Пол: Мужской
Награды:
2000 сообщений!За постоянность! [100 дней на форуме]За лояльность! [+300 репутации]Знаток Game Maker!За помощь новичкам!
API: Game Maker 8.0 Pro
Деятельность: GML, С++, OpenGL, Java. Бывший Директор бывшей школы GML
Сообщений: 2573


« Ответ #11 : Май 06, 2011, 15:39:31 »

Ну сколько уроков точно сказать не могу. Пока они будут нужны - то буду писать.
Всё конечно не будет. Мои уроки не учебник - они просто повод почаще заглядывать в справку и видеть сколько там интересного.
Записан

Есть вещи, которые нельзя объяснить. Для всего остального есть Справка
Рандом-рандом-рандомище (с)

C++ & OpenGL
illidan
Участник
****

Репутация: 10
Offline Offline

Пол: Мужской
API: Game Maker 8.0 Pro
Деятельность: ...
Сообщений: 114

Архимаг


« Ответ #12 : Май 07, 2011, 00:39:53 »

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

"Во тме ночной, при свете дня, злу не укрыться от меня!"
Hummer
scio me nihil scire
GM Pro user
*

Репутация: 335
Offline Offline

Пол: Мужской
Награды:
2000 сообщений!За постоянность! [100 дней на форуме]За лояльность! [+300 репутации]Знаток Game Maker!За помощь новичкам!
API: Game Maker 8.0 Pro
Деятельность: GML, С++, OpenGL, Java. Бывший Директор бывшей школы GML
Сообщений: 2573


« Ответ #13 : Май 07, 2011, 05:47:13 »

Записан

Есть вещи, которые нельзя объяснить. Для всего остального есть Справка
Рандом-рандом-рандомище (с)

C++ & OpenGL
illidan
Участник
****

Репутация: 10
Offline Offline

Пол: Мужской
API: Game Maker 8.0 Pro
Деятельность: ...
Сообщений: 114

Архимаг


« Ответ #14 : Май 07, 2011, 12:13:29 »

Записан

"Во тме ночной, при свете дня, злу не укрыться от меня!"
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 0.149 секунд. Запросов: 30.