WarCraft 3: [vJass] Создание moving system

[vJass] Создание moving system
» Раздел: Триггеры и объекты

Перед освоением этого материала рекомендуется изучить язык 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={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, которая независимо сколько аргументов передано методу
			// будет тоже "тайно" передана, пример использования
			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

Просмотров: 15 454

» Лучшие комментарии


Sebra #1 - 8 лет назад 2
Первый? Нда.
Вижу, по поводу сухого трения ты своё мнение не изменил. Жаль.
df Hunter #2 - 8 лет назад 5
private real g = 14 Ускорение свободного падения
ньютон в гробу перевернулся
Sebra #3 - 8 лет назад 2
так это не в метрах в секунду за секунду, а в игровых единицах
ScorpioT1000 #4 - 8 лет назад -2
к единицам надо потом приводить)
NCrashed #5 - 8 лет назад 2
Дрон, наконец, вспомнил про статью. Трение осталось такое, тк правдоподобный вариант требует еще специального обсчета реакции опоры, скоростей после удара об землю и сложнее для понимания. Нельзя перегружать статью сложными вещами (если народу будет интересно я напишу статью, где будет подробный вывод всех формул столкновений и ударов, трения и тп.). Совсем "правильное" трение читатель может посмотреть в последних версиях «Fisics Dynamik System», правда надо знать немного синтаксис cJass, но это не сложно.
g=14 клеток/с^2, а для перевода в метры надо знать сколько в метре игровых единиц, не линейкой же мерить. При таком ускорении тела падают наиболее реалистично.
Palibati #6 - 8 лет назад 2
выложи наработку :)
RunixMing47 #7 - 8 лет назад 2
Слишком сложно как то....
Antosha #8 - 8 лет назад 4
Да, написано, скажем так, суховато.
CAH9KoT #9 - 8 лет назад 2
if b.v.z < 0 then
set b.v.z = - b.v.z*Rest
endif
А почему отражаем скорость по оси Z? Если тело ударится об ландшавт с сильным наклоном(например 60градусов) отскок будет выглядеть нереалистично)
ScorpioT1000 #10 - 5 лет назад 0
записи / структуры - это как ты видишь данные в коде
объекты - это что создается на самом деле во время выполнения
методы / функции - конструкции для управления объектами
Zahanc #11 - 4 года назад (отредактировано ) 0
Статья очень сильно пригодилась. В особенности принцип добавления/удаления/нахождения тела в стек(е). Теперь я смогу оптимизировать свою систему.
WeendVidente #12 - 4 года назад 0
Ничего непонятно. Для начала хот бы показали как простую 2d систему движения на векторах сделать, а потом на нее бы наращивали возможности, а то эти трения и удары об землю нубам не нужны совсем, а читаемость и понимание они ухудшают (говорю конкретно за себя).
Взял карту пример. Захотел сделать чтоб прыгал не юнит-кастер, а дамми-снаряд, заменил в тригере создания тела юнит с GetTriggerUnit() на CreateUnit(...)(поместив его в локалку перед этим. Теперь дамми создается, но висит на месте и я понятия не имею в чем дело, ведь больше ничего не менял.
Зато удары об землю есть... Простите за сарказм, но статья ничем не помогла практически(в смысле на практике).
nvc123 #13 - 4 года назад 1
WeendVidente, 2d движение есть в статье осваиваем джасс в разделе полярные координаты
WeendVidente, пока не прочитаешь статьи написанные в самом начале это можно даже не читать
WeendVidente #14 - 4 года назад 0
nvc123, разве там векторное? Полярки я знаю, интересует именно векторное движение - говорят оно намного более оптимально для производительности.
nvc123 #15 - 4 года назад 0
WeendVidente, боже,вектор в jass это просто способ возвращать не 1 переменную а 3
а там дальше он работает с координатами
код весь читай
Buulichkaa #16 - 4 года назад -2
WeendVidente, в статье все расписано для учеников 1 класса
WeendVidente #17 - 4 года назад 3
Sargaraser, так кажется тому, кто уже это знает и умеет. Я вот тоже когда людям рассказываю о том, чем владею в совершенстве, мне кажется что они ух какие тупые, раз не понимают, рассказываю же "как для детей", а на самом деле как для детей которые знают и умеют все то, что знаю и умею я.
Это редкий талант, на самом деле ставить себя на место новичка и расписывать все так как надо именно новичку, а не так как тебе кажется ему это надо.
Я вот никак найти не могу: есть пример векторного движения на чистом Jass без vJass'а?
nvc123 #18 - 4 года назад 1
WeendVidente, объясняю для тебя(прошлый мой комент ты пропустил) векторов НЕ СУЩЕСТВУЕТ
WeendVidente, и прочитай ВСЕ статьи которые указаны особенно полярные координаты и математический подход к движению
тут вектором названа точка содержащая не 2 а 3 координаты(x,y,z)
такое ощущение что ты вобще не читал код в примере
Buulichkaa #19 - 4 года назад 2
WeendVidente, я писал в вопросе про вектора точека точека вышел вектор
сократим слово вектор и ты получаешь свой отрезок, просто вектор нужен для легкой и быстрой обработки, но все операции которые можно делать с векторами можно делать и на координатах, просто это будет не так понятно, векторы нужны для удобства в процессе работы, не больше.
WeendVidente #21 - 4 года назад 1
Теперь яснее, спасибо вам за ваше терпение.
SсRealm #22 - 2 года назад -4
ниче не понял, зачем и кому и как и для чего использовать?
ScorpioT1000 #24 - 2 года назад 0
или вот, например) xgm.guru/p/wc3/xdestr
Clamp #25 - 2 года назад 0
ScorpioT1000, у тебя там столько матана, что это СЛИШКОМ ЖЕСТОКИЙ ПРИМЕР даже для меня Т_Т