Всё для 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]
Счетчики

Рейтинг сайтов о создании игр
Реклама
Статья
Массивы в массы


Автор: logos2012 (Лебедев Антон) - 25 июля 2008

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

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




Перед чтением основной части статьи рекомендуется прочитать следующее.

Массив - явление, когда переменная имеет несколько значений.

Еще одно, может быть, менее понятное определение: Массив - набор последовательно проиндексированных элементов.

Индексная переменная (неофициальный термин) - переменная, которая используется при обращении к массиву данных (или просто массиву), как встроенному, так и объявленному программистом. Примером встроенного массива на GML является alarm[x], view_visible[x] и т.д. Индексной переменной также иногда называют переменные в циклах, но их корректное название - счетчик (обычно это «i»).



Введение




В стандартной документации Game Maker очень мало места уделено такому важному элементу программирования как массивы.

В данной статье будет объясняться принцип использования массивов при создании игр: инициация, составные части массива, принцип применения, практические советы.

Массивы используются для хранения множества относительно однородных данных.

Массив в GML не нужно объявлять, как например на JavaScript (massiv = new Array). Здесь достаточно инициации в Create: элемент массива + индекс. Например, massiv[0], где massiv - элемент массива, а [0] - индекс массива. Все массивы в GML начинаются с нулевого элемента (индекс [0]) и далее идут по нарастающей с шагом +1. То есть [0], [1],… [n-1],[n]. В GML возможно использование и двумерных массивов (но это так для кругозора), то есть массивов, использующих два индекса ([0,0], [0,1],[0,3] и т.д.).

Предположим, что мы делаем RPG и нам необходимо, чтобы у второстепенных персонажей случайным образом генерировались названия имен, которые прописываются над этими персонажами. Если мы пойдем сложным, а главное неоптимальным путем, то можно сделать так:



В Create (объект-контроллер):



//Допустим, что нужно сгенерировать 5 имен из списка

global.name=floor(random(5))






В Draw (объект нужного персонажа):



//Прописываем имя персонажа в зависимости от сгенерированной переменной

if(global.name=0)

{

draw_text(x,y-10,'Sanek')

}

if(global.name=1)

{

draw_text(x,y-10,'Igorek')

}

if(global.name=2)

{

draw_text(x,y-10,'Vitek')

}

if(global.name=3)

{

draw_text(x,y-10,'Nonamenek')

}

if(global.name=4)

{

draw_text(x,y-10,'Anton Ivanovich')

}




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

С помощью массивов все можно реализовать намного проще:



В Create (объект-контроллер):



//Генерируем индексную переменную и подгружаем имена

global.j=floor(random(5))

name[0]='Sanek'

name[1]='Igorek'

name[2]='Vitek'

name[3]='Nonamenek'

name[4]='Anton Ivanovich'






В Draw (объект нужного персонажа):



//Выводим (рисуем) сгенерированное имя

draw_text(x,y-10,name[global.j])




Жизнь проще, чем кажется, не правда ли? Если кто-то думает, что оба кода практически не отличаются по объему, то здесь я скажу, есть два момента, на которых стоит заострить внимание:

1) А если необходимо генерировать не пять, а сто имен, то устанешь нажимать CTRL+V, а потом еще редактировать имена и все это в событии Draw, которое работает каждый шаг.

2) Многократное обращение к оператору условия, мягко говоря, не приводит к увеличению производительности.

Надеюсь, что доходчиво пояснил, почему следует обращаться к массивам GML как можно чаще (где это конечно необходимо и оправдано). А теперь идем дальше.



Как понимать массив на простом человеческом языке




Для начала, тогда следует разобраться в том, что же такое переменная и вообще объект в программировании. Теперь немного отвлечемся и представим себе обычного человека. У человека есть голова, руки, ноги, туловище и много различных других частей тела :-) и органов. Все это объекты человеческого организма. Теперь из всего этого многообразия выберем, например ...МММ руку. Рука в свою очередь обладает рядом параметров: цвет, длина, поперечное сечение, в конце концов. Все эти параметры, переводя на язык программирования, и есть переменные. Почему переменные? Ведь мы имеем дело с работой программы (ключевое слово «работа»), а работа - динамичный процесс и как у всего динамичного у человеческой руки может измениться цвет (загар), рука растет (по крайней мере, до 20 лет) как в длину, так и в толщину, поэтому значение цвета, длины, поперечного сечения постоянно меняется. Как уже было сказано выше, работа программы динамична, а динамичность невозможна без изменения каких-то параметров (значений переменных) в ходе работы.

Массив же являет собой совокупность относительно однородных значений, каждое значение записывается в конкретный элемент массива. Грубо говоря, массив - некая база данных, в которую входит переменная с индексом и соответственно ее (переменной) значение. Значит конструкцию типа:

massiv[0]=24;

massiv[1]=32;


следует читать так: «Начальной переменной massiv соответствует значение 24, второй переменной massiv принадлежит значение 32». Все оказалось довольно прозаично.



Практика применения




«Практика без теории не нужна, Теория без практики мертва» - Протагор.


Теперь приступим к рассмотрению самой долгожданной части статьи, хотя практики мы уже немного коснулись вначале.

1) Необходимо создание случайного бонуса (o_prize_...) при уничтожении врага (имя объекта не важно).

В Create (уничтожаемый враг):



//Рандомизуем на возможность получения бонуса

bonus=floor(random(101))

//Массив бонусов

j=floor(random(6))//Бонус-рандомайзер - индексная переменная

b[0]=o_prize_hp//В массиве прописывается object_index

b[1]=o_prize_energy

b[2]=o_prize_money

b[3]=o_prize_power

b[4]=o_prize_unvul

b[5]=o_prize_speed






В Destroy (он же):



/*Условие проверяет вероятность создания бонуса - 20 %,
а функция instance_create(…) создает случайный бонус*/


if(bonus>=40&&bonus<=60)

{

instance_create(x,y,b[j])

}




2) Необходимо запустить случайный таймер из трех имеющихся (alarm[x]) в начале комнаты.

В Create:



//Генерация случайного таймера

timer=floor(random(3))

/*Запуск определенного таймера (вот и работа со встроенным массивом)*/

alarm[timer]=60






3) Немного вспомним статью «Циклы в GM» и попробуем при уничтожении объекта создать случайное количество обломков (o_rubbish_...), причем обломки должны отличаться друг от друга.

В Create:



//Инициируем массив

rubbish[0]=o_rubbish_1//Прописываем object_index

rubbish[1]=o_rubbish_2

rubbish[2]=o_rubbish_3

rubbish[3]=o_rubbish_4

rubbish[4]=o_rubbish_5






В Destroy:



//Инициация цикла (создаем случайное количество обломков)

for(i=floor(random(5));i<5;i+=1)

{

//В каждом обороте цикла создаем индивидуальный объект обломков
instance_create(x,y,rubbish[i])

}




ЧТД, надеюсь, статья поможет новичкам в освоении GML, а опытным программистам даст пищу для размышлений.


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

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

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

Пароль



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

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

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
прошел практически ровно год, немного больше. Я все еще жив. В отличии от сайта. сука.

Архив чата