Ленин, Сталин, Тетрис!











  • Страница 1 из 1
  • 1
Форум разработчиков игр » Техническая часть » Игровые 2D-движки » Циклы на Game Maker (GML (Game Maker Language))
Циклы на Game Maker
GamerSenДата: Воскресенье, 16.03.2014, 17:25 | Сообщение # 1
Сержант
Группа: Проверенные
Сообщений: 31
Репутация: 0
Статус: Оффлайн
Циклы на Game Maker. В тексте могут встретиться незнакомые некоторым людям слова, поэтому прежде необходимо ввести ряд определений и расшифровок.

GML (Game Maker Language) - язык программирования Game Maker.

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

Объект-генератор - объект, который что-то создает или запускает какие-то функции. Такие объекты могут быть, как видимы (взрыв здания), так и невидимы (генерация облаков при помощи частиц). Такой объект не осуществляет непосредственного контроля, он реагирует на совершение определенного события, например рисования, столкновения, уничтожения и т.д.

Введение

Некоторые люди, начинающие изучать GML, возможно, сталкивались с проблемой реализации циклов. Это особенно было актуально для тех, кто с программированием как таковым столкнулся впервые. Скорее всего, возникали вопросы и утверждения типа: «А куда эти циклы вставлять», «А для чего они вообще нужны?», «А почему моя игра зависла из-за одного вставленного цикла?», «Да просто вставлю в Destroy, условий десять, и не буду париться с этой шнягой...». Как все же показывает практика циклы - не только полезная, но и зачастую просто необходимая вещь.

Задумайтесь, например, как можно в комнате расставить повторяющиеся предметы на одной линии (пускай будет по ширине)? Допустим, что нужный объект шириной в 32 пикселя, и он является, к примеру, несущей стеной в комнате (объект - o_wall).

Ответ новичка: «Зайти в редактор комнат и расставить вручную».

А если комната шириной в 2560 пикселей, то ручная расстановка - дело не очень занятное.

Тогда можно в Create объекта-контроллера написать instance_create (0,32,o_wall), instance_create (32,32,o_wall),... instance_create (2528,32,o_wall), instance_create (2560,32,o_wall).

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

Ну не будем о грустном, а попробуем понять «Что это за цикл и с чем его едят». Также, во избежание лишних вопросов и ненужных предложений хочу объяснить, что все вышесказанное лишь пример и существует много обходных путей создания несущих стен в игре, один из которых - создание одного объекта в пределах вида с дальнейшим его перемещением (вместе с видом).

Как читать цикл на обычном языке

Все мы люди и общаемся при помощи речи (по научному - вторая сигнальная система), речь в свою очередь передается при помощи условных символов и звуков - языка. Символы одного языка можно перевести в символы другого. GML - тот же язык, знаки и символы которого легко можно перевести, не будем далеко ходить, на русский. Например, if(y<576){instance_destroy()} - это «Если переменная "y" данного объекта меньше 576, то данный объект уничтожаем». То же самое касается и циклов. На практике мы часто в своем мозге преобразуем код GML в человеческий язык, что упрощает написание будущего кода.

Цикл for:
for(i=0;i>5;i+=1){instance_create(x,y,o_rubbish)}
- «Выполняем создание объекта o_rubbish в координатах x и y пять раз (это следует из части инициации цикла)». Не правда ли просто.

Цикл repeat:
repeat(5){instance_create(x,y,o_rubbish)}
- в данном случае то же, что и в примере с циклом for.

Цикл while:
while(y>32){y=random(room_height)}
- «Пока переменная "y" данного объекта больше 32, пробуем помещать объект в комнату по вертикали».

Цикл do-until:
do{ y=random(room_height)}until(y>32)
- почти тоже самое, что и пример с while, только цикл здесь выполняется хотя бы один раз.

Итак, подытожим: цикл for и repeat мы используем, когда знаем, сколько раз должен исполняться цикл, while применяем, когда число оборотов цикла неизвестно, do-until - разовое выполнение куска кода и циклическое его исполнение до тех пор, пока соблюдается условие.

В каких событиях использовать циклы

Любые циклы не рекомендуется ставить в событие Step, так как в каждом шаге цикл будет выполняться снова и снова, что повлечет за собой зависание игры, Тоже касается и события Draw. Наиболее эффективно применять циклы в событиях, которые выполняются один шаг: Create, Destroy, Collision, Alarm[x] и т.д.

Практика применения:
Теперь немного практических решений:

1) При взрыве самолета необходимо создать разлетающиеся обломки.

Допустим, что физика для обломков уже придумана, и нам нужно только создать случайное количество обломков (o_rubbish), которые разнесутся в разные стороны. Это можно реализовать при помощи цикла:

В Destroy (объект самолета):
Вариант 1:

Код
for(i=choose(0,1,2);i<=5;i+=1)   
  {   
  instance_create(x-random(24)+random(24),y,o_rubbish)   
  }   
  /*В таком случае будет создаваться от 3 до 6 обломков*/

Вариант 2:  
Code
repeat(floor(random(7)))   
  {   
  instance_create(x-random(24)+random(24),y,o_rubbish)   
  }   
  /*Максимум 6 обломков, или они не создаются вообще*/


P.S.: первый вариант более гибкий.
2) Необходимо сортировать объекты, например генераторы частиц (o_water), в комнате. Подразумевается создание объектов в комнате по линии с определенным интервалом.

В Create (сторонний объект-контроллер, создающий объекты):

Код
for(i=0;i<=room_width;i+=50)   
  {   
  instance_create(i,582,o_water)   
  }   
  /*Создаем объекты-генераторы на высоте 582 с шагом 50 пикселей по горизонтали,  если комната большая, то используем деактивацию за пределами вида*/


3) Необходимо, чтобы при взрыве снаряда во все стороны разлетались пули (o_bullet).
В Destroy (объект снаряда):

Код
for (i=1;i<=32;i+=1)   
  {   
  bullet = instance_create(x,y,o_bullet)   
  bullet.direction = 11.25*i   
  bullet.speed = 5   
  }   
  /*Пули будут разлетаться на одинаковом расстоянии друг от друга*/


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

Автор: logos2012 (Лебедев Антон) - 24 июля 2008
 
prankДата: Среда, 16.04.2014, 22:47 | Сообщение # 2
Лейтенант
Группа: Проверенные
Сообщений: 50
Репутация: 0
Статус: Оффлайн
Старая статья.
 
Форум разработчиков игр » Техническая часть » Игровые 2D-движки » Циклы на Game Maker (GML (Game Maker Language))
  • Страница 1 из 1
  • 1
Поиск: