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

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

Закрытая тема
 
Preveder
StarCraft II® Inside
offline
Опыт: 1,927
Активность:
Кривые молнии. WTF?
Искал на форуме про одну интересную вещь, но ответа так и не нашёл. Посему задам вопрос.

Я создаю триггерные спеллы с эффектами молний. Молнии двигаются от периодического триггера нормально, но создаются некоторые пробелмы с их отображением.

Пример. Имеется триггерный форкед лайтнинг. Кастер стоит на месте, группа целей находится относительно кастера на севере. Говорим спелл, начала и концы молний становятся скошены примерно на 100-200 единиц вниз по оси Y и вроде бы X (в общем смотрится это крайне криво).

Юзаю движениe молнии с координатой z (берётся из высоты полёта обоих юнитов).

Если относительно кастера цели находятся на востоке или на юге, то отображается всё ровно - молнии начинаются в кастере, заканчиваются ровно в мобах.

Если цели находятся относительно кастера на западе - опять кривость.

Внимание, впорос: WTF?
Старый 10.08.2009, 04:34
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
триггеры покажи. ничего непонятно, и еще: "WTF?" - это риторический вопрос. задай его нормально
Старый 10.08.2009, 04:37
Preveder
StarCraft II® Inside
offline
Опыт: 1,927
Активность:
Код:
struct light
    lightning l
    unit a
    unit b
    real time
    method clear takes nothing returns nothing
        call DestroyLightning(this.l)
    endmethod
    method movelight takes nothing returns nothing
        call MoveLightningEx(this.l,true,GetUnitX(this.a),GetUnitY(this.a),GetUnitFlyHeight(t  his.a),GetUnitX(this.b),GetUnitY(this.b),GetUnitFlyHeight(this.b))
    endmethod
endstruct

function SpellLightningMove takes nothing returns nothing
    local light data = TimerGetData()
    call data.movelight()
    set data.time = (data.time - 0.04)
    if data.time <= 0 then
        call TimerRemoveEx()
        call data.clear()
        call data.destroy()
    endif
endfunction

function SpellLightning takes string s, unit a, unit b, real time returns nothing
    local light data = light.create()
    set data.l = AddLightningEx(s,true,GetUnitX(a),GetUnitY(a),GetUnitFlyHeight(a),GetUnitX(b),Ge  tUnitY(b),GetUnitFlyHeight(b))
    set data.a = a
    set data.b = b
    set data.time = time
    call TimerStartEx(0.04, true, data, function SpellLightningMove)
endfunction


В общем, по идее двигаться оно должно нормально, только вот не во всех направлениях на практике.

UPD:
Странности. Когда это происходит в части карты, где X отрицательное, происходит некое смещение "назад" молний. При применении в другой части карты - всё замечательно.

Отредактировано Preveder, 10.08.2009 в 05:09.
Старый 10.08.2009, 04:42
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
Preveder, бросилось первое в глаза мб это причина: вижу как ты запускаеш таймер, но как приостанавливаеш.... нет такого у тебя в коде нет. вот и получается: функция работает с null/0.00 значениями. оттуда и кривость... и еще как вариант включи в вкладке Jass Helper -> Debug Mode поидее он должен на твой код ругаться
Старый 10.08.2009, 05:22
Preveder
StarCraft II® Inside
offline
Опыт: 1,927
Активность:
Цитата:
Сообщение от Bee
~Preveder, бросилось первое в глаза мб это причина: вижу как ты запускаеш таймер, но как приостанавливаеш.... нет такого у тебя в коде нет. вот и получается: функция работает с null/0.00 значениями. оттуда и кривость... и еще как вариант включи в вкладке Jass Helper -> Debug Mode поидее он должен на твой код ругаться

Дебаг не ругается. Попробую паузить сразу после приёма аттача и продолжать после обработки...

Preveder добавил:
Ха! Проблема была даже не в этом! Всё оказывается сидело в кривой z координате. Написал функцию, пока что с утечкой:

Код:
function GetUnitZ takes unit u returns real
    set bj_enumDestructableCenter = GetUnitLoc(u)
    return (GetLocationZ(bj_enumDestructableCenter) + GetUnitFlyHeight(u))
endfunction


И вроде тьфу-тьфу. Даже в первоначальном варианте без паузы таймера.

Без утечки выглядить будет примерно так:
Код:
function GetUnitZ takes unit u returns real
    set bj_enumDestructableCenter = GetUnitLoc(u)
    set bj_meleeNearestMineDist = GetLocationZ(bj_enumDestructableCenter)
    call RemoveLocation(bj_enumDestructableCenter)
    return (bj_meleeNearestMineDist + GetUnitFlyHeight(u))
endfunction


Бтв, предлагаю добавить в библиотеку функций или FAQ, чтобы другие в калошу не сели на этом, как я.

Отредактировано Preveder, 10.08.2009 в 05:52.
Старый 10.08.2009, 05:40
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
Бтв, предлагаю добавить в библиотеку функций
она уже там есть только покруче на первых страницах
Старый 10.08.2009, 06:12
Закрытая тема

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

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

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

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



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