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

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

Ответ
 
Hares
полупротосс
offline
Опыт: 6,966
Активность:
Помогите, пожалуйста. Делаю ф-ю, чтоб юнита по параболе бросало.
я рассчитал ур-е той самой параболы, а именно: (-4h/(d^2))x(x-d), где d - дистанция полёта, а h - его высота.
function GetY takes real a, real b, real c, real x returns real
    
    call DisplayTextToForce(GetPlayersAll(), R2S(a * x * x + b * x + c))
    return (a * x * x + b * x + c)
    
endfunction

function Polar takes location Loc, real Distance, real Angle returns location
    
    return Location(GetLocationX(Loc) + Distance * CosBJ(Angle), GetLocationY(Loc) + Distance * SinBJ(Angle))
    
endfunction

function MakeUnitJump takes unit Target, real Distance, real Height, real Angle, real Time, boolean Wait returns nothing
    

    local real d
    local real x
    local real y
    local real Y
    local real a
    local real Periodic
    
    if Wait == false then
        
        set udg_Index[0] = udg_Index[0] + 1
        call SaveUnitHandle(udg_Jump, 0, udg_Index[0], Target)
        call SaveReal(udg_Jump, 1, udg_Index[0], Distance)
        call SaveReal(udg_Jump, 2, udg_Index[0], Height)
        call SaveReal(udg_Jump, 3, udg_Index[0], Angle)
        call SaveReal(udg_Jump, 4, udg_Index[0], Time)
        
        call TriggerExecute( gg_trg_Jump )
        
    else
        
        call DisplayTextToForce( GetPlayersAll(), "Функция инициирована" )
        
        set d = Distance
        set Periodic = 0.02
        set Y = 0
        set y = 0
        set a = -4 * Height / d / d
        
        set x = 1
        loop
            exitwhen x > d
            
            
            call PolledWait(Periodic)
            
            call DisplayTextToForce( GetPlayersAll(), "1")            
            call DisplayTextToForce( GetPlayersAll(), R2S(x) )
            call DisplayTextToForce( GetPlayersAll(), R2S(d) )
            
            set y = GetY(a, -a*d, 0, x)
            call SetUnitFlyHeightBJ(Target, GetUnitFlyHeight(Target) + y - Y, 0)
            set Y = y
            
            call DisplayTextToForce( GetPlayersAll(), "2")
            call DisplayTextToForce( GetPlayersAll(), R2S(x) )
            call DisplayTextToForce( GetPlayersAll(), R2S(y) )
            
            call SetUnitPositionLoc(Target, Polar(GetUnitLoc(Target), d / Time * Periodic, Angle))
            set x = x + d / Time * Periodic
            
            call DisplayTextToForce( GetPlayersAll(), "3")
            call DisplayTextToForce( GetPlayersAll(), R2S(x) )
            call DisplayTextToForce( GetPlayersAll(), R2S(d) )
            
        endloop
        
    endif
    
    //Обнуление переменных
    set x = 0
    set y = 0
    set Y = 0
    set Periodic = 0
    set a = 0
    
endfunction
Самое смешное - все сообщения выдают, что юнит не только подлетает, но и смещается в заданном направлении.
Ну, с полётом мне более или менее понятно, там надо дать способность полёта. Но почему он тупо стоит на месте?
Прикрепленные файлы
Тип файла: w3x 01.w3x (16.9 Кбайт, 13 просмотров )
[+] замечание от Hanabishi: 4.3 (археология)
Старый 23.05.2011, 20:09
Doc

offline
Опыт: 63,163
Активность:
карту не качал пока.
скорость юнита больше 0?
алсо, нехендловые переменные обнулять не надо + конструкция типа Value == false убога, юзай not Value.
Doc добавил:
и что за ужас, полледвэйты омг, локейшены, кто вас учил такое делать?
Старый 23.05.2011, 20:51
Helpmeplz

offline
Опыт: 11,738
Активность:
полледвейт в цикле :facepalm:, утечки, локации, обнуление вещественных
делай через координаты, таймер и хеш таблицу
в барахолке куча наработок
Старый 23.05.2011, 21:02
FKoFF
Venomancer 89lvl. Europe
offline
Опыт: 5,975
Активность:
((код jass
function Polar takes location Loc, real Distance, real Angle returns location

return Location(GetLocationX(Loc) + Distance * CosBJ(Angle), GetLocationY(Loc) + Distance * SinBJ(Angle))

endfunction
))
бог ты мой, you made my day :D
а если серьезно то эта функция - просто эпический фейл, мало того что ни один джассер не использует локации ибо они абсолютно не нужны при работе с любыми объектами, так еще ведь проблема что эта функция создает еще одну локацию, тогда как самым разумным вариантом было бы сместить локацию, которую функция берет как аргумент. Но это еще не все. Ржака заключается в том числе еще и в том что в итоге локация работает на бж функциях, а это вдвойне ужасно.
ладно, ржаку словили, пора бы и помочь юзверю, объяснив все ошибки и подробно поглумившись над его действиями.
Я не знаю кто, когда и зачем дал автору в руки учебник "как строить спеллы на ГУИ" где рассказывалось что в циклах надо использовать вейты, что арка получается по формуле
((код jass
set y = GetY(a, -a*d, 0, x)
a * x * x + b * x + c
))
в общем то математические способности автора поражают не на шутку когда речь заходит о построении "параболы", но глум глумом , а здесь то помочь можно.
((код jass
function GetArc takes real mh, real md, real cd returns real
return ( ( ( 4.00 * mh ) / md ) * ( ( md - cd ) * ( cd / md ) ) )
mh = max height, md = max distance, cd=current distance
endfunction
))
Ну да впрочем ладно, здесь есть что обсуждать.
((код jass
set udg_Index[0] = udg_Index[0] + 1
call SaveUnitHandle(udg_Jump, 0, udg_Index[0], Target)
call SaveReal(udg_Jump, 1, udg_Index[0], Distance)
call SaveReal(udg_Jump, 2, udg_Index[0], Height)
call SaveReal(udg_Jump, 3, udg_Index[0], Angle)
call SaveReal(udg_Jump, 4, udg_Index[0], Time)

call TriggerExecute( gg_trg_Jump )
))
Парень, а ты не шутишь? на кой черт тебе сдался этот массив? Где же тот сенсей, что б его подняло да прихлопнуло, который тебя учил так обращаться с хэш-таблицами? Да и еще - какого, простите, инфернального члена я вижу отдельную хэш-таблицу для спелла? Знаешь ли ты что хэш-таблицы - самые тяжелые объекты в игре и большое их количество просто выбивает игру фаталом?
*глаза идут ниже и упираются в функцию call SetUnitPositionLoc(Target, Polar(GetUnitLoc(Target), d / Time * Periodic, Angle))*
Дружище, а ты не тролль? Зачем использовать джасс даже не удаляя утечки?
*увидел PolledWait*
Это не говнокодер, и не быдлокодер, и даже не индус, это, черт его дери, всадник апокалипсиса!
Одно дело когда нубогуишник выкладывает конверт триггера в джасс, и кодер офигивает от увиденного кошмара, другое дело когда выкладывают вроде бы осмысленный джасс код, а видим мы нечто срашнее чем конвертированный гуи.
впрочем ладно, хватит говорить гадости...
((код jass
function SimpleJumpcb takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer ti=GetHandleId(t)
local unit u=LoadUnitHandle(udg_Data,ti,0)
local real x2=LoadReal(udg_Data,ti,1)
local real y2=LoadReal(udg_Data,ti,2)
local real mh=LoadReal(udg_Data,ti,3)
local real speed=LoadReal(udg_Data,ti,4)
local real md=LoadReal(udg_Data,ti,5)
local real cd=LoadReal(udg_Data,ti,6)
local real x1=GetWidgetX(u)
local real y1=GetWidgetY(u)
local real angle=bj_RADTODEG * Atan2(y2 - y1, x2 - x1)
if cd<md then
call SetUnitPosition(u,x1+speed*Cos(angle*bj_DEGTORAD),y1+speed*Sin(angle*bj_DEGTORAD))
call SetUnitFlyHeight(u,( ( ( 4.00 * mh ) / md ) * ( ( md - cd ) * ( cd / md ) ) ),0.03)
set cd=cd+speed
call SaveReal(udg_Data,ti,6,cd)
else
call RemoveSavedHandle(udg_Data,ti,0)
call FlushChildHashtable(udg_Data,ti)
call DestroyTimer(t)
call SetUnitPathing(u,true)
call UnitRemoveAbility(u,'Aave')
call PauseUnit(u,false)
endif
set t=null
set u=null
endfunction
function SimpleJump takes unit u, real targx, real targy, real height, real speed returns nothing
local timer t=CreateTimer()
local integer ti=GetHandleId(t)
call PauseUnit(u,true)
call SetUnitPathing(u,false)
call UnitAddAbility(u,'Aave')
call SaveUnitHandle(udg_Data,ti,0,u)
call SaveReal(udg_Data,ti,1,targx)
call SaveReal(udg_Data,ti,2,targy)
call SaveReal(udg_Data,ti,3,height)
call SaveReal(udg_Data,ti,4,speed)
call SaveReal(udg_Data,ti,5,SquareRoot((targx-GetWidgetX(u)) * (targx-GetWidgetX(u)) + (targy-GetWidgetY(u)) * (targy-GetWidgetY(u))))
call SaveReal(udg_Data,ti,6,0)
call TimerStart(t,0.03,true,function SimpleJumpcb)
set t=null
endfunction
))
unit u - юнит который должен сигануть
real targx - конечная точка по оси X
real targy - конечноая точка по оси Y
real height - понятное дело, максимальная высота для дуги
real speed - скорость с которой юнит будет двигаться.
Старый 24.05.2011, 01:44
Helpmeplz

offline
Опыт: 11,738
Активность:
FKoFF, не проще ли движение задавать временем, расстоянием и углом, вместо координат и скорости. в таком случае перед движением придется вычислить лишь угол.
а у тебя мало того, что все равно придется вычислять угол, так еще надо находить координаты. не говоря уже про расчет скорости с учетом периода 0.03 с.
угол и смещение можно посчитать единожды для юнита и сразу сохранить в хеш-таблицу, а не производить это 33.(3) раза в секунду
Старый 24.05.2011, 10:55
Nekit1234007

offline
Опыт: 11,916
Активность:
Векторы <3
Старый 24.05.2011, 13:10
FKoFF
Venomancer 89lvl. Europe
offline
Опыт: 5,975
Активность:
Helpmeplz:
не проще ли движение задавать временем, расстоянием и углом, вместо координат и скорости.
так тоже можно, однако мне конкретно приглянулся вариант с координатами.
Helpmeplz:
в таком случае перед движением придется вычислить лишь угол.
Что мешает дописать один SaveReal? и один LoadReal?
Helpmeplz:
про расчет скорости с учетом периода 0.03 с.
мне кажется или кто то палится? Скорость с учетом такого периода расчитывается на раз-два, достаточно знать что 10 = 333, 15 = 500, 20 = 666, это запомнить и исходя из этого мыслить, как мне кажется, достаточно просто.
Helpmeplz:
угол и смещение можно посчитать единожды для юнита и сразу сохранить в хеш-таблицу
смещение в любом случае записывается
Helpmeplz:
33.(3) раза в секунду
никогда не думал что формулы хоть сколько-то нагружают систему, это тебе не объекты.
Старый 24.05.2011, 13:45
Hares
полупротосс
offline
Опыт: 6,966
Активность:
И всё равно не работает
Старый 31.05.2011, 15:13
Ответ

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

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

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

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



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