Циклы
[ Поделиться ]
[ Спасибо! ]
|
В тексте могут встретиться незнакомые некоторым людям слова, поэтому прежде необходимо ввести ряд определений и расшифровок.
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:
- «Выполняем создание объекта o_rubbish в координатах x и y пять раз (это следует из части инициации цикла)». Не правда ли просто.
Цикл repeat:
- в данном случае то же, что и в примере с циклом for.
Цикл while:
- «Пока переменная "y" данного объекта больше 32, пробуем помещать объект в комнату по вертикали».
Цикл do-until:
- почти тоже самое, что и пример с 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:
repeat(floor(random(7)))
{
instance_create(x-random(24)+random(24),y,o_rubbish)
}
/*Максимум 6 обломков, или они не создаются вообще*/
P.S.: первый вариант более гибкий.
2) Необходимо сортировать объекты, например генераторы частиц (o_water), в комнате. Подразумевается создание объектов в комнате по линии с определенным интервалом.
В Create (сторонний объект-контроллер, создающий объекты):
{
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
}
/*Пули будут разлетаться на одинаковом расстоянии друг от друга*/
Все это только лишь малая частица тех областей, где возможно и нужно применение циклов. Теперь дело только за вашей логикой и творческой фантазией.
Категория: Game Maker |
Просмотров: 4416 |
Добавил: ДядяВолк (11.08.2010)
| Рейтинг: 0.0/0
Источник: http://quadrathell.cn.ua/ | Автор: logos2012 (Лебедев Антон) - 24 июл | | |
HTML ссылка на материал: BB ссылка на материал: |
Всего комментариев: 0 | |