Массивы - 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]
Все остальное, что не попадает ни под одну категорию.

Мини-Опрос
Какова Ваша специальность?
Всего ответов: 922

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

Массивы

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

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

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

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

Индексная переменная (неофициальный термин) - переменная, которая используется при обращении к массиву данных (или просто массиву), как встроенному, так и объявленному программистом. Примером встроенного массива на 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 (объект-контроллер):

Code


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

global.name=floor(random(5))

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

Code


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

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 (объект-контроллер):

Code


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

global.j=floor(random(5))

name[0]='Sanek'

name[1]='Igorek'

name[2]='Vitek'

name[3]='Nonamenek'

name[4]='Anton Ivanovich'


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


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

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


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

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

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

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

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

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

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

Code

massiv[0]=24;

massiv[1]=32;


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

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

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

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

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

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

Code


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

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 (он же):
Code


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

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

{

instance_create(x,y,b[j])

}

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

В Create:

Code


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

timer=floor(random(3))

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

alarm[timer]=60

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

В Create:

Code


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

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:

Code


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

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

{

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

}

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

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


Категория: Game Maker | Просмотров: 2150 | Добавил: ДядяВолк (11.08.2010) | Рейтинг: 0.0/0
Источник: http://quadrathell.cn.ua/ |
HTML ссылка на материал:
BB ссылка на материал:
Похожие материалы :
Возможно вам будет интересно:
Гоночное авто (0)
Уроки Scirra Construct (0)
Создание MMORPG игр. (3)
Создание 2D платформера а-ля Ghost Quest (1)
Урок для начинающих по Game Maker v8 (платформенная игра) (1)
Полиморфизм, Инкапсуляция и Наследование (0)
Наглядный пример использования переменных (0)
Исключения в C++ (0)
Как сделать ходячий объект в Game maker. Для обсолютных нубов. (0)
Что такое ПХП и как он работает? (0)
Создание базового движка для игры. Часть 1. Графика и клавиатура (0)
Создание заставки (Intro) (0)
Создание рикошета пуль от стены (4)
Как рисовать спрайты в DXDraw DelphiX (0)
Создание Платформенной Игры Copyright 2001 by Mark Overmars (0)
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Мы в социальных сетях

Поиск
Поиск по всему сайту:
Поиск по разделу:

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


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

Ваш IP: 54.161.128.52

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

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

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

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

На сайте были:
AxenusKa1971 , proto1ype , TJmiller

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