• 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.

[vJASS] Camera System...

Status
Not open for further replies.
Guys Im posting this for testing purposes and hopefully to get some feedbacks...

Im making a camera system for my map that can rotate left/right/zoom in/out...

Any suggestions please provide, thanks...

JASS:
library MyCam initializer init

globals
    private constant hashtable                 HASH = InitHashtable()
    private constant integer             MAXPLAYERS = 3 //starting with "0" coz Player 1 is Player(0)
    private constant real        CAMERA_ANGLE_SPEED = 2.0
    private constant real        ZOOM_ADJUST_OFFSET = 20.
    private constant real                     DELAY = 0.03
    private constant boolean          ENABLE_LAUNCH = true //set to false to set arrow keys manually via GUI or another code
    private constant boolean       ENABLE_UNIT_LOCK = true //recommended setting
    private constant boolean            ENABLE_LOCK = true //enables lock Zoom and Angle
    private real                       CAMERA_ANGLE
    private real                               ZOOM
    private unit array                     DUMMYCAM
    private integer array                     DUMID
    private timer array                    CAMTIMER
endglobals

//===CAMERA MOVEMENTS: DO NOT TOUCH THIS
private function CamOn takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer tID = GetHandleId(t)
    local player p = LoadPlayerHandle(HASH, tID, 1)
    local integer ID = GetPlayerId(p)    
    if GetLocalPlayer()==Player(ID) and LoadBoolean(HASH, DUMID[ID], 3)==true then
        
        if LoadStr(HASH, tID, 2)=="up" then
            set ZOOM = LoadReal(HASH, DUMID[ID], 1)
            call SaveReal(HASH, DUMID[ID], 1, ZOOM - ZOOM_ADJUST_OFFSET)      
            set ZOOM = LoadReal(HASH, DUMID[ID], 1)
            call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, ZOOM, 0.03) 
            
        elseif LoadStr(HASH, tID, 2)=="down" then
            set ZOOM = LoadReal(HASH, DUMID[ID], 1)
            call SaveReal(HASH, DUMID[ID], 1, ZOOM + ZOOM_ADJUST_OFFSET)      
            set ZOOM = LoadReal(HASH, DUMID[ID], 1)
            call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, ZOOM, 0.03) 
        
        elseif LoadStr(HASH, tID, 2)=="left" then
            set CAMERA_ANGLE = LoadReal(HASH, DUMID[ID], 2)
            call SaveReal(HASH, DUMID[ID], 2, CAMERA_ANGLE - CAMERA_ANGLE_SPEED)      
            set CAMERA_ANGLE = LoadReal(HASH, DUMID[ID], 2)
            call SetCameraField(CAMERA_FIELD_ROTATION, CAMERA_ANGLE, 0.03)
            
        elseif LoadStr(HASH, tID, 2)=="right" then
            set CAMERA_ANGLE = LoadReal(HASH, DUMID[ID], 2)
            call SaveReal(HASH, DUMID[ID], 2, CAMERA_ANGLE + CAMERA_ANGLE_SPEED)      
            set CAMERA_ANGLE = LoadReal(HASH, DUMID[ID], 2)
            call SetCameraField(CAMERA_FIELD_ROTATION, CAMERA_ANGLE, 0.03)
        endif
    else
        call SaveBoolean(HASH, DUMID[ID], 4, true)
        call PauseTimer(CAMTIMER[ID])    
    endif
    set t = null
endfunction

function CamOff takes nothing returns boolean
    local integer i = 0 
    loop
        if GetTriggerPlayer()==Player(i) then
            call SaveBoolean(HASH, DUMID[i], 3, false)
        endif
        set i = i+1
        exitwhen i > MAXPLAYERS
    endloop
    return false
endfunction

private function LockUnit takes nothing returns boolean
    local integer i = 0 
    loop
        if GetLocalPlayer()==Player(i) then
            call SetCameraTargetController(GetTriggerUnit(), 0, 0, true)
            call SaveUnitHandle(HASH, DUMID[i], 4, GetTriggerUnit())
        endif
        set i = i+1
        exitwhen i > MAXPLAYERS
    endloop
    return false
endfunction

//============================================================
//===CAMERA LEFT:
function CamLEFT_Cond takes nothing returns boolean
    local integer i = GetPlayerId(GetTriggerPlayer())
    call SaveBoolean(HASH, DUMID[i], 3, true)
    call SaveBoolean(HASH, DUMID[i], 4, false)
    call SavePlayerHandle(HASH, GetHandleId(CAMTIMER[i]), 1, Player(i)) 
    call SaveStr(HASH, GetHandleId(CAMTIMER[i]), 2, "left")
    call TimerStart(CAMTIMER[i], DELAY, true, function CamOn) 
    return false
endfunction
//============================================================
//===CAMERA RIGHT:
function CamRIGHT_Cond takes nothing returns boolean
    local integer i = GetPlayerId(GetTriggerPlayer())
    call SaveBoolean(HASH, DUMID[i], 3, true)
    call SaveBoolean(HASH, DUMID[i], 4, false)
    call SavePlayerHandle(HASH, GetHandleId(CAMTIMER[i]), 1, Player(i)) 
    call SaveStr(HASH, GetHandleId(CAMTIMER[i]), 2, "right")
    call TimerStart(CAMTIMER[i], DELAY, true, function CamOn) 
    return false
endfunction
//============================================================
//===CAMERA UP:
function CamUP_Cond takes nothing returns boolean
    local integer i = GetPlayerId(GetTriggerPlayer())
    call SaveBoolean(HASH, DUMID[i], 3, true)
    call SaveBoolean(HASH, DUMID[i], 4, false)
    call SavePlayerHandle(HASH, GetHandleId(CAMTIMER[i]), 1, Player(i)) 
    call SaveStr(HASH, GetHandleId(CAMTIMER[i]), 2, "up")
    call TimerStart(CAMTIMER[i], DELAY, true, function CamOn) 
    return false
endfunction
//============================================================
//===CAMERA DOWN:
function CamDOWN_Cond takes nothing returns boolean
    local integer i = GetPlayerId(GetTriggerPlayer())
    call SaveBoolean(HASH, DUMID[i], 3, true)
    call SaveBoolean(HASH, DUMID[i], 4, false)
    call SavePlayerHandle(HASH, GetHandleId(CAMTIMER[i]), 1, Player(i)) 
    call SaveStr(HASH, GetHandleId(CAMTIMER[i]), 2, "down")
    call TimerStart(CAMTIMER[i], DELAY, true, function CamOn) 
    return false
endfunction
//============================================================
//============================================================
//============================================================
private function LockDownAll takes nothing returns boolean
    local integer i = 0
    loop
        if GetLocalPlayer()==Player(i) and LoadBoolean(HASH, DUMID[i], 4)==true then
            set ZOOM = LoadReal(HASH, DUMID[i], 1)
            set CAMERA_ANGLE = LoadReal(HASH, DUMID[i], 2)
            call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, ZOOM, 0.03) 
            call SetCameraField(CAMERA_FIELD_ROTATION, CAMERA_ANGLE, 0.03)        
        endif
        set i = i+1
        exitwhen i > MAXPLAYERS
        endloop
    return false
endfunction

//============================================================
private function Launch takes nothing returns nothing
    local trigger t1 = CreateTrigger()//UP         
    local trigger t2 = CreateTrigger()//DOWN
    local trigger t3 = CreateTrigger()//LEFT
    local trigger t4 = CreateTrigger()//RIGHT
    local trigger t5 = CreateTrigger()//CamOff
    local integer i
    
    call TriggerAddCondition(t1, Condition(function CamUP_Cond))
    call TriggerAddCondition(t2, Condition(function CamDOWN_Cond))
    call TriggerAddCondition(t3, Condition(function CamLEFT_Cond))
    call TriggerAddCondition(t4, Condition(function CamRIGHT_Cond))
    call TriggerAddCondition(t5, Condition(function CamOff))
    
    //==PRESSING UP:
    set i = 0
    loop
        call TriggerRegisterPlayerEvent(t1, Player(i), EVENT_PLAYER_ARROW_UP_DOWN)
        set i = i+1
        exitwhen i > MAXPLAYERS
    endloop
    
    //==PRESSING DOWN:
    set i = 0
    loop
        call TriggerRegisterPlayerEvent(t2, Player(i), EVENT_PLAYER_ARROW_DOWN_DOWN)
        set i = i+1
        exitwhen i > MAXPLAYERS
    endloop
    
     //==PRESSING LEFT:
    set i = 0
    loop
        call TriggerRegisterPlayerEvent(t3, Player(i), EVENT_PLAYER_ARROW_LEFT_DOWN)
        set i = i+1
        exitwhen i > MAXPLAYERS
    endloop
    
     //==PRESSING RIGHT:
    set i = 0
    loop
        call TriggerRegisterPlayerEvent(t4, Player(i), EVENT_PLAYER_ARROW_RIGHT_DOWN)
        set i = i+1
        exitwhen i > MAXPLAYERS
    endloop
    
    //==CAMERA OFF:
    set i = 0
    loop
        call TriggerRegisterPlayerEvent(t5, Player(i), EVENT_PLAYER_ARROW_LEFT_UP)
        call TriggerRegisterPlayerEvent(t5, Player(i), EVENT_PLAYER_ARROW_RIGHT_UP)
        call TriggerRegisterPlayerEvent(t5, Player(i), EVENT_PLAYER_ARROW_UP_UP)
        call TriggerRegisterPlayerEvent(t5, Player(i), EVENT_PLAYER_ARROW_DOWN_UP)
        set i = i+1
        exitwhen i > MAXPLAYERS
    endloop
    
    set t1 = null
    set t2 = null
    set t3 = null
    set t4 = null    
    set t5 = null 
endfunction

private function init takes nothing returns nothing
    local trigger t1 = CreateTrigger()
    local trigger t2 = CreateTrigger()
    local integer i = 0
    loop
        set DUMMYCAM[i] = CreateUnit(Player(i), 'hpea', 0,0,0)
        set DUMID[i] = GetHandleId(DUMMYCAM[i])
        call UnitAddAbility(DUMMYCAM[i], 'Amrf')
        call UnitAddAbility(DUMMYCAM[i], 'Aloc')
        call SetUnitPathing(DUMMYCAM[i], false)
        call ShowUnit(DUMMYCAM[i], false)
        call SaveReal(HASH, DUMID[i], 1, 2000.) //Distance
        call SaveReal(HASH, DUMID[i], 2, 90.) //Angle        
        call SaveBoolean(HASH, DUMID[i], 3, false) //Checking
        call SaveBoolean(HASH, DUMID[i], 4, true) //Checking Lock
        set CAMTIMER[i] = CreateTimer()
        set i = i+1
        exitwhen i > MAXPLAYERS
    endloop
    
    //===UNIT LOCK:
    if ENABLE_UNIT_LOCK==true then
        set i = 0
        loop
            call TriggerRegisterPlayerUnitEvent(t1, Player(i), EVENT_PLAYER_UNIT_SELECTED, null)   
            set i = i+1
            exitwhen i > MAXPLAYERS
        endloop 
        call TriggerAddCondition(t1, Condition(function LockUnit))
    endif
    
    //===LAUNCH TRIGGER:
    if ENABLE_LAUNCH==true then
        call Launch() 
    endif
    
    //LOCK ZOOM and ANGLE:
    if ENABLE_LOCK==true then
        call TriggerRegisterTimerEvent(t2, 0.03, true)
        call TriggerAddCondition(t2, Condition(function LockDownAll))        
    endif
    
    set t1 = null
    set t2 = null
endfunction

endlibrary
 
Last edited:
Status
Not open for further replies.
Top