Добавлен NCrashed,
опубликован
Раздел:
Триггеры и объекты
Содержание:
Перед освоением этого материала рекомендуется изучить язык jass:
Инструменты
- 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| = Sqrt( ax^2 + bx^2 + bz^2)
Еще нам понадобится операция «нормирования вектора», то есть установка единичной длины:
a={ax/|a|, ay/|a|, az/|a|}
a={ax/|a|, ay/|a|, az/|a|}
Вектора можно складывать, вычитать, умножать на число или на другой вектор (об этом по мере необходимости).
Но, однако, координаты вектора не определяют его положения в пространстве, нужна еще точка, из которой он выходит:
Но, однако, координаты вектора не определяют его положения в пространстве, нужна еще точка, из которой он выходит:
Теперь мы обладаем инструментом, с помощью которого можем попасть в любую точку пространства, получаем универсальную систему уравнений:
X = Ax + ax
Y = Ay + ay
Z = Az + az
Правда, все легко и просто? Именно на этом ките держится вся стереометрия, не точка, а именно вектор (точку вообще можно представить как вектор, исходящий из начала координат в эту точку).
Принципы ООП (объектно-ориентированного программирования)
Для правильного понимания что такое структура, обратимся к некой "эволюционной цепочке": переменная->массивы->записи->объекты
Переменные появились очень давно, предназначаются для хранения информации одного типа.
Массивы появились, когда появилась необходимость хранить несколько переменных одного типа.
Записи придумали, когда нужно было хранить одновременно несколько переменных разных типов, например, с помощью записей легко создать телефонный справочник (1 запись: имя абонента и его телефон, потом записи хранят в 1 массиве).
Наконец, объекты - это объединение записей (связки переменных) и функций, которые обрабатывают эти переменные. В итоге мы получили переменную-объект, которая максимально изолирована и может существовать сама по себе (+еще функционировать).
Массивы появились, когда появилась необходимость хранить несколько переменных одного типа.
Записи придумали, когда нужно было хранить одновременно несколько переменных разных типов, например, с помощью записей легко создать телефонный справочник (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, которая независимо сколько аргументов передано методу
// будет тоже "тайно" передана, пример использования
this.i = 9 // мы только что изменили параметр i объекта, который описан выше
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
// теперь компилятор выдаст ошибку, если попробуете использовать this
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() // теперь вот так можно создать структуру
// и в ней уже будет инициализирован триггер tr
...
endfunction
Иногда необходимо уничтожить еще и структуры или переменные (триггер в нашем примере), которые содержатся внутри структуры (например, вы опишите структуру "точка" и добавите в вектор переменную "point Begin = point.create()"), тогда пишете свой аналог destroy:
// вар чувствителен к регистру
// поэтому для него destoy не равно Destroy
method Destroy takes nothing returns nothing
call this.Begin.destroy() // удаляем точку
// здесь пишем остальные необходимые действия для полного удаления
call this.destroy() // и в финале удаляем сам вектор
endmethod
Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
WeendVidente, пока не прочитаешь статьи написанные в самом начале это можно даже не читать
а там дальше он работает с координатами
код весь читай
Это редкий талант, на самом деле ставить себя на место новичка и расписывать все так как надо именно новичку, а не так как тебе кажется ему это надо.
WeendVidente, и прочитай ВСЕ статьи которые указаны особенно полярные координаты и математический подход к движению
тут вектором названа точка содержащая не 2 а 3 координаты(x,y,z)
такое ощущение что ты вобще не читал код в примере
сократим слово вектор и ты получаешь свой отрезок, просто вектор нужен для легкой и быстрой обработки, но все операции которые можно делать с векторами можно делать и на координатах, просто это будет не так понятно, векторы нужны для удобства в процессе работы, не больше.