NCrashed
offline
Опыт:
13,553Активность: |
vJass Создание moving system
ВведениеЭта статья расскажет об основных приемах создания систем движений (или «moving systems») с использованием возможностей vJass, о правильной организации таких систем и способов их оптимизации. Статья пригодится как новичкам в vJass, так и опытным пользователям. Перед освоением этого материала рекомендуется прочитать статьи «Осваиваем jass»,«Осваиваем JASS - исправления и дополнения» , «Математический подход к движению». Инструменты
Краткий курс теорииНе будем загружать мозги пользователю лишней информацией, но все-таки кое-что знать надо. Два основных способа описания движенияВ геометрии существую два основных направления:
Оба направления имеют свои недостатки и преимущества. В этой статье мы будем оперировать векторами, так как векторная геометрия позволяет просто и понятно реализовать движение в пространстве и добавить правдоподобности движению (так как физика и так является «векторной» наукой ) DEAD URL
Знакомьтесь, это вектор! Это основное понятие стереометрии, но объяснить его можно так: «направленный отрезок». У каждого вектора есть свои координаты, которые можно найти по формуле a={Bx-Ax, By-Ay, Bz-Az}. Чтобы определить длину вектора можно воспользоваться такой формулой: |a| = Sqrt( ax^2 + bx^2 + bz^2) Еще нам понадобится операция «нормирования вектора», то есть установка единичной длины: a={ax/|a|, ay/|a|, az/|a|} Вектора можно складывать, вычитать, умножать на число или на другой вектор (об этом по мере необходимости). Но, однако, координаты вектора не определяют его положения в пространстве, нужна еще точка, из которой он выходит: DEAD URL
Теперь мы обладаем инструментом, с помощью которого можем попасть в любую точку пространства, получаем универсальную систему уравнений: Код:
Правда, все легко и просто? Именно на этом ките держится вся стереометрия, не точка, а именно вектор (точку вообще можно представить как вектор, исходящий из начала координат в эту точку). Принципы ООП (объектно ориентированного программирования )Для правильного понимания что такое структура, обратимся к некой "эволюционной цепочке": переменная->массивы->записи->объекты Переменные появились очень давно, предназначаются для хранения информации одного типа. Массивы появились, когда появилась необходимость хранить несколько переменных одного типа. Записи придумали, когда нужно было хранить одновременно несколько переменных разных типов, например, с помощью записей легко создать телефонный справочник (1 запись: имя абонента и его телефон, потом записи хранят в 1 массиве). Наконец, объекты - это объединение записей (связки переменных) и функций, которые обрабатывают эти переменные. В итоге мы получили переменную-объект, которая максимально изолирована и может существовать сама по себе (+еще функционировать). В vJass структуры - имитация объектов. У них есть и разносортные переменные и функции, которые обрабатывают эти переменные (они называются методами). Рассмотрим пример: Код:
Но как теперь использовать структуру? Код:
Но иногда нам не нужно, чтобы в структуру передавалась переменная this, тогда указываем что метод "статичный": Код:
Статичные методы нужны для альтернативного создания структуры: Код:
Иногда необходимо уничтожить еще и структуры или переменные (триггер в нашем примере), которые содержатся внутри структуры (например, вы опишите структуру "точка" и добавите в вектор переменную "point Begin = point.create()"), тогда пишете свой аналог destroy: Код:
Первые шагиТеперь приступим к самому программированию. В vJass добавили возможность создания библиотек – области кода, которые после компиляции будут вставлены выше Custom script карты. Очень полезная вещь, позволяет систему держать в 1 триггере, облегчая импорт вашей наработки. Удаляем стандартную инициализацию и создаеме триггер «MovingSys», дальше «Правка->Конвертировать в текст», удаляем весь текст из триггера и пишем: Код:
Вот и создали библиотеку, теперь нам надо описать вектор. Вектору необходимы 3 переменные для его координат: Код:
Теперь добавим методы (те самые функции) для операций над вектором: Код:
Поздравляю, первый «кит» системы готов! Теперь обратим свой взор на объекты движения. Двигать мы будем юнитов, и чтобы к ним привязать векторы скорости, ускорения и силы, создадим еще одну структуру: Код:
Основная часть движкаТеперь остался последний кит – сам цикл движения. Есть два способа двигать тело: обсчитывать координаты, а потом перемещать юнита в точку с этими координатами; брать за основу координаты юнита и перемещать относительно них. Может быть, вам не видно разницы между этими способами? Тогда приведу примеры: Код:
Это пример первого способа. Все вычисления производятся вне нативных функций, при этом не учитываются «желания» юнита передвигаться, поэтому придется делать еще триггер сброса приказа (или добавлять способность москитов), так как при попытке бежать юнит будет дергаться. Код:
Второй способ. Теперь два движения будут складываться. Воспользуемся этим методом. Создаем массив тел, по которому будет бегать цикл: Код:
Теперь создадим функцию, которая нам запустит систему: Код:
Пора наполнить содержанием функцию «Engine»: Код:
Последний шагТеперь осталось научится добавлять тело в этот стек. Для этого в структуру body добавьте такой метод: Код:
Теперь можно создать тело, задать ему начальные параметры и поместить в движок с помощью этого метода. Последний штрих – сделать пространство объемным. Для этого к z юнита прибавлять разницу высот. Тогда главная часть движка примет вид: Код:
А в метод уничтожения тела корректируем вот так (при удалении в стеке все равно остается записано тело, точнее integer - номер ячейки где он хранился. ). На самом деле все переменные, ссылающиеся на структуру являются типом integer, который есть номер ячейки массива, в котором вар хранит структуру: Код:
Добавляем физические явления (удар об землю, трение и т.п.)Теперь создадим отдел параметров системы для удобства настройки: Код:
Советую всегда при создании систем выносить коэффициенты к заголовку библиотеки и давать пояснительные комментарии к ним. Это поможет разобраться в собственной системе через несколько месяцев. Теперь удары об землю и границы карты: Код:
Сейчас добавим сухое трение: Принцип такой, если на тело действует сила больше mu*(mg-Fz), тогда вычитаем из вектора силы тела силу трения, иначе отнимаем от скорости эту величину деленную на массу: Код:
ЗаключениеСкелет системы готов, теперь на него можно наращивать остальные части, например: притяжение к земле, трение, столкновения с другими телами. В карте примере находится эта система, но уже с сухим трением и притяжением к земле. Для примера я сделал на основе этой системы спелл «Прыжок», чтобы показать систему в действии. Теперь, освоив эту статью, вы можете легко делать реалистичные заклинания. Идеи черпал из моей физической библиотеки «Fisics Dynamik System», по сути, это та же система, но усложненная. P.S. Это моя первая статья, так что сильно не бить =), но критику излагать в полном объеме. Отредактировано NCrashed, 08.10.2009 в 23:32. |
06.09.2009, 19:56 | #1
+2/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Daemonik
offline
Опыт:
5,084Активность: |
Статья супер! Все разжеванно, все предельно понятно и ясно. К тому же с этого можно начать знакомство с vJass. ИМХО. Одна из самых понятных статей. Понять сможет любой новичок хоть чуть-чуть знакомый с векторами. |
06.09.2009, 20:51 | #2
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
NCrashed
offline
Опыт:
13,553Активность: |
Уфф... я то думал, что не достаточно разжевал =) |
06.09.2009, 20:54 | #3
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DragonSpirit
у - уходи
offline
Опыт:
22,625Активность: |
NCrashed, спасибо,статья хорошая,особенно помогает новчкам научиться работать со структурами и методами,имхо зачёт |
06.09.2009, 21:03 | #4
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
Статья тру мне понравилось, продолжай писать еще) |
06.09.2009, 22:33 | #5
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
bee
vjass.optimizer
offline
Опыт:
16,615Активность: |
NCrashed, огромное спасибо! только сейчас понял за чем писать i=i-1 когда удаляем data)
и что представляет собою вектор. бесконечный респект тебе, NCrashed я кстати еще и методы почти понял ) щяс налью чашечку кофе, и внимательно перечитаю.... ыыы завтра школу просплю а на матике как раз про векторы раскажут)) их же в 9 проходят? спасибо еще раз... |
06.09.2009, 22:46 | #6
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
NCrashed
offline
Опыт:
13,553Активность: |
с 9того и до конца =) . Очень нужная штука. |
06.09.2009, 22:49 | #7
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
bee
vjass.optimizer
offline
Опыт:
16,615Активность: |
ага, спасибо =) |
06.09.2009, 22:52 | #8
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Garret
Недоброе творится
offline
Опыт:
3,893Активность: |
Не нашёл дестроя структур. Да, в вДжасс на шарю совсем. |
06.09.2009, 23:14 | #9
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
NCrashed
offline
Опыт:
13,553Активность: |
для любой структуры пишешь
<твоя структура>.destroy() И она удалится, но иногда необходимо уничтожить еще и структуры, которые содержатся внутри структуры, тогда пишешь свой аналог, например в статье создан для тела метод:
NCrashed добавил:
Сейчас добавлю это в статью NCrashed добавил:
Вот и шанс понять хоть немного, и я когда-то не шарил в джаззе вовсе |
06.09.2009, 23:25 | #10
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Garret
Недоброе творится
offline
Опыт:
3,893Активность: |
NCrashed:
Спасибо конечно, но нахрен не надо Я просто указываю на те моменты, которые можно улучшить для новичков. Если описываются всякие добавления в массив, то можно (скорее нужно) показать, что мы будем делать для его убирания из массива. На данный момент я вижу только какие-то "порченные элементы" - мне мало понятно, а совсем новичкам тем более. |
06.09.2009, 23:33 | #11
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
NCrashed
offline
Опыт:
13,553Активность: |
Ну так бы сразу и сказал. Поправим
NCrashed добавил: Исправил. Статью совсем новички не смогут понять, сначала нужно освоить обычный джазз. |
06.09.2009, 23:39 | #12
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Garret
Недоброе творится
offline
Опыт:
3,893Активность: |
Есть такая штука, как onDestroy. По мне удобнее, чем писать "заменяющий" метод. Оставляю на усмотрение автора. З.Ы. завтра приду проверю ещё одну весчь, есть сомнения |
06.09.2009, 23:45 | #13
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
NCrashed
offline
Опыт:
13,553Активность: |
для onDestroy создается триггер, отлавливающий это событие, да и ADOLF упомянул что им пользоваться нежелательно. Быстрее работает заменяющий метод.
NCrashed добавил: Добавлен раздел о принципах ооп, все что используется в статье от ооп попытался тщательно разжевать. |
07.09.2009, 00:37 | #14
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
truth troll
Silenced by truth troll
offline
Опыт:
7,396Активность: |
NCrashed, Ну ты тип О_о тебе череп не жмёт? ( это комплимент =))) )
|
07.09.2009, 09:15 | #15
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Sebra
offline
Опыт:
5,603Активность: |
Статья, оно, конечно, дело хорошее. Но кое-что надо исправить!
В целом статья хорошая, исправляй. |
07.09.2009, 12:47 | #16
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
улыбнуло... мб таки stack? ооп в вЖасс реализации будут медленее по производительности
использованный метод хранения стеком являться не может, т.к. нарушает его главный принцип - достаем первым то, что положили последним
а статейка интересная, новичкам будет полезно
я вообще противник ооп (в вЖасс реализации, ибо она достаточно черезжопаня) просто тут мы имеем дело с так называемым "узким местом"
карта пример уныленькая таки, да
код мона заоптимизить очень и очень, это так, к слову... |
07.09.2009, 13:41 | #17
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
NCrashed
offline
Опыт:
13,553Активность: |
В самой системе нет, а вот в примере "прыжок" использует.
Исправим
0_o я это написал? Не верю, случайно вышло. Исправлю
В статье не сказано, что это стек, исправлю имя массиву и будет совсем не стек. Я понял, что внушаю новичкам неправильное представление о стеке)
Это же карта пример, она не обязана быть веселой Например? Очень-очень не надо, ибо чрезмерная оптимизация здесь вредит пониманию материала Исправим вставкой строки "set i = i - 1" Ну решил я не путать народ и начать с 1 ячейки. В карте-примере отслеживаются и границы карты Отредактировано NCrashed, 07.09.2009 в 21:37. |
07.09.2009, 19:45 | #18
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
TYRans_ShaRhy
Welcome to the World
offline
Опыт:
4,653Активность: |
Полезно, даже очень полезно... |
07.09.2009, 21:31 | #19
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
XOR
offline
Опыт:
38,284Активность: |
Круто.. Очень Полезно) |
07.09.2009, 21:47 | #20
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|