Массивы
[ Поделиться ]
[ Спасибо! ]
|
Перед чтением основной части статьи рекомендуется прочитать следующее.
Массив - явление, когда переменная имеет несколько значений.
Еще одно, может быть, менее понятное определение: Массив - набор последовательно проиндексированных элементов.
Индексная переменная (неофициальный термин) - переменная, которая используется при обращении к массиву данных (или просто массиву), как встроенному, так и объявленному программистом. Примером встроенного массива на 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(gl obal.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, а опытным программистам даст пищу для размышлений.
Автор: logos2012 (Лебедев Антон) - 25 июля 2008
Категория: Game Maker |
Просмотров: 5068 |
Добавил: ДядяВолк (11.08.2010)
| Рейтинг: 0.0/0
Источник: http://quadrathell.cn.ua/ | |
HTML ссылка на материал: BB ссылка на материал: |
Всего комментариев: 0 | |