[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

`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
22
11 лет назад
Отредактирован Zahanc
0
Статья очень сильно пригодилась. В особенности принцип добавления/удаления/нахождения тела в стек(е). Теперь я смогу оптимизировать свою систему.
3
8
11 лет назад
3
Ничего непонятно. Для начала хот бы показали как простую 2d систему движения на векторах сделать, а потом на нее бы наращивали возможности, а то эти трения и удары об землю нубам не нужны совсем, а читаемость и понимание они ухудшают (говорю конкретно за себя).
Взял карту пример. Захотел сделать чтоб прыгал не юнит-кастер, а дамми-снаряд, заменил в тригере создания тела юнит с GetTriggerUnit() на CreateUnit(...)(поместив его в локалку перед этим. Теперь дамми создается, но висит на месте и я понятия не имею в чем дело, ведь больше ничего не менял.
Зато удары об землю есть... Простите за сарказм, но статья ничем не помогла практически(в смысле на практике).
2
28
11 лет назад
2
WeendVidente, 2d движение есть в статье осваиваем джасс в разделе полярные координаты
WeendVidente, пока не прочитаешь статьи написанные в самом начале это можно даже не читать
1
8
11 лет назад
1
nvc123, разве там векторное? Полярки я знаю, интересует именно векторное движение - говорят оно намного более оптимально для производительности.
0
28
11 лет назад
0
WeendVidente, боже,вектор в jass это просто способ возвращать не 1 переменную а 3
а там дальше он работает с координатами
код весь читай
0
21
11 лет назад
0
WeendVidente, в статье все расписано для учеников 1 класса
5
8
11 лет назад
5
Sargaraser, так кажется тому, кто уже это знает и умеет. Я вот тоже когда людям рассказываю о том, чем владею в совершенстве, мне кажется что они ух какие тупые, раз не понимают, рассказываю же "как для детей", а на самом деле как для детей которые знают и умеют все то, что знаю и умею я.
Это редкий талант, на самом деле ставить себя на место новичка и расписывать все так как надо именно новичку, а не так как тебе кажется ему это надо.
Я вот никак найти не могу: есть пример векторного движения на чистом Jass без vJass'а?
2
28
11 лет назад
2
WeendVidente, объясняю для тебя(прошлый мой комент ты пропустил) векторов НЕ СУЩЕСТВУЕТ
WeendVidente, и прочитай ВСЕ статьи которые указаны особенно полярные координаты и математический подход к движению
тут вектором названа точка содержащая не 2 а 3 координаты(x,y,z)
такое ощущение что ты вобще не читал код в примере
2
21
11 лет назад
2
WeendVidente, я писал в вопросе про вектора точека точека вышел вектор
сократим слово вектор и ты получаешь свой отрезок, просто вектор нужен для легкой и быстрой обработки, но все операции которые можно делать с векторами можно делать и на координатах, просто это будет не так понятно, векторы нужны для удобства в процессе работы, не больше.
0
28
11 лет назад
0
Sargaraser, тут вектором названа точка(3 координаты)
2
8
11 лет назад
2
Теперь яснее, спасибо вам за ваше терпение.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.