WarCraft 3: [vJass] Создание moving system | |
Инструменты
- Jass New Gen Pack (далее JNGP) – удобная надстройка
стандартного редактора, имеющая встроенный компилятор vJass’а и подсветку кода.
Проверьте, чтобы пути до карты были английские. Обязательно снимите галочку
«Reinventing the Craft-> Enable Reinventing the Craft» (от него только
проблем больше).
Краткий курс теории
Не будем загружать мозги пользователю лишней информацией, но все-таки
кое-что знать надо.
Два основных способа описания движения
В геометрии существую два основных направления:
Оба направления имеют свои недостатки и преимущества. В этой статье мы
будем оперировать векторами, так как векторная геометрия позволяет просто и
понятно реализовать движение в пространстве и добавить правдоподобности движению
(так как физика и так является «векторной» наукой )
Знакомьтесь, это вектор! Это основное понятие стереометрии, но объяснить
его можно так: «направленный отрезок». У каждого вектора есть свои координаты,
которые можно найти по формуле a={Bx-Ax, By-Ay, Bz-Az}.
Чтобы определить длину вектора можно воспользоваться такой формулой: |a|
= Sqrt( ax^2 + bx^2 + bz^2)
Еще нам понадобится операция «нормирования вектора», то есть установка
единичной длины: a={ax/|a|, ay/|a|, az/|a|}
Вектора можно складывать, вычитать, умножать на число или на другой вектор
(об этом по мере необходимости). Но, однако, координаты вектора не определяют
его положения в пространстве, нужна еще точка, из которой он выходит:
Теперь мы обладаем инструментом, с помощью которого можем попасть в любую
точку пространства, получаем универсальную систему уравнений:
X = Ax + ax Y = Ay + ay
Z = Az + az
Правда, все легко и просто? Именно на этом ките держится вся стереометрия,
не точка, а именно вектор (точку вообще можно представить как вектор, исходящий
из начала координат в эту точку).
Принципы ООП (объектно-ориентированного программирования)
Для правильного понимания что такое структура, обратимся к некой
"эволюционной цепочке": переменная->массивы->записи->объекты
Переменные появились очень давно, предназначаются для хранения информации
одного типа. Массивы появились, когда появилась необходимость хранить
несколько переменных одного типа. Записи придумали, когда нужно было хранить
одновременно несколько переменных разных типов, например, с помощью записей
легко создать телефонный справочник (1 запись: имя абонента и его телефон, потом
записи хранят в 1 массиве). Наконец, объекты - это объединение записей
(связки переменных) и функций, которые обрабатывают эти переменные. В итоге мы
получили переменную-объект, которая максимально изолирована и может существовать
сама по себе (+еще функционировать).
В vJass структуры - имитация объектов. У них есть и разносортные переменные
и функции, которые обрабатывают эти переменные (они называются методами).
Рассмотрим пример:
struct MyObject integer i = 4 real a = 0.42 unit array ua [10] AnotherObject obj method DoSomething takes nothing returns noting this.i = 9 endmethod
endstruct
Но как теперь использовать структуру?
function MyFuntion takes nothing returns nothing local MyObject b = MyObject.create() set b.r = 9.81 call b.DoSomething() call b.destroy() endfunction
Но иногда нам не нужно, чтобы в структуру передавалась переменная this,
тогда указываем что метод "статичный":
static method DoSomething takes nothing returns noting endmethod
Статичные методы нужны для альтернативного создания структуры:
struct MyStruct trigger tr
static method CreateIni takes nothing returns MyStruct
local MyStruct st = MyStruct.create()
set st.tr = CreateTrigger()
call TriggerAddAction(tr, function SomeFunc)
return st
endmethod
endstruct
...
function MyFuntion takes nothing returns nothing
local MyObject b = MyObject.CreateIni()
...
endfunction
Иногда необходимо уничтожить еще и структуры или переменные (триггер в
нашем примере), которые содержатся внутри структуры (например, вы опишите
структуру "точка" и добавите в вектор переменную "point Begin =
point.create()"), тогда пишете свой аналог destroy:
method Destroy takes nothing returns nothing call this.Begin.destroy() call this.destroy() endmethod
|