improvement: use target and motion for goTo
This commit is contained in:
parent
58e68f0191
commit
0c4e960ec9
2 changed files with 33 additions and 28 deletions
|
@ -130,10 +130,7 @@ function Battler:unblockChoregraphy()
|
||||||
end
|
end
|
||||||
|
|
||||||
function Battler:timerResponse(signal)
|
function Battler:timerResponse(signal)
|
||||||
if ((self.currentlyBlocking ~= nil) and (signal == self.blockedBy)) then
|
self:finishAction(signal)
|
||||||
self:unblockChoregraphy()
|
|
||||||
end
|
|
||||||
self:unlockTag(signal)
|
|
||||||
|
|
||||||
if (signal == "resetMovement") then
|
if (signal == "resetMovement") then
|
||||||
self:resetMovementType()
|
self:resetMovementType()
|
||||||
|
@ -142,6 +139,13 @@ function Battler:timerResponse(signal)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function Battler:finishAction(signal)
|
||||||
|
if ((self.currentlyBlocking ~= nil) and (signal == self.blockedBy)) then
|
||||||
|
self:unblockChoregraphy()
|
||||||
|
end
|
||||||
|
self:unlockTag(signal)
|
||||||
|
end
|
||||||
|
|
||||||
function Battler:choregraphyEnded()
|
function Battler:choregraphyEnded()
|
||||||
self:initMovementSystem()
|
self:initMovementSystem()
|
||||||
end
|
end
|
||||||
|
|
|
@ -49,13 +49,14 @@ function Movable:stopMoving()
|
||||||
self.xspeed, self.yspeed, self.zspeed = 0,0,0
|
self.xspeed, self.yspeed, self.zspeed = 0,0,0
|
||||||
self.speed = 0
|
self.speed = 0
|
||||||
if (self.movementType == MOVEMENT_TWEENER) then
|
if (self.movementType == MOVEMENT_TWEENER) then
|
||||||
self:unlockTag("goTo")
|
self:finishAction("goTo")
|
||||||
self.tweens:removeNamedTween("goTo")
|
self.tweens:removeNamedTween("goTo")
|
||||||
self.tweens:removeTimer("goTo")
|
self.tweens:removeTimer("goTo")
|
||||||
self.tweens:removeTimer("resetMovement")
|
self.tweens:removeTimer("resetMovement")
|
||||||
end
|
end
|
||||||
self.movementType = MOVEMENT_NONE
|
self:finishAction("goTo")
|
||||||
self:updatePreviousPosition()
|
self:updatePreviousPosition()
|
||||||
|
self:resetMovementType()
|
||||||
end
|
end
|
||||||
|
|
||||||
function Movable:updateMovement(dt)
|
function Movable:updateMovement(dt)
|
||||||
|
@ -81,15 +82,11 @@ end
|
||||||
-- Tweener movement functions
|
-- Tweener movement functions
|
||||||
|
|
||||||
function Movable:goTo(dx, dy, duration, easing)
|
function Movable:goTo(dx, dy, duration, easing)
|
||||||
local easing = easing or 'inOutQuad'
|
|
||||||
self:stopMoving()
|
self:stopMoving()
|
||||||
if duration > 0 then
|
self:setTarget(dx, dy)
|
||||||
self.tweens:setNamedTween("goTo", 0, duration, {x = dx, y = dy}, easing)
|
local speed = utils.math.pointDistance(self.x, self.y, dx, dy) / duration
|
||||||
end
|
self:setMotionToPoint(speed, dx, dy)
|
||||||
self.tweens:newTimer(duration + 0.02, "goTo")
|
self.movementType = MOVEMENT_TARGET
|
||||||
self.tweens:newTimer(duration + 0.02, "resetMovement")
|
|
||||||
|
|
||||||
self.movementType = MOVEMENT_TWEENER
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function Movable:goTo3D(dx, dy, dz, duration, easing)
|
function Movable:goTo3D(dx, dy, dz, duration, easing)
|
||||||
|
@ -124,7 +121,7 @@ function Movable:setMotionToPoint(speed, dx, dy)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Movable:updateMotion(dt)
|
function Movable:updateMotion(dt)
|
||||||
self:checkTarget()
|
self:checkTarget(dt)
|
||||||
self.xspeed, self.yspeed = utils.math.lengthdir(self.speed, self.angle)
|
self.xspeed, self.yspeed = utils.math.lengthdir(self.speed, self.angle)
|
||||||
self.x = self.x + (self.xspeed) * dt
|
self.x = self.x + (self.xspeed) * dt
|
||||||
self.y = self.y + (self.yspeed) * dt
|
self.y = self.y + (self.yspeed) * dt
|
||||||
|
@ -159,30 +156,34 @@ function Movable:isNearTarget(distance)
|
||||||
end
|
end
|
||||||
|
|
||||||
if (self.target.z == nil) then
|
if (self.target.z == nil) then
|
||||||
return (utils.math.pointDistance(self.x, self.y, self.target.x, self.target.z) <= distance)
|
return (utils.math.pointDistance(self.x, self.y, self.target.x, self.target.y) <= distance)
|
||||||
else
|
else
|
||||||
return (utils.math.pointDistance3D(self.x, self.y, self.z, self.target.x, self.target.y, self.target.z) <= distance)
|
return (utils.math.pointDistance3D(self.x, self.y, self.z, self.target.x, self.target.y, self.target.z) <= distance)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function Movable:checkTarget()
|
function Movable:checkTarget(dt)
|
||||||
if (self:isTargetActive()) then
|
if (self:isTargetActive()) then
|
||||||
local isNearTarget = self:isNearTarget(self.speed)
|
local isNearTarget = self:isNearTarget(self.speed * dt)
|
||||||
if (isNearTarget) then
|
if (isNearTarget) then
|
||||||
-- TODO: add a one-time signal to target handling
|
self:finishTarget()
|
||||||
self:resetTarget()
|
|
||||||
if (self.movementType == MOVEMENT_TARGET) then
|
|
||||||
self.x = self.target.x
|
|
||||||
self.y = self.target.y
|
|
||||||
if (self.target.z ~= nil) then
|
|
||||||
self.z = self.target.z
|
|
||||||
end
|
|
||||||
self:stopMoving()
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function Movable:finishTarget()
|
||||||
|
-- TODO: add a one-time signal to target handling
|
||||||
|
if (self.movementType == MOVEMENT_TARGET) then
|
||||||
|
self.x = self.target.x
|
||||||
|
self.y = self.target.y
|
||||||
|
if (self.target.z ~= nil) then
|
||||||
|
self.z = self.target.z
|
||||||
|
end
|
||||||
|
self:stopMoving()
|
||||||
|
end
|
||||||
|
self:resetTarget()
|
||||||
|
end
|
||||||
|
|
||||||
-- Direction handling
|
-- Direction handling
|
||||||
|
|
||||||
function Movable:updateDirection()
|
function Movable:updateDirection()
|
||||||
|
|
Loading…
Reference in a new issue