Циклы - Game Maker - Конструкторы игр, системы разработки игр
Навигация по сайту
Сайт:

Дополнительно:

Файловый архив:

Каталог статей:

Форум:


Категории раздела
Game Maker [27]
Flash [3]
FPS Creator X9, X10 [1]
Scirra Construct [14]
Multimedia Fusion [0]
001 Game Maker, Map 001 [0]
3D RAD [16]
3D Game Studio [1]
Silent Walk FPS Creator [0]
Blender (Блендер) [1]
Game Editor [0]
Остальное [1]
Все остальное, что не попадает ни под одну категорию.

Мини-Опрос
Какой платформой Вы пользуетесь?
Всего ответов: 1025

Партнеры сайта
....

Циклы

00:51
Прежде чем...

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

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:

Code
for(i=0;i>5;i+=1){instance_create(x,y,o_rubbish)}

- «Выполняем создание объекта o_rubbish в координатах x и y пять раз (это следует из части инициации цикла)». Не правда ли просто.

Цикл repeat:

Code
repeat(5){instance_create(x,y,o_rubbish)}

- в данном случае то же, что и в примере с циклом for.

Цикл while:

Code
while(y>32){y=random(room_height)}

- «Пока переменная "y" данного объекта больше 32, пробуем помещать объект в комнату по вертикали».

Цикл do-until:

Code
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:

Code


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 (сторонний объект-контроллер, создающий объекты):

Code
for(i=0;i<=room_width;i+=50)

{

instance_create(i,582,o_water)

}

/*Создаем объекты-генераторы на высоте 582 с шагом 50 пикселей по горизонтали,   
если комната большая, то используем деактивацию за пределами вида*/


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

В Destroy (объект снаряда):

Code

for (i=1;i<=32;i+=1)

{

bullet = instance_create(x,y,o_bullet)

bullet.direction = 11.25*i

bullet.speed = 5

}

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

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


Категория: Game Maker | Просмотров: 4261 | Добавил: ДядяВолк (11.08.2010) | Рейтинг: 0.0/0
Источник: http://quadrathell.cn.ua/ | Автор: logos2012 (Лебедев Антон) - 24 июл | |
HTML ссылка на материал:
BB ссылка на материал:
Похожие материалы :
Возможно вам будет интересно:
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск
Поиск по всему сайту:
Поиск по разделу:

Панель пользователя
Здравствуйте, Гость


Ник:
Пароль:
Запомнить :

Ваш IP: 44.220.245.254

Случайные конструкторы

Случайные движки

Случайные статьи

Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0

На сайте были:

При полном или частичном копировании материалов сайта ссылка на Make-Games.ru обязательна. Make-Games.ru © 2008 - 2024 Хостинг от uCoz
Топ Разработка игр