Как изменять скорость даммиков(сюрикены вокруг героя)?
        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
19
6 лет назад
0
Похожие вопросы:

ответ
Вот пример как это делать. Тут только общая логика, GUI.
ответ
koloff:
Объявляются переменные в начале.
local lightning l
call AddLightningEx(codeName, true, GetLocationX(where1), GetLocationY(where1), GetLocationZ(where1), GetLocationX(where2), GetLocationY(where2), GetLocationZ(where2))
set l = bj_lastCreatedLightning
ответ
способ 1
вешать структуру на таймер с помощью эксплойта (для тех кто не знает структура это число) а потом этим таймером вызывать нужную функцию спустя 0 секунд
плюсы:
простота
минусы:
требует добавлять иф на каждую новую функцию
второй способ
тоже самое что и 1 только на таймер вешается вдобавок название функции и таймер вызывает её экзекутом
вот моя библиотека по 2 способу и карта с примером
в библиотеке в самом верху есть небольшой док по 3 функциям
ответ
Чтобы не было анимация берите у медуза шит и выставить все на 0 вот и счастья через баф проверяете или что хотите!!

0
27
6 лет назад
Отредактирован MpW
0
добавь переменную-множитель R
R = 1.00 (изначально)
R = 2.00 (если ты хочешь изменить динамично в 2 раза скорость, изменяешь переменную R)
GetUnitX(hero)+ (rad*R)*Cos(a[i])
GetUnitY(hero)+ (rad*R)*Sin(a[i])
все изменения происходят относительно точки GetUnitX, GetUnitY
Или время задаешь с малой периодичностью и с нужными rad.
0
10
6 лет назад
0
Steal nerves:
добавь переменную-множитель R
R = 1.00 (изначально)
R = 2.00 (если ты хочешь изменить динамично в 2 раза скорость, изменяешь переменную R)
GetUnitX(hero)+ (rad*R)*Cos(a[i])
GetUnitY(hero)+ (rad*R)*Sin(a[i])
все изменения происходят относительно точки GetUnitX, GetUnitY
радиус увеличился, а мне надо без изменения радиуса
0
27
6 лет назад
0
noyl, тфу
Cos(a[i]*R)
Sin(a[i]*R)
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
21
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
Загруженные файлы
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.