Lightstalker
New Member
- Reaction score
- 55
So once upon a time, in 20 minutes, I made this gigantic multi-trigger that moves a unit based on arrow keys pressed.
I then decided to optimize it (and by that I mean cut it up into different triggers), but it would not work correctly anymore:
For some reason, the unit will move left, and then stop and attempt to move in every direction at once.
JASS:
scope Movement initializer Init
private function Actions takes nothing returns nothing
local real angle = 0.0
local real x = 0.0
local real y = 0.0
local integer i = 0
loop
if LEFTBOOLEAN<i> and UPBOOLEAN<i> == true then
set angle = 135.0
set x = GetUnitX(FIGHTER<i>) + 1024 * Cos(angle * bj_DEGTORAD)
set y = GetUnitY(FIGHTER<i>) + 1024 * Sin(angle * bj_DEGTORAD)
call IssuePointOrder(FIGHTER<i>, "move", x, y)
elseif LEFTBOOLEAN<i> and DOWNBOOLEAN<i> == true then
set angle = 235.0
set x = GetUnitX(FIGHTER<i>) + 1024 * Cos(angle * bj_DEGTORAD)
set y = GetUnitY(FIGHTER<i>) + 1024 * Sin(angle * bj_DEGTORAD)
call IssuePointOrder(FIGHTER<i>, "move", x, y)
elseif RIGHTBOOLEAN<i> and UPBOOLEAN<i> == true then
set angle = 45.0
set x = GetUnitX(FIGHTER<i>) + 1024 * Cos(angle * bj_DEGTORAD)
set y = GetUnitY(FIGHTER<i>) + 1024 * Sin(angle * bj_DEGTORAD)
call IssuePointOrder(FIGHTER<i>, "move", x, y)
elseif RIGHTBOOLEAN<i> and DOWNBOOLEAN<i> == true then
set angle = 315.0
set x = GetUnitX(FIGHTER<i>) + 1024 * Cos(angle * bj_DEGTORAD)
set y = GetUnitY(FIGHTER<i>) + 1024 * Sin(angle * bj_DEGTORAD)
call IssuePointOrder(FIGHTER<i>, "move", x, y)
elseif LEFTBOOLEAN<i> == true then
set angle = 180.0
set x = GetUnitX(FIGHTER<i>) + 1024 * Cos(angle * bj_DEGTORAD)
set y = GetUnitY(FIGHTER<i>) + 1024 * Sin(angle * bj_DEGTORAD)
call IssuePointOrder(FIGHTER<i>, "move", x, y)
elseif RIGHTBOOLEAN<i> == true then
set angle = 0.0
set x = GetUnitX(FIGHTER<i>) + 1024 * Cos(angle * bj_DEGTORAD)
set y = GetUnitY(FIGHTER<i>) + 1024 * Sin(angle * bj_DEGTORAD)
call IssuePointOrder(FIGHTER<i>, "move", x, y)
elseif UPBOOLEAN<i> == true then
set angle = 90.0
set x = GetUnitX(FIGHTER<i>) + 1024 * Cos(angle * bj_DEGTORAD)
set y = GetUnitY(FIGHTER<i>) + 1024 * Sin(angle * bj_DEGTORAD)
call IssuePointOrder(FIGHTER<i>, "move", x, y)
elseif DOWNBOOLEAN<i> == true then
set angle = 270.0
set x = GetUnitX(FIGHTER<i>) + 1024 * Cos(angle * bj_DEGTORAD)
set y = GetUnitY(FIGHTER<i>) + 1024 * Sin(angle * bj_DEGTORAD)
call IssuePointOrder(FIGHTER<i>, "move", x, y)
endif
set i = i + 1
exitwhen i > 11
endloop
endfunction
private function MoveLeft takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer())
local real angle = 180.0
local real x = GetUnitX(FIGHTER[pid]) + 1024 * Cos(angle * bj_DEGTORAD)
local real y = GetUnitY(FIGHTER[pid]) + 1024 * Sin(angle * bj_DEGTORAD)
set LEFTBOOLEAN[pid] = true
call IssuePointOrder(FIGHTER[pid], "move", x, y)
endfunction
private function StopLeft takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer())
set LEFTBOOLEAN[pid] = false
call IssueImmediateOrder(FIGHTER[pid], "stop")
endfunction
private function MoveRight takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer())
local real angle = 0.0
local real x = GetUnitX(FIGHTER[pid]) + 1024 * Cos(angle * bj_DEGTORAD)
local real y = GetUnitY(FIGHTER[pid]) + 1024 * Sin(angle * bj_DEGTORAD)
set RIGHTBOOLEAN[pid] = true
call IssuePointOrder(FIGHTER[pid], "move", x, y)
endfunction
private function StopRight takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer())
set RIGHTBOOLEAN[pid] = false
call IssueImmediateOrder(FIGHTER[pid], "stop")
endfunction
private function MoveUp takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer())
local real angle = 90.0
local real x = GetUnitX(FIGHTER[pid]) + 1024 * Cos(angle * bj_DEGTORAD)
local real y = GetUnitY(FIGHTER[pid]) + 1024 * Sin(angle * bj_DEGTORAD)
set UPBOOLEAN[pid] = true
call IssuePointOrder(FIGHTER[pid], "move", x, y)
endfunction
private function StopUp takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer())
set UPBOOLEAN[pid] = false
call IssueImmediateOrder(FIGHTER[pid], "stop")
endfunction
private function MoveDown takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer())
local real angle = 270.0
local real x = GetUnitX(FIGHTER[pid]) + 1024 * Cos(angle * bj_DEGTORAD)
local real y = GetUnitY(FIGHTER[pid]) + 1024 * Sin(angle * bj_DEGTORAD)
set DOWNBOOLEAN[pid] = true
call IssuePointOrder(FIGHTER[pid], "move", x, y)
endfunction
private function StopDown takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer())
set DOWNBOOLEAN[pid] = false
call IssueImmediateOrder(FIGHTER[pid], "stop")
endfunction
private function Init takes nothing returns nothing
local trigger pressleft = CreateTrigger()
local trigger releaseleft = CreateTrigger()
local trigger pressright = CreateTrigger()
local trigger releaseright = CreateTrigger()
local trigger pressup = CreateTrigger()
local trigger releaseup = CreateTrigger()
local trigger pressdown = CreateTrigger()
local trigger releasedown = CreateTrigger()
local integer i = 0
local trigger t = CreateTrigger()
call TriggerRegisterTimerEvent(t, 0.333, true)
loop
call TriggerRegisterPlayerKeyEventBJ(pressleft, Player(i), bj_KEYEVENTTYPE_DEPRESS, bj_KEYEVENTKEY_LEFT)
call TriggerRegisterPlayerKeyEventBJ(releaseleft, Player(i), bj_KEYEVENTTYPE_RELEASE, bj_KEYEVENTKEY_LEFT)
call TriggerRegisterPlayerKeyEventBJ(pressright, Player(i), bj_KEYEVENTTYPE_DEPRESS, bj_KEYEVENTKEY_RIGHT)
call TriggerRegisterPlayerKeyEventBJ(releaseright, Player(i), bj_KEYEVENTTYPE_RELEASE, bj_KEYEVENTKEY_RIGHT)
call TriggerRegisterPlayerKeyEventBJ(pressup, Player(i), bj_KEYEVENTTYPE_DEPRESS, bj_KEYEVENTKEY_UP)
call TriggerRegisterPlayerKeyEventBJ(releaseup, Player(i), bj_KEYEVENTTYPE_RELEASE, bj_KEYEVENTKEY_UP)
call TriggerRegisterPlayerKeyEventBJ(pressdown, Player(i), bj_KEYEVENTTYPE_DEPRESS, bj_KEYEVENTKEY_DOWN)
call TriggerRegisterPlayerKeyEventBJ(releasedown, Player(i), bj_KEYEVENTTYPE_RELEASE, bj_KEYEVENTKEY_DOWN)
set i = i + 1
exitwhen i > 11
endloop
call TriggerAddAction(t, function Actions)
call TriggerAddAction(pressleft, function MoveLeft)
call TriggerAddAction(releaseleft, function StopLeft)
call TriggerAddAction(pressright, function MoveRight)
call TriggerAddAction(releaseright, function StopRight)
call TriggerAddAction(pressup, function MoveUp)
call TriggerAddAction(releaseup, function StopUp)
call TriggerAddAction(pressdown, function MoveDown)
call TriggerAddAction(releasedown, function StopDown)
endfunction
endscope</i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i>
I then decided to optimize it (and by that I mean cut it up into different triggers), but it would not work correctly anymore:
JASS:
scope MoveLeft initializer Init
private function Move takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer())
local real angle = 180.0
local real x = GetUnitX(FIGHTER[pid]) + 1024 * Cos(angle * bj_DEGTORAD)
local real y = GetUnitY(FIGHTER[pid]) + 1024 * Sin(angle * bj_DEGTORAD)
set LEFTBOOLEAN[pid] = true
call IssuePointOrder(FIGHTER[pid], "move", x, y)
endfunction
private function Stop takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer())
set LEFTBOOLEAN[pid] = false
call IssueImmediateOrder(FIGHTER[pid], "stop")
endfunction
private function Init takes nothing returns nothing
local integer i = 0
local trigger press = CreateTrigger()
local trigger release = CreateTrigger()
loop
call TriggerRegisterPlayerEvent(press, Player(i), EVENT_PLAYER_ARROW_LEFT_DOWN)
call TriggerRegisterPlayerEvent(release, Player(i), EVENT_PLAYER_ARROW_LEFT_UP)
set i = i + 1
exitwhen i == 12
endloop
call TriggerAddAction(press, function Move)
call TriggerAddAction(release, function Stop)
endfunction
endscope
For some reason, the unit will move left, and then stop and attempt to move in every direction at once.