Всё для Game Maker
Навигация
Главная
Game Maker
Игры
Примеры
Статьи
Программы
Ресурсы
Справочники
Пакеты расширений
Поиск
Форум
Ссылки
Загрузить файл
Сейчас на сайте
Гостей: 1
На сайте нет зарегистрированных пользователей

Пользователей: 136
Посетитель: Valantery
Темы форума
Новые темы
Alpha-версия School ...
School of the Darkne...
Ассоциации
усовершенствование с...
RPG
Обсуждаемые темы
Ассоциации [286]
Black Monday [52]
RPG [50]
есть вопрос [50]
О форуме [45]
Топ закачек
Woin [6000]
Interest [5279]
Tank [4362]
Спрайты для 2d боевиков [4350]
Спрайты. Часть 1 [4328]
Спрайты. Часть 3 [4311]
Char [4225]
Space [4086]
Pirates [3985]
FireWing version 145d [3980]
Счетчики

Рейтинг сайтов о создании игр
Реклама
Статья
Циклы в GM
Автор: logos2012 (Лебедев Антон) - 24 июля 2008

Контакты: logos2012@yandex.ru

Прежде чем...


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

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:



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

}

/*Пули будут разлетаться на одинаковом расстоянии друг от друга*/




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


Эту статью Вы можете скачать здесь.>
 
Опубликовал -MaX- Июль 30 2008 14:23:22 · 0 Комментариев · 7327 Прочтений · Для печати
Комментарии
Нет комментариев.
Добавить комментарий
Вам нужно авторизоваться или зарегистрироваться чтобы оставлять комментарии.
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, авторизируйтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Голосование
Оцените новую версию сайта :)

5 (отлично)

4 (хорошо)

3 (плохо)

2 (ужасно)

Для участия в опросах вы должны авторизоваться или зарегистрироваться.
Мини-чат
Вам необходимо авторизоваться.

GRID
06/04/2012 18:17
<_<

MaxIM
21/01/2012 16:23
Я всё еще вспоминаю про этот сайт... Жалко что -МаХ- ушёл в неизвестность,и забил на всё =(

CrashBand
17/10/2011 20:40
лол.

MaxIM
04/08/2011 22:26
Я тоже жив,а вот насчет -MaX-`a незнаю =(((

fedenkovadik
28/07/2011 03:41
прошел практически ровно год, немного больше. Я все еще жив. В отличии от сайта. сука.

Архив чата