• Listen to a special audio message from Bill Roper to the Hive Workshop community (Bill is a former Vice President of Blizzard Entertainment, Producer, Designer, Musician, Voice Actor) 🔗Click here to hear his message!
  • Read Evilhog's interview with Gregory Alper, the original composer of the music for WarCraft: Orcs & Humans 🔗Click here to read the full interview.

Move unit forward with changing it's angle

Status
Not open for further replies.
Level 7
Joined
Sep 16, 2008
Messages
47
Ok, i was trying to do it and i am close but it's not that i am trying t do.

At this moment missle is truning back and moving as i wanted but backward.

JASS:
scope Missle
    globals
        //Ability rawcode
        private constant integer        SPELL_CODE      = 'A003'
        //Dummy rawcode
        private constant integer        DUMMY_CODE      = 'h000'
        //Max ange increase/decrease
        private constant real           MAX_ANG         = 10
        //Angle increase ammout every cd
        private constant real           ANG_INC         = 5
        //Angle increase CD
        private constant real           ANG_CD          = 0.30
    endglobals
    
    globals
        private     real        array       M_Distance
        private     real        array       M_Speed
    endglobals
    
    private function Missle_Setup takes nothing returns nothing
       
        set M_Distance[1] = 900
        set M_Distance[2] = 900
        set M_Distance[3] = 900
        
        set M_Speed[1] = 600
        set M_Speed[2] = 600
        set M_Speed[3] = 600
       
    endfunction
    
    globals
        private constant real INTERVAL  = 0.031250
    endglobals
    
    private struct missle
    
        unit caster
        unit dummy
        real distance
        real speed
        real angle
        real angle2
        real ang_cd
        real ang_ccd
        player owner
    
        
        private static thistype tmpDat
        
        private static method Missle_Move takes nothing returns nothing
            local timer TIMER = GetExpiredTimer()
            local thistype dat = GetTimerData(TIMER)
            
            local real unitx
            local real unity
            
            local integer i = 0
            local boolean way
            
            set unitx = GetUnitX(dat.dummy) + dat.speed * Cos(dat.angle)
            set unity = GetUnitY(dat.dummy) + dat.speed * Sin(dat.angle)            
            
            if dat.ang_cd > dat.ang_ccd then
                set dat.ang_ccd = dat.ang_ccd + INTERVAL
            else
                if dat.angle > dat.angle2 + MAX_ANG then
                    set dat.angle = dat.angle - ANG_INC
                    call BJDebugMsg("1")
                else                    
                    set dat.angle = dat.angle + ANG_INC
                    call BJDebugMsg("2")
                endif
                set dat.ang_ccd = dat.ang_ccd - dat.ang_cd
            endif
            
            call SetUnitPosition(dat.dummy, unitx, unity)
            
            if dat.distance <= 0 then
                call RemoveUnit(dat.dummy)
                set dat.dummy = null
                set dat.caster = null
                call ReleaseTimer(TIMER)
                call dat.destroy()
            endif
            
            set TIMER = null
        endmethod
    
        private static method Missle_Run takes nothing returns nothing
            local thistype dat
            local timer TIMER = NewTimer()
            
            local integer level
            
            local real casterx
            local real castery
            
            local real targetx
            local real targety
            
            set dat = thistype.allocate()
            
            set dat.caster = GetTriggerUnit()
            set dat.owner = GetOwningPlayer(dat.caster)
            set level = GetUnitAbilityLevel(dat.caster, SPELL_CODE)
            
            set casterx = GetUnitX(dat.caster)
            set castery = GetUnitY(dat.caster)
            
            set targetx = GetSpellTargetX()
            set targety = GetSpellTargetY()
            
            set dat.distance = M_Distance[level]
            set dat.speed = M_Speed[level] * INTERVAL
            
            set dat.angle = Atan2(targety - castery, targetx - casterx)
            set dat.angle2 = dat.angle
            
            set dat.ang_cd = ANG_CD
            set dat.ang_ccd = ANG_CD
            
            set dat.dummy = CreateUnit(dat.owner, DUMMY_CODE, casterx, castery, GetUnitFacing(dat.caster) + dat.angle)
            
            call SetTimerData(TIMER, dat)
            
            call TimerStart(TIMER, INTERVAL, true, function thistype.Missle_Move)
            
            set TIMER = null
        endmethod
    
    
        private static method onInit takes nothing returns nothing
            call RegisterSpellEffectEvent(SPELL_CODE,function thistype.Missle_Run)
            
            call Missle_Setup()
        endmethod
    endstruct
endscope
 
Level 19
Joined
Aug 8, 2007
Messages
2,765
JASS:
set adjustedAngle = angle + Sin(TimerGetElapsed(t) * FREQUENCY) * WAVELENGTH
call SetUnitX(GetUnitX() + speed * Cos(adjustedAngle))
call SetUnitY(GetUnitY() + speed * Sin(adjustedAngle))
 
Level 7
Joined
Sep 16, 2008
Messages
47
With your help i made it to move left or move right every some time and it works as i wanted:) big thanks


JASS:
if dat.ang_cd > dat.ang_ccd then
                set adjustedAngle = dat.angle + Sin(TimerGetElapsed(TIMER) * 2.0) * 10.0
                call BJDebugMsg("first")
                set dat.ang_ccd = dat.ang_ccd + INTERVAL
            else
                if dat.ang_cd2 > dat.ang_ccd2 then
                    set adjustedAngle = dat.angle + Sin(TimerGetElapsed(TIMER) * 2.0) * - 10.0
                    call BJDebugMsg("second")
                    set dat.ang_ccd2 = dat.ang_ccd2 + INTERVAL
                else
                    set dat.ang_ccd = dat.ang_ccd - dat.ang_cd
                    set dat.ang_ccd2 = dat.ang_ccd2 - dat.ang_cd2
                endif
            endif
 
Status
Not open for further replies.
Top