Doc
offline
Опыт:
63,163Активность: |
[Конкурсная] Основы Galaxy.
Приветствую тебя, читатель! Сегодня я расскажу тебе об основах Galaxy - скриптового языка игры Starcraft II.
Предполагается, что ты уже знаком с основами программирования в редакторе триггеров, а если нет - вперед изучать остальные статьи! Итак, пойдем по порядку: Содержание:
Функции:Функции - это то, на чем будет держаться весь ваш код, это важнейшая его часть. Итак, давайте же дадим определении этой "штуке". Функция - блок кода, посредством котором выполняются все действия в игровом мире. Функция может принимать любое количество аргументов и возвращать некий результат. Синтаксис функции определяется следующим образом:Код:
Например:Код:
Вызывается она так:Код:
Пожалуй, объясню что означает весь этот бред выше. Во-первых, все функции делятся на кастомные и нативные. Нативные функции - это те функции, которые непосредственно влияют на игровой процесс, совершая действия. Кастомные функции состоят из нативных чуть менее чем полностью и созданы они лишь для удобства, чтобы не повторять множество раз одни и те же действия. Тогда очевидно, что функция UnitCreate является нативной, а CreatePylon - кастомной. Давайте же рассмотрим, что делает эта наша суперфункция! Когда мы вызываем ее, в левом нижнем углу карты создается пилон, принад лежащий нейтральному игроку. Итак, первый аргумент отвечает за количество создаваемых юнитов. Второй - за тип самого юнита, пишется в кавычках. Третий - за то, создастся ли юнит сразу же или будет произведена его постройка. Четвертый - за номер игрока, которому будет принадлежать юнит. Пятый - за точку создания юнита, как видите тут я использовал нативную функцию Point создающую точку в левом нижнем углу карты. Шестой - за угол поворота юнита. Итак, мы разобрались в устройстве нашей функции. Теперь давайте дополним ее, а заодно и разберемся с принимаемыми и возвращаемыми значениями. А что если сделать так, чтобы можно было задавать игрока-владельца созданного пилона? Давайте попробуем! Код:
Теперь мы можем одной функцией создать несколько пилонов для разных игроков. Вызываться она будет так:Код:
ИлиКод:
А давайте еще добавим выбор той точки, в которой будет создаваться наш пилон: Код:
А она вызываться будет уже так:Код:
ИлиКод:
Вот и пришла пора рассказать о возвращаемых значениях функции. Возвращаемое значение - это некий результат функции, который возможно передать в другую функцию или записать в переменную. Рассмотрим, например, функцию Point. Она создает некую точку а потом возвращает ее чтобы мы могли в ней, например, создать юнита. Давайте превратим нашу функцию в возвращающую значение. Код:
Использовать это можно так:Код:
Правда, результата это не принесет, ведь созданный юнит сразу же уничтожится функцией UnitKill. Но это лишь одно из множества применений. Заметьте, что return прерывает действия функции, то есть его можно использовать как искусственный прерыватель. Вот я и поведал вам о функциях все, что хотел. Далее у нас переменные. Итак... Переменные:Переменные - ячейки хранения информации в памяти игры. Это как карманы вашей куртки, в которые можно положить что угодго, лишь бы размер подходил. Предположим что размер кармана - это тип переменной, его местонахождение относительно куртки - имя переменной, а хранимый в нем предмет - информация, хранимая переменной. Разберем синтаксис объявления переменных:Код:
Заметьте, что изначального значения может и не быть, оно может задаваться в ходе выполнения функций. Вот и пример:Код:
ИлиКод:
Существует два основных типа переменных: глобальные и локальные. Глобальные переменные объявляются вне функций и постоянно хранят ту информацию, которую в них заложит пользователь. Локальные переменные объявляются внутри функции, вверху кода, под первой фигурной скобкой. Локальные переменные уникальны для каждого вызова функции. Это пока все, что тебе нужно знать о переменных, читатель. Приступим к массивам. Массивы:Итак, уважаемый читатель, представь, что у тебя на куртке несколько одинаковых карманов, в которых лежат разные вещи одинакового размера. Это и будет называться массивом. То есть массив - множество пронумерованных переменных с одинаковым именем. Объявляются массивы так:Код:
Заметьте, что задать начальное значение нельзя. Вот простенький пример использования массивов:Код:
Опять же, эти действия не делают ничего конкретного, но это показывает что в индексее ячейки массива можно использовать любые числа, переменные, функции или их сочетания. Массивы - идеальное решение для хранения большого количества информации. Реальное практическое применение массивов вы увидите в части 7. А сейчас перейдем к циклам. Циклы:Предположим, что нам нужно создать 10 пилонов функцией CreatePylon так, чтобы каждому пилону соответствовал свой игрок. Как бы вы сделали это? Код:
Так? А если вам нужно создать сотню, тысячу пилонов? Выходом из этого положения являются циклы. Цикл - блок кода, повторяющий заложенные в него действия до прекращения выполнения определенного условия. Синтаксис цикла выглядит так:Код:
Вот как нужно решать вышеописанную задачку:Код:
Удобно, не правда ли? Приступим к условиям. Условия:Условие - блок кода, действия в котором выполняются только при соблюдении неких условий (уж простите за тавтологию), в противном случае действия игнорируются. Синтаксис условий выглядит примерно так:Код:
Хочу заметить, что внутри условий могут быть использованы такие операторы как: Код:
Для соединения нескольких условий в одной строке могут быть использованы скобки и нижеследующие операторы: Код:
Мы можем сравнить значения с true и false - истинностью и ложью. Вот пожалуй и все, перейдем к последней части нашей статьи: практикуму. Практикум:Вот мы и подошли с тобой, читатель, к заключительной части статьи: практикуму. Здесь мы с тобой напишем с нуля и разложим по полочкам код, создающий заданное тобой количество пилонов на заданном расстоянии от центра карты и постепенно перемещающий их по кругу. Вроде бы просто, не так ли? Итак, приступим: Для начала создадим в редакторе триггеров функцию и назовем ее, например, Custom code. Это будет наш аналог Кастом кода из Warcraft III. Создадим действие "Общее - Пользовательский скрипт". Щелкните на него и в открывшемся поле для ввода пишите: Код:
Это некоторое ухищрение(thx to ScorpioT1000) для того, чтобы создать пустое поле для кода. Все действия далее производятся между Код:
Давайте напишем скелет функции, которая будет запускать все эти наши будущие чудеса. Код:
count - количество создаваемых пилонов, dist - действительная переменная диаметра круга пилонов. Внутри функции нам понадобится цикл, добавим его. Код:
Мы хотим чтобы пилоны создавались ровно по кругу, не так ли? Зададим рассчет угла, добавив еще одну переменную. Код:
Теперь добавим еще одну переменную для задания точки создания. Код:
Точку мы задали полярной координатой от центра карты. Пора бы добавить создание самого юнита. Код:
Сейчас, это уже вполне рабочая функция, создающая пилоны по кругу, но мы ведь хотим чтобы они еще и двигались, не так ли? Добавим несколько глобальных переменных для передачи данных из одной функции в другую, а также занесение последнего созданного пилона в массив. Код:
Поясню: триггер PylonMove нам будет нужен для периодического перемещения. Создадим каркас двигательной функции и присвоение остальных глобальных переменных. Код:
Поясню: любая функция, привязанная к триггеру выглядит именно таким образом как и PylonMoveFunc. Действия пишутся непосредственно после первого условия. Итак, повесим функцию на триггер и зарегистрируем на триггер периодическое событие. Код:
Поясню: c_timeGame - константа игрового времени. Далее нам осталось лишь дописать тело двигающей функции. Код:
Готово! Итого мы получаем: Код:
Поздравляю тебя, читатель, и благодарю за прочтение моей статьи! Карту с вышеописанным кодом ты можешь найти чуть ниже. Отредактировано Doc, 03.11.2010 в 22:35. |
17.10.2010, 12:18 | #1
+3/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
reALien
offline
Опыт:
29,211Активность: |
Из всех двух претендентов ты пока что победитор =P |
17.10.2010, 13:30 | #2
+1/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
H
hello world
offline
Опыт:
130,376Активность: |
хорошая годная статья
плохие ужасные примеры ^_^ В конце более менее, но все примеры можно сделать не использовав и строки кода. |
23.10.2010, 01:57 | #3
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Sergey
Старейший
offline
Опыт:
43,563Активность: |
Ahelhot
А другие статьи прокоментируешь? |
23.10.2010, 18:59 | #4
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
H
hello world
offline
Опыт:
130,376Активность: |
Другие не интересные. омфг одни обзорные статьи =\ |
23.10.2010, 19:36 | #5
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
Ahelhot, лично мне кодом гораздо удобнее, так что кому как =) спасибо ок. |
23.10.2010, 20:46 | #6
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
bee
vjass.optimizer
offline
Опыт:
16,615Активность: |
Давайте, доктор, жгите дальше. +1
|
23.10.2010, 20:53 | #7
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
H
hello world
offline
Опыт:
130,376Активность: |
Ну статьи нужны только новичкам, а им как известно писать кодом не очень нравится =) все равно годная статья, мне понравилась. |
24.10.2010, 14:20 | #8
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Mihahail
๏̯͡๏
offline
Опыт:
17,766Активность: |
Статья гут, единственное замечание: не по канонам ) Но получилось весьма не плохо
Про каноны. Если брать любой учебник, или самоучитель, или школьную(и вузовскую тоже) программу по программированию, то везде порядок следующий:
Переменные Условия Циклы Массивы Функции Практикум Кагбэ по увеличению сложности.
ps: <КОЛИЧЕСТВО ЯЧЕЕК В МАССИВЕ> неверно, нужно <КОЛИЧЕСТВО ЯЧЕЕК В МАССИВЕ МИНУС ОДИН> ибо счёт идёт с нуля |
26.10.2010, 23:02 | #9
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
H
hello world
offline
Опыт:
130,376Активность: |
((цитата
<КОЛИЧЕСТВО ЯЧЕЕК В МАССИВЕ> неверно, нужно <КОЛИЧЕСТВО ЯЧЕЕК В МАССИВЕ МИНУС ОДИН> ибо счёт идёт с нуля )) Шас на 70 годы что бы так горевать из за одной ячейки. Я лично никогда не делаю массив в 9 ячеек (0-9 т.е 10 переменных). Просто оставляю 0 как свободную ячейку и счет массивов начинаю с 1. Так гораздо удобнее и понятнее. |
26.10.2010, 23:15 | #10
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Mihahail
๏̯͡๏
offline
Опыт:
17,766Активность: |
Ahelhot, это плохой стиль. Не будем дискутировать об этом.
И если человек изучает си на примере г Вот и программируйте на дельфи. |
26.10.2010, 23:37 | #11
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
Ок, это забыл. О канонах не знал. Статьи никогда не писал. Спасибо. |
27.10.2010, 20:37 | #12
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
H
hello world
offline
Опыт:
130,376Активность: |
я как бы и сказал что мне пофиг, тут каждый делает как ему удобно, от одной переменной никому хуже не будет. Я кстати заметил что нулевая переменная почти всегда пригодится в другом деле, хотя и не было запланировано её юзать =) Вообще можно в трактире на эту тему пофлудить. ) |
27.10.2010, 23:46 | #13
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Mihahail
๏̯͡๏
offline
Опыт:
17,766Активность: |
Doc:
Фикс будет?) |
03.11.2010, 21:43 | #14
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
Mihahail, про колво ячеек fixed, спасибо. |
03.11.2010, 22:36 | #15
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|