Как изменять скорость даммиков(сюрикены вокруг героя)?
        set a[0] = Atan2(GetUnitY(dummy[0])-GetUnitY(dummy[1]),GetUnitX(dummy[0])-GetUnitX(dummy[1]))
        set a[1] = Atan2(GetUnitY(dummy[1])-GetUnitY(dummy[2]),GetUnitX(dummy[1])-GetUnitX(dummy[2]))
        set a[2] = Atan2(GetUnitY(dummy[2])-GetUnitY(dummy[0]),GetUnitX(dummy[2])-GetUnitX(dummy[0]))
        loop
        exitwhen i >= 3
            call SetUnitX(dummy[i],GetUnitX(hero)+rad*Cos(a[i]))
            call SetUnitY(dummy[i],GetUnitY(hero)+rad*Sin(a[i]))
        set i = i + 1
        endloop

Принятый ответ

держи
код
function Trig_P takes nothing returns nothing

    local integer i = 0
    local real f
    
    local real h = 360/udg_speed //кол-во вращении или промежутков
    local real v = 1/h //частота (короче общее время)
    set udg_speed = 360 * v * udg_C //угловая скорость
    
    //у нас могут изменяться 3 коэффициента: скорость, время, и коэффициент-множитель. К сожалению, время не смог вставить, т.к. нужно тогда изменять время таймера.
    
    set udg_A = ModuloReal(udg_A + udg_speed, 360) //угол вращения круга.
    
    if (GetLocalPlayer()==Player(0)) then
        // Use only local code (no net traffic) within this block to avoid desyncs.
        call ClearTextMessages()
    endif
    call BJDebugMsg("угол вращения круга: " + R2S(udg_A))
    call BJDebugMsg("угловая скорость speed: " + R2S(udg_speed) )
    call BJDebugMsg("условное время t: " + R2S(v) + "; время таймера T: " + R2S(udg_T))
    call BJDebugMsg("множитель speed: " + R2S(udg_C))
    

    loop
        exitwhen i >= udg_K
            
            set f = udg_A + udg_B*i
            
            call SetUnitX(udg_U[i],GetUnitX(udg_Hero)+  400*CosBJ(f))
            call SetUnitY(udg_U[i],GetUnitY(udg_Hero)+  400*SinBJ(f))
        set i = i + 1
    endloop

    
endfunction

function Trig_Init_Actions takes nothing returns nothing
    
    set udg_R = 400 //радиус
    set udg_A = 30.00 //запоминалка. текущий угол круга. когда круг вращается, изменяется только этот угол. при создании даймиков запоминаем угол
    set udg_speed = 15.00 //назовем это угловой скоростью. каждый тик таймера прибавляем 15 градусов. короче круг вместе с юнитами поворачивается на 15 град каждый тик
    
    set udg_C = 1.00 //это множитель ускорения (100%). будет домножать на скорость
    
    set udg_K = 3 //кол-во юнитов
    set udg_B = ( 360.00 / udg_K ) //угловое расстояние между юнитами
    set udg_TIMER = CreateTimer() //таймер
    set udg_T = 0.03 //время таймера
    set udg_Hero = gg_unit_Hpal_0000
    
    set udg_U[0] = CreateUnit(Player(0),'hpea',GetUnitX(udg_Hero),GetUnitY(udg_Hero), 0)
    set udg_U[1] = CreateUnit(Player(0),'hpea',GetUnitX(udg_Hero),GetUnitY(udg_Hero), 0)
    set udg_U[2] = CreateUnit(Player(0),'hpea',GetUnitX(udg_Hero),GetUnitY(udg_Hero), 0)
    
    call SetUnitX(udg_U[0],GetUnitX(udg_Hero)+udg_R*Cos(30*bj_DEGTORAD))
    call SetUnitY(udg_U[0],GetUnitY(udg_Hero)+udg_R*Sin(30*bj_DEGTORAD))
    
    call SetUnitX(udg_U[1],GetUnitX(udg_Hero)+udg_R*Cos(150*bj_DEGTORAD))
    call SetUnitY(udg_U[1],GetUnitY(udg_Hero)+udg_R*Sin(150*bj_DEGTORAD))
    
    call SetUnitX(udg_U[2],GetUnitX(udg_Hero)+udg_R*Cos(270*bj_DEGTORAD))
    call SetUnitY(udg_U[2],GetUnitY(udg_Hero)+udg_R*Sin(270*bj_DEGTORAD))
    
    call TimerStart(udg_TIMER, udg_T, true, function Trig_P)
    
endfunction

//===========================================================================
function InitTrig_Init takes nothing returns nothing
    set gg_trg_Init = CreateTrigger(  )
    call TriggerAddAction( gg_trg_Init, function Trig_Init_Actions )
endfunction
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
10
6 лет назад
0
Steal nerves:
noyl, тфу
Cos(a[i]*R)
Sin(a[i]*R)
Блин, не могу понять. Значит R=0.1. Они вообще на месте стоят, в плане без движения по кругу.
Такая проблема, что они слишком быстро двигаются, меня это не устраивает.
0
27
6 лет назад
0
noyl, щас попробую сам потыкать
0
10
6 лет назад
0
Может кто-то просто опишет, как я могу вращать дамми юнитов вокруг своего героя с определенной скоростью и радиусом.
2
20
6 лет назад
Отредактирован biridius
2
сохраняешь на героя переменную, в которой считаешь угол поворота
каждые 0.03 увеличиваешь эту переменную на скорость поворота в градусах * 0.03, и перемещаешь юнита в
x = x героя + cos угла * радиус
y = y героя + sin угла * радиус
для больше одного даммика еще нужно добавлять к углу 360 градусов * номер даммика / число даммиков
0
10
6 лет назад
Отредактирован noyl
0
biridius:
сохраняешь на героя переменную, в которой считаешь угол поворота
каждые 0.03 увеличиваешь эту переменную на скорость поворота в градусах * 0.03, и перемещаешь юнита в
x = x героя + cos угла * радиус
y = y героя + sin угла * радиус
для больше одного даммика еще нужно добавлять к углу 360 градусов * номер даммика / число даммиков
Снова туплю, не понимаю как угол поворота посчитать
Cos и Sin чего?
1
21
6 лет назад
1
noyl, косинус и синус суммы текущего угла и угловой скорости.
3
27
6 лет назад
Отредактирован MpW
3
держи
код
function Trig_P takes nothing returns nothing

    local integer i = 0
    local real f
    
    local real h = 360/udg_speed //кол-во вращении или промежутков
    local real v = 1/h //частота (короче общее время)
    set udg_speed = 360 * v * udg_C //угловая скорость
    
    //у нас могут изменяться 3 коэффициента: скорость, время, и коэффициент-множитель. К сожалению, время не смог вставить, т.к. нужно тогда изменять время таймера.
    
    set udg_A = ModuloReal(udg_A + udg_speed, 360) //угол вращения круга.
    
    if (GetLocalPlayer()==Player(0)) then
        // Use only local code (no net traffic) within this block to avoid desyncs.
        call ClearTextMessages()
    endif
    call BJDebugMsg("угол вращения круга: " + R2S(udg_A))
    call BJDebugMsg("угловая скорость speed: " + R2S(udg_speed) )
    call BJDebugMsg("условное время t: " + R2S(v) + "; время таймера T: " + R2S(udg_T))
    call BJDebugMsg("множитель speed: " + R2S(udg_C))
    

    loop
        exitwhen i >= udg_K
            
            set f = udg_A + udg_B*i
            
            call SetUnitX(udg_U[i],GetUnitX(udg_Hero)+  400*CosBJ(f))
            call SetUnitY(udg_U[i],GetUnitY(udg_Hero)+  400*SinBJ(f))
        set i = i + 1
    endloop

    
endfunction

function Trig_Init_Actions takes nothing returns nothing
    
    set udg_R = 400 //радиус
    set udg_A = 30.00 //запоминалка. текущий угол круга. когда круг вращается, изменяется только этот угол. при создании даймиков запоминаем угол
    set udg_speed = 15.00 //назовем это угловой скоростью. каждый тик таймера прибавляем 15 градусов. короче круг вместе с юнитами поворачивается на 15 град каждый тик
    
    set udg_C = 1.00 //это множитель ускорения (100%). будет домножать на скорость
    
    set udg_K = 3 //кол-во юнитов
    set udg_B = ( 360.00 / udg_K ) //угловое расстояние между юнитами
    set udg_TIMER = CreateTimer() //таймер
    set udg_T = 0.03 //время таймера
    set udg_Hero = gg_unit_Hpal_0000
    
    set udg_U[0] = CreateUnit(Player(0),'hpea',GetUnitX(udg_Hero),GetUnitY(udg_Hero), 0)
    set udg_U[1] = CreateUnit(Player(0),'hpea',GetUnitX(udg_Hero),GetUnitY(udg_Hero), 0)
    set udg_U[2] = CreateUnit(Player(0),'hpea',GetUnitX(udg_Hero),GetUnitY(udg_Hero), 0)
    
    call SetUnitX(udg_U[0],GetUnitX(udg_Hero)+udg_R*Cos(30*bj_DEGTORAD))
    call SetUnitY(udg_U[0],GetUnitY(udg_Hero)+udg_R*Sin(30*bj_DEGTORAD))
    
    call SetUnitX(udg_U[1],GetUnitX(udg_Hero)+udg_R*Cos(150*bj_DEGTORAD))
    call SetUnitY(udg_U[1],GetUnitY(udg_Hero)+udg_R*Sin(150*bj_DEGTORAD))
    
    call SetUnitX(udg_U[2],GetUnitX(udg_Hero)+udg_R*Cos(270*bj_DEGTORAD))
    call SetUnitY(udg_U[2],GetUnitY(udg_Hero)+udg_R*Sin(270*bj_DEGTORAD))
    
    call TimerStart(udg_TIMER, udg_T, true, function Trig_P)
    
endfunction

//===========================================================================
function InitTrig_Init takes nothing returns nothing
    set gg_trg_Init = CreateTrigger(  )
    call TriggerAddAction( gg_trg_Init, function Trig_Init_Actions )
endfunction
Загруженные файлы
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.