XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
OmUT

offline
Опыт: 416
Активность:
Вопрос по тригерному перемещению юнита и обработке столкновений
Делаю тригерный спел суть которого заключается в том что герой бросает своё метатальное оружие в определённую сторону куда оно летит до столкновения с обьектом или пока его "кинетическая энергия" не иисякнет и оно не упадёт на землю, так же с определённым уровнем предусматривается пробивание противника навылет и изменение траектории снаряда от рикошета при малом угле столкновения. Изучив достаточно мнеого статей и карт с аналогичными спелами у меня появились некоторые вопросы. Вот я и решил спросить у уже опытных jassеров.
1)Через какие jass функции лучше всего перемещять юнит-снаряд.
2)Каким образом оптимальнее всего проверять столкновение с юнитом снаряда.
3)Как организовать перемещение снаряда так чтобы не появлялось мёртвых зон (тк за время 0.04 сек снаряд перемещяется дальше своих "физических размеров" и часто "перескакивает" цель) и юнит не повреждался дважны попадая в пересечение радиусов урона снаряда?
4)Как можно сделать так чтобы при перелёте через неровности ланшавта и обрывы снаряд не менял свою высоту.
5)На какие блоки (функции и динамические тригеры) лучше разбить тригер спела чтобы он был максимально универсальным.
6)Как оптимальнее всего организовать поддержку "мультикаста" (те одновременный каст этого спела с коректной работой тригера).

Отредактировано OmUT, 18.12.2006 в 11:45.
Старый 18.12.2006, 11:40
adic3x

offline
Опыт: 108,439
Активность:
  1. я использовал второго юнита неуязвимого и без модели (но не москитного) и перед тем как переместить основного юнита я перемещал дополнительного, а потом проверял находится ли он в той точке куда мы его переместили (если там кто то стоит или уклон какой либо то он переместится в ближайшие возможную точку) и если он не там куда мы его переместили - значит он во что то врезался)))
  2. при .04 помойму перемещение не проскакивает мертвые зоны даже на большой скорости...
  1. Думаю через кешь.
Старый 18.12.2006, 11:51
DioD

offline
Опыт: 45,134
Активность:
есть всего одна функция перемещения юнита - MoveUnit
UnitInRange 50 или меньше
Расчитать "зону" перемещения из строки выше и расстояние перемещения за диапозон времени
если снаряд прыкает на 100 то область столкновения должна быть минимум 150
сделать снаряд нелетающим изначально но имеющим абилу "в ворона" и изменять высоту тригерно
выносить оперирование памяти ИЗ любых других тригеров ивсё будет путём
"мультикаст" это баг абил с одним ID
то что надо тебе называется MUI
делать полностью через локалки или через массивы.
Старый 18.12.2006, 11:53
OmUT

offline
Опыт: 416
Активность:
Цитата:
есть всего одна функция перемещения юнита - MoveUnit

А какже SetUnitX / SetUnitY, SetUnitPosition ?

Цитата:
UnitInRange 50 или меньше

Не понял что ты хотел сказать этой фразой

Цитата:
Расчитать "зону" перемещения из строки выше и расстояние перемещения за диапозон времени

Вопрос и состоял в том КАК это сделать.

Цитата:
если снаряд прыкает на 100 то область столкновения должна быть минимум 150

Снаряд имеет оч высокую для вара скорость причём скорость зависит от параметров героя но малый размер тк что область столкновения 150 очень много.

Цитата:
сделать снаряд нелетающим изначально но имеющим абилу "в ворона" и изменять высоту тригерно

Но как отследить "абсолютную" выслту снаряда а не относительно местности?

Цитата:
"мультикаст" это баг абил с одним ID

то что надо тебе называется MUI

Важна суть, не название.

Цитата:
делать полностью через локалки или через массивы.

А чем SCV не подхоит?
К томуже как сделать чтоб локалки сохранили инфу о нескольких летящих снарядах, их высоте и состоянии.

OmUT добавил:
Цитата:
2. я использовал второго юнита неуязвимого и без модели (но не москитного) и перед тем как переместить основного юнита я перемещал дополнительного, а потом проверял находится ли он в той точке куда мы его переместили (если там кто то стоит или уклон какой либо то он переместится в ближайшие возможную точку) и если он не там куда мы его переместили - значит он во что то врезался)))

Ещё бы определить во что он врезался и того в кого он врезался первым.

OmUT добавил:
Ещё 1 возникший вопрос:
GroupEnumUnitsInRange захватит в группу юниты физ "круга" которых коснулся радиус или только тех у кого радиус коснулся центра их физ "круга".
Старый 18.12.2006, 12:19
OmUT

offline
Опыт: 416
Активность:
Вопрос состоял в том как формируется группа, те радиус R должен хотябы коснуться физ размера юнита или должен достать до координат юнита (те центра их физ размера).
Старый 18.12.2006, 12:46
NETRAT

offline
Опыт: 83,712
Активность:
1.
Цитата:
SetUnitX / SetUnitY
лучше всего так - проблем меньше - анимации не сбиваются и лишних обьектов нет
2. Проверка через временной интервал юнитов в радиусе MISSILE_SPEED*INTERVAL, для этих юнитов проверяешь расстояние - если меньше радиуса, то столкновение.
Очевидно что чем меньше интервал и скорость, тем выше качество столкновения, если значения слишком большие, то возможен недолет-перелет - столкновение может незачитываться. В этом случае необходим просчет времени столкновения в начале каждого интервала - если время попадает в следующий интервал, то можно уменьшить значение интервала до необходимого.
Когда я этим занимался, пришлось временные шкалы ввести, хотя, в любом случае вычисления достаточно геморройные и при большом количестве снарядов значительно лагают.
Этим же занимался Toadcop, его наработка на эту тему называется Projectile Creator, представляет собой движок для создания прожектайлов, столкновения там тоже просчитаны
3. Собственно твои мертвые зоны говорят о том что ты плохо предусмотрел движение снаряда - столкновения нужно проверять не по факту, а предвидеть заранее.
4,5,6. Блин, смотри Projectile Creator или спроси об этом ToadCop'a - там все это достаточно качественно реализовано
А вообще могу посоветовать почитать статьи по движкам/физике, которых пруд пруди в геймдеве

Ну, естественно координаты
Смотри физику бильярдных шаров, этот принцип вроде так называется. Есть масса статей по просчету столкновений бильярдных шаров, поищи в интернете - это больше к математике, чем к картострою
Старый 18.12.2006, 16:34
DioD

offline
Опыт: 45,134
Активность:
SetUnitX\Y

НЕ ПРОВЕРЯЕТ патчинг, и юнит вылетает за пределы карты вызывая крэш, юзать стоит только когда полностью уверен в безопасности конструкции

Проверка юнитов каждый раз идиотизм чистой воды, надо регестрировать событие
Код:
native TriggerRegisterUnitInRange takes trigger whichTrigger, unit whichUnit, real range, boolexpr filter returns event




Творение братьев по разуму тебе поможет, там проще чем у тоадкопа
Старый 18.12.2006, 16:57
OmUT

offline
Опыт: 416
Активность:
Наверное стоило сразу сказать что я только учусь писать тригеры поэтому "общие фразы" о том как это стоило бы сделать или вырваные куски кода без описания того что они делают приносят мне очень мало полезной информации.
Спел я хочу написать сам чтобы хоть чемунибудь научиться, код ToadCop'a на данный момент слишком сложен для моего понимания.
Почитать статьи по движкам совет конешно хороший но у меня нет возможности "убить" столько времени сколько на это потребуется. К томуже в статье информацию можно только найти (да и то только если этому аспекту уделил внимание автор), но ей не задаш вопрос и не получиш от неё ответ если тебе что-либо непонятно.
Теоретически можно найти сатьи почти обо всём, поэтому когда получаеш на свой вопрос ответ в стиле "в интернете есть по этому поводу статьи" то начинаеш серьёзно задумываться над тем зачем на форуме xgm столько разделов и тем когда можно было создать только 1-ну с тектом "Все ответы на вопросы ищите в статьях на сайте или в интернете.<и далее ссылки на статьи и сайты>".
Старый 18.12.2006, 19:14
NETRAT

offline
Опыт: 83,712
Активность:
DioD это ты верно подметил - всегда нужно проверять вылет за границы карты, однако Move Unit сбивает анимацию, то есть фактически снаряд не будет анимирован, да и в системе снарядов патчинг проверяется другими способами. Гхм, представляю себе полет снаряда в косую стену при использовании функции MoveUnit - он сначала ударится, а потом полетит вдоль стены - так?
При очень быстрых снарядах(когда за интервал снаряд пролетает расстояние, большее расстояния регистрации события), такой подход вообще неприменим
Да, возможно это событие будет работать быстрее, но только потому что в варе не прописана физика столкновений => в любом другом языке подход так же неприменим
Уже кто-то делал с этим ивентом - лучше получается?

OmUT в таком случае, вы слишком высокую планку берете, батенька. Если у нас реализация такой фичи вызывает споры - то я не думаю что вы сможете ее реализовать в ближайшее время
Старый 18.12.2006, 20:06
DioD

offline
Опыт: 45,134
Активность:
короче говоря ты хочешь пример в картинках... щас будет

DioD добавил:
787768768

DioD добавил:
Сделано ниже любого уровня понимания поэтому вот риплей
Старый 18.12.2006, 20:20
OmUT

offline
Опыт: 416
Активность:
Странно, чуть более подробно прокоментировать ответ тебе было трудно а вот потратить врямя на то чтобы поиздеваться надо мной тебе оказалось несложно.
DioD, лучше обьясни принцип действия:
native TriggerRegisterUnitInRange takes trigger whichTrigger, unit whichUnit, real range, boolexpr filter returns event

Цитата:
OmUT в таком случае, вы слишком высокую планку берете, батенька. Если у нас реализация такой фичи вызывает споры - то я не думаю что вы сможете ее реализовать в ближайшее время

NETRAT, нельзя ставить перед собой достижимые цели иначе после их достижения станет просто скучно. Например одна из моих недостижимых целей это добиться нормального ответа на форуме .
Старый 18.12.2006, 21:21
NETRAT

offline
Опыт: 83,712
Активность:
OmUT каков вопрос - таков и ответ. Таковы правила
Недостижимые цели - это глупо, ибо загоняют в жуткий депрессняк
Принцип действия - это регистрация события попадания любого юнита в окружность радиуса range с центром в положении юнита whichUnit. filter - фильтр события, whichTrigger - триггер собственно.
Что бы это понять, достаточно почитать статейки по jass, которых на сайте и на форуме пруд пруди
Старый 18.12.2006, 21:58
OmUT

offline
Опыт: 416
Активность:
А куда это нужно записать?
С юнитом и ранжом понятно, но не совсем понятно с фильтром и тригером можно поподробнее?
Старый 18.12.2006, 22:22
NETRAT

offline
Опыт: 83,712
Активность:
Цитата:
Что бы это понять, достаточно почитать статейки по jass
лень рассказывать то что уже пицот раз до меня сказано
Старый 18.12.2006, 22:31
DioD

offline
Опыт: 45,134
Активность:
короче даю автору ответственное задание
  1. точно и внятно выразить свои мысли, ничего не понятно
  2. задать вопросы так что бы на них можно было ответить не думая о том что ты говоришь а тебя не понимают
  3. на гуи такое не делается - поучить джаз, там надо усвоить 3 правила
а) правило порядка функций
б) правило регистра имён
в) правило переменных
  1. точно описать что именно надо, пример написать\найти будет проще, а то гадать безполезно
тему я эту пока закрою - создашь новую когда посчитаешь нужным
Старый 19.12.2006, 06:17
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 14:11.