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

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

Ответ
 
BizzaroFukuro
MWS Hardcore
offline
Опыт: 2,178
Активность:
Интерактивный труп
Суть в следующем: нужно при смерти юнита создать его труп, который можно атаковать, и который не разлагается до конца игры.
Для этого я использую триг с такой функцией:
Код:
function Corpse takes nothing returns nothing
    local unit u = udg_Unit
    local unit c = CreateUnit(Player(15),'h003',GetUnitX(u),GetUnitY(u),GetUnitFacing(u))
    call SetUnitVertexColor(c,255,255,255,0)
    call SetUnitAnimation(c,"decay flesh")

    call TriggerSleepAction(1.34)

    call SetUnitTimeScalePercent(c,0.)
    call SetUnitVertexColor(c,255,255,255,255)
    call RemoveUnit(u)
    set u = null
    set c = null
endfunction

Есть две проблемы:
1. Положение трупа != положению умирающего юнита (у трупа "Тип движения = Нет", физ.размер = 0).
Несовпадение положения - в пределах 32 коорд.точек (если на глаз).
2. В момент показа трупа (т.е. после 1.34 секунды), если камера игрока находилась далеко, то анимация трупа будет замороженный "stand". Если камера рядом (охватывает своим полем зрения умирающего юнита), то всё в порядке.
Это распространяется на каждого игрока индивидуально, т.е. кто-то видит труп по-нормальному, а кто-то видит его стоячим.

Что делать?

Отредактировано BizzaroFukuro, 30.06.2010 в 11:46.
Старый 27.02.2010, 13:13
XOR

offline
Опыт: 38,159
Активность:
  • SetUnitPathing()
  • SetUnitAnimationByIndex
XiMiKs добавил:
Убрать слип и не понятную глобалку.
Старый 27.02.2010, 13:18
BizzaroFukuro
MWS Hardcore
offline
Опыт: 2,178
Активность:
Цитата:
Сообщение от XiMiKs
SetUnitPathing()
Не помогло..

Цитата:
Сообщение от XiMiKs
SetUnitAnimationByIndex
Причем здесь это вообще? Я уже пробовал, эффект тот же.

Цитата:
Сообщение от XiMiKs
Убрать слип
Если убрать слип, то не будет проигрываться анимка смерти у умирающего юнита.

Цитата:
Сообщение от XiMiKs
не понятную глобалку
С глобалкой всё в порядке.

Отредактировано BizzaroFukuro, 27.02.2010 в 14:10.
Старый 27.02.2010, 13:41
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
BizzaroFukuro, насчет первого: ты сначала удали старого юнита а потом создавай труп.
Старый 27.02.2010, 13:46
XOR

offline
Опыт: 38,159
Активность:
Зачем глобалку в локалку? да и в принципе функцию можно запускать через TriggerAddAction. Слип менять на таймер.
XiMiKs добавил:
И ты при SetUnitPathing false ставил? Труп 1 кстати не удаляешь. 2
Старый 27.02.2010, 13:47
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
SetUnitX/Y после создания.
FellGuard добавил:
Вообще, делай по событию "юнит начинает разлагаться", не надо будет так заморачиваться.
Старый 27.02.2010, 13:49
Mr_ILYAS
Kicked by XimikS
offline
Опыт: 492
Активность:
А ты в курсе, что когда создаешь юнита в каком то месте. он всё равно создается не в точном месте где хотел?
Поэтому всё равно надо юнита передвигать после того как создал
call SetUnitX(c,GetUnitX(u))
call SetUnitY(c,GetUnitY(u))
в строке call SetUnitTimeScalePercent(c,0.) Percent можно убрать (но только в твоём случае, так как у тебя всё равно ноль стоит)
По поводу второго вопроса, попробуй:
call SetUnitAnimationByIndex(какой юнит, номер анимации) (номер анимации можно принимать от 0 до 15 (больше я не видел юнита у которого больше анимаций) )
Старый 27.02.2010, 13:58
BizzaroFukuro
MWS Hardcore
offline
Опыт: 2,178
Активность:
Цитата:
Сообщение от XiMiKs
И ты при SetUnitPathing false ставил?
Что за нубский вопрос? Конечно false ставил.

Цитата:
Сообщение от FellGuard
SetUnitX/Y после создания.
Пробовал щас по-всякому, но прокатывает всё равно. :/

Цитата:
Сообщение от FellGuard
Вообще, делай по событию "юнит начинает разлагаться", не надо будет так заморачиваться.
Забыл про такое событие, спс. Но это мало что меняет.

Цитата:
Сообщение от Mr_ILYAS
call SetUnitAnimationByIndex(какой юнит, номер анимации) (номер анимации можно принимать от 0 до 15 (больше я не видел юнита у которого больше анимаций) )
Я уже сказал, что пробовал и это ни на что не влияет. У меня проблема с КАМЕРОЙ связана, причем локально.
Старый 27.02.2010, 14:09
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
BizzaroFukuro, криво ты пробовал. SetUnitX/Y поместит юнита куда надо даже если указанные координаты находятся за пределами карты.
Смена события, во-первых, избавит тебя от беготни с TriggerSleepAction(), во-вторых не надо будет создавать лишнюю локалку.
Старый 27.02.2010, 14:13
BizzaroFukuro
MWS Hardcore
offline
Опыт: 2,178
Активность:
Цитата:
Сообщение от FellGuard
SetUnitX/Y поместит юнита куда надо даже если указанные координаты находятся за пределами карты.

Это я знаю, поэтому буду пробовать ещё.

Но вообще основная проблема - вторая. Ради одной первой проблемы я бы не стал мутить тему (просто спросил до кучи).
Старый 27.02.2010, 14:24
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
короче так) Дело было в скорости смешения анимаций.
function  LockDecayer takes unit u returns nothing
    local unit c = CreateUnit(Player(15),GetUnitTypeId(u),0.,0.,GetUnitFacing(u))           
    call SetUnitX(c,GetUnitX(u))
    call SetUnitY(c,GetUnitY(u))
    call SetUnitColor(c, GetPlayerColor(GetOwningPlayer(u)))
    
    call SetUnitBlendTime(c,0.)
    call SetUnitAnimation(c, "decay flesh")
    call SetUnitTimeScale(c,0.)
    call RemoveUnit(u)
    set c = null
endfunction
Старый 27.02.2010, 14:53
ScorpioT1000
Работаем
offline
Опыт: отключен
никогда не вызывайте remove unit если он не мёртв
Старый 27.02.2010, 15:16
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
ScorpioT1001, а он мёртв) Т.е. ф-ия срабатывает на событие UNIT_DECAY
FellGuard добавил:
Вообще да, забыл сказать, ещё Тс рекомендовал не использовать РемувЮнит вообще. Вполне достаточно опрозрачнить, игра доделает остальное.
Старый 27.02.2010, 15:24
BizzaroFukuro
MWS Hardcore
offline
Опыт: 2,178
Активность:
Цитата:
Сообщение от FellGuard
Дело было в скорости смешения анимаций.
Спасибо, помогло =)

Что по поводу первой проблемы - я делал также, как в твоём примере. Как ни странно, это всё равно не помогло, до тех пор пока я не поставил у трупа физ.размер 16 вместо нуля.
Цитата:
Сообщение от FellGuard
Вполне достаточно опрозрачнить, игра доделает остальное.
Это как?
Старый 28.02.2010, 17:26
Doc

offline
Опыт: 63,163
Активность:
FellGuard, лично я убираю юнита так:
call SetUnitPosition(GetTriggerUnit(),999999,999999)
call KillUnit(GetTriggerUnit())

Отредактировано DoctorGester, 28.02.2010 в 17:58.
Старый 28.02.2010, 17:43
XOR

offline
Опыт: 38,159
Активность:
DoctorGester:
Позишн это плохо
SetUnitVertexColor(u,255,255,255,0)
KillUnit(u)
Старый 28.02.2010, 18:36
Doc

offline
Опыт: 63,163
Активность:
XiMiKs, чем плохо то? у меня при убийстве юнита еще тексттаги над головой появляются, так что мне нужно его из поля зрения убирать
Старый 28.02.2010, 19:56
BizzaroFukuro
MWS Hardcore
offline
Опыт: 2,178
Активность:
Всем спасибо, можно закрывать.
Старый 02.03.2010, 12:54
Ответ

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

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

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

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



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