короче проблема такая пришло в голову мысль создать такой спелл герой создает в указанной точке 5 огненных шаров которые создают круговорот после того как они соединились происходит взрыв начал делать спелл но не тут то было я никогда не двигал больше одного даммика и я хз как это сотворить, помогите пожалуйста

Я так понимаю то что я расписывал выше не помогло, поэтому закидываю карту с примером
раскрыть
library mylib
globals
    constant hashtable H = InitHashtable()
    private constant group TempG = CreateGroup()
    private real TempX
    private real TempY
    private real TempReal
    private real TempReal1
    private real TempReal2
    
    private real MaxX
    private real MinX
    private real MaxY
    private real MinY
endglobals

private struct mys
    unit caster
    group g
    real x
    real y
    real dist
    real speed
    real speedr
    real angle
    integer count
endstruct

private function SetUnitPositionEx takes unit u, real x, real y returns nothing
    if x > MaxX then
        set x = MaxX
    elseif x < MinX then
        set x = MinX
    endif
    if y > MaxY then
        set y = MaxY
    elseif y < MinY then
        set y = MinY
    endif
    
    call SetUnitX(u,x)
    call SetUnitY(u,y)
endfunction

private function move1 takes nothing returns nothing
    call SetUnitPositionEx(GetEnumUnit(),TempX+TempReal2*Cos(TempReal*bj_DEGTORAD),TempY+TempReal2*Sin(TempReal*bj_DEGTORAD))
    set TempReal = TempReal+TempReal1
endfunction

private function move takes nothing returns nothing
    local mys A = LoadInteger(H,GetHandleId(GetExpiredTimer()),0)
    local unit u
    set A.angle = A.angle+A.speedr
    set A.dist = A.dist-A.speed
    set TempX = A.x
    set TempY = A.y
    set TempReal = A.angle
    set TempReal1 = 360/A.count
    set TempReal2 = A.dist
    call ForGroup(A.g,function move1)
    
    if A.dist <= 50. then
        loop
            set u = FirstOfGroup(A.g)
            exitwhen u == null
            call KillUnit(u)
            call GroupRemoveUnit(A.g,u)
        endloop
        call DestroyGroup(A.g)
        call FlushChildHashtable(H,GetHandleId(GetExpiredTimer()))
        call PauseTimer(GetExpiredTimer())
        call DestroyTimer(GetExpiredTimer())
        set A.caster = null
        set A.g = null
        call A.destroy()
    endif
endfunction

private function Spell_Actions takes nothing returns nothing
    local timer t = CreateTimer()
    local mys A = mys.create()
    local real a
    local real x
    local real y
    set A.caster = GetTriggerUnit()
    set A.g = CreateGroup()
    set A.x = GetSpellTargetX()
    set A.y = GetSpellTargetY()
    set A.dist = 500.
    set A.speed = 10.
    set A.speedr = 3.
    set A.angle = GetRandomReal(0,360)
    set A.count = 6
    
    set bj_forLoopAIndex = 0
    set a = A.angle
    set bj_groupEnumOwningPlayer = GetOwningPlayer(A.caster)
    loop
        exitwhen bj_forLoopAIndex == A.count
        set x = A.x+A.dist*Cos(a*bj_DEGTORAD)
        set y = A.y+A.dist*Sin(a*bj_DEGTORAD)
        set bj_lastCreatedUnit = CreateUnit(bj_groupEnumOwningPlayer,'u000',x,y,a)
        call UnitAddAbility(bj_lastCreatedUnit,'Arav')
        call SetUnitFlyHeight(bj_lastCreatedUnit,50,0)
        call SetUnitScale(bj_lastCreatedUnit,.5,.5,.5)
        call SetUnitPathing(bj_lastCreatedUnit,false)
        call GroupAddUnit(A.g,bj_lastCreatedUnit)
        set a = a+360/A.count
        set bj_forLoopAIndex = bj_forLoopAIndex+1
    endloop
    set bj_groupEnumOwningPlayer = null
    set bj_lastCreatedUnit = null
    
    call SaveInteger(H,GetHandleId(t),0,A)
    call TimerStart(t,.03125,true,function move)
    set t = null
endfunction

//===========================================================================
private function mycond takes nothing returns boolean
    if GetSpellAbilityId() == 'A000' then
        call Spell_Actions()
    endif
    return false
endfunction
function InitTrig_Spell takes nothing returns nothing
    local rect r = GetWorldBounds()
    set gg_trg_Spell = CreateTrigger(  )
    call TriggerRegisterPlayerUnitEvent(gg_trg_Spell, Player(0x00), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    call TriggerAddCondition( gg_trg_Spell, Condition(function mycond) )
    set MaxX = GetRectMaxX(r)
    set MinX = GetRectMinX(r)
    set MaxY = GetRectMaxY(r)
    set MinY = GetRectMinY(r)
    call RemoveRect(r)
    set r = null
endfunction
endlibrary

Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
28
в чём проблема занести их всех в группу и двигать так же, как и того единственного дамми что ты двигал? на крайний, самый тупой случай, делать на каждого дамми по таймеру .-.

то что ты хочешь делается за 10 минут, а основная формула это angle+(360/count) count - число шаров, а angle - угол между центром и даммиками, после движения всех шаров, к этому углу добавить реальную в зависимости от скорости вращения
32
rsfghd, ну или структуры vjass чтобы двигать юнтитов в цикле, я как раз помнится делал такие спеллы и даже выкладывал.

14
rsfghd:
в чём проблема занести их всех в группу и двигать так же, как и того единственного дамми что ты двигал? на крайний, самый тупой случай, делать на каждого дамми по таймеру .-.

то что ты хочешь делается за 10 минут, а основная формула это angle+(360/count) count - число шаров, а angle - угол между центром и даммиками, после движения всех шаров, к этому углу добавить реальную в зависимости от скорости вращения
друг в чем проблема? от куда такая агрессия? я что то не так сделал?

если что то не устраивает скажи прямо нефиг ковырять мои поступки по разным местам
замечание от ScorpioT1000: 4.1.1 (бессмысленное сообщение)
28
Гуванч, я не говорю что меня что-то не устраивает, и судя по началу это ты проявил агрессию, я же сказал, что если ты умеешь двигать одного юнита, то в чём проблема двигать группу?

если моя "агрессия" проявляется в том, что я назвал делать на каждого юнита таймер для вращения вокруг точки глупым, то это и вправду глупо, когда тут можно обойтись лишь одним таймером, в другом я не вижу проявлений агрессии чтобы клеветать за это
14
я не умею вращать эту группу чтоб плавно двигались к центру у меня не хватает знаний
38
Тема потихоньку скатывается в срач, который не нужен)
28
Гуванч, выносишь все нужные переменные, а именно угол, дистанция и кол-во юнитов в группе - в глобалки, потом через ForGroup двигаешь юнитов, меняя глобальную переменную угла под формулой что я описал выше, после ForGroup плюсуешь к углу нужную реальную, которая влияет на скорость вращения

ну и дистанцию понижаешь после ForGroup, если они в центре должны взорваться, на следующий тик достаёшь все изменённые значения и повторяешь все те же действия, пока все шары не столкнутся в центре
28
Я так понимаю то что я расписывал выше не помогло, поэтому закидываю карту с примером
раскрыть
library mylib
globals
    constant hashtable H = InitHashtable()
    private constant group TempG = CreateGroup()
    private real TempX
    private real TempY
    private real TempReal
    private real TempReal1
    private real TempReal2
    
    private real MaxX
    private real MinX
    private real MaxY
    private real MinY
endglobals

private struct mys
    unit caster
    group g
    real x
    real y
    real dist
    real speed
    real speedr
    real angle
    integer count
endstruct

private function SetUnitPositionEx takes unit u, real x, real y returns nothing
    if x > MaxX then
        set x = MaxX
    elseif x < MinX then
        set x = MinX
    endif
    if y > MaxY then
        set y = MaxY
    elseif y < MinY then
        set y = MinY
    endif
    
    call SetUnitX(u,x)
    call SetUnitY(u,y)
endfunction

private function move1 takes nothing returns nothing
    call SetUnitPositionEx(GetEnumUnit(),TempX+TempReal2*Cos(TempReal*bj_DEGTORAD),TempY+TempReal2*Sin(TempReal*bj_DEGTORAD))
    set TempReal = TempReal+TempReal1
endfunction

private function move takes nothing returns nothing
    local mys A = LoadInteger(H,GetHandleId(GetExpiredTimer()),0)
    local unit u
    set A.angle = A.angle+A.speedr
    set A.dist = A.dist-A.speed
    set TempX = A.x
    set TempY = A.y
    set TempReal = A.angle
    set TempReal1 = 360/A.count
    set TempReal2 = A.dist
    call ForGroup(A.g,function move1)
    
    if A.dist <= 50. then
        loop
            set u = FirstOfGroup(A.g)
            exitwhen u == null
            call KillUnit(u)
            call GroupRemoveUnit(A.g,u)
        endloop
        call DestroyGroup(A.g)
        call FlushChildHashtable(H,GetHandleId(GetExpiredTimer()))
        call PauseTimer(GetExpiredTimer())
        call DestroyTimer(GetExpiredTimer())
        set A.caster = null
        set A.g = null
        call A.destroy()
    endif
endfunction

private function Spell_Actions takes nothing returns nothing
    local timer t = CreateTimer()
    local mys A = mys.create()
    local real a
    local real x
    local real y
    set A.caster = GetTriggerUnit()
    set A.g = CreateGroup()
    set A.x = GetSpellTargetX()
    set A.y = GetSpellTargetY()
    set A.dist = 500.
    set A.speed = 10.
    set A.speedr = 3.
    set A.angle = GetRandomReal(0,360)
    set A.count = 6
    
    set bj_forLoopAIndex = 0
    set a = A.angle
    set bj_groupEnumOwningPlayer = GetOwningPlayer(A.caster)
    loop
        exitwhen bj_forLoopAIndex == A.count
        set x = A.x+A.dist*Cos(a*bj_DEGTORAD)
        set y = A.y+A.dist*Sin(a*bj_DEGTORAD)
        set bj_lastCreatedUnit = CreateUnit(bj_groupEnumOwningPlayer,'u000',x,y,a)
        call UnitAddAbility(bj_lastCreatedUnit,'Arav')
        call SetUnitFlyHeight(bj_lastCreatedUnit,50,0)
        call SetUnitScale(bj_lastCreatedUnit,.5,.5,.5)
        call SetUnitPathing(bj_lastCreatedUnit,false)
        call GroupAddUnit(A.g,bj_lastCreatedUnit)
        set a = a+360/A.count
        set bj_forLoopAIndex = bj_forLoopAIndex+1
    endloop
    set bj_groupEnumOwningPlayer = null
    set bj_lastCreatedUnit = null
    
    call SaveInteger(H,GetHandleId(t),0,A)
    call TimerStart(t,.03125,true,function move)
    set t = null
endfunction

//===========================================================================
private function mycond takes nothing returns boolean
    if GetSpellAbilityId() == 'A000' then
        call Spell_Actions()
    endif
    return false
endfunction
function InitTrig_Spell takes nothing returns nothing
    local rect r = GetWorldBounds()
    set gg_trg_Spell = CreateTrigger(  )
    call TriggerRegisterPlayerUnitEvent(gg_trg_Spell, Player(0x00), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    call TriggerAddCondition( gg_trg_Spell, Condition(function mycond) )
    set MaxX = GetRectMaxX(r)
    set MinX = GetRectMinX(r)
    set MaxY = GetRectMaxY(r)
    set MinY = GetRectMinY(r)
    call RemoveRect(r)
    set r = null
endfunction
endlibrary

Загруженные файлы
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.