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
Статус: Оффлайн
| Старая статья.
|
|
| |