cc = cc or {}
|
|
|
|
local math_fmod = math.fmod
|
|
local math_min = math.min
|
|
local math_max = math.max
|
|
local math_pow = math.pow
|
|
|
|
cc.ExtraAction = cc.ExtraAction or BaseClass(cc.FiniteTimeAction)
|
|
function cc.ExtraAction:__init()
|
|
|
|
end
|
|
function cc.ExtraAction:clone()
|
|
return cc.ExtraAction.New()
|
|
end
|
|
|
|
function cc.ExtraAction:reverse()
|
|
return cc.ExtraAction.New()
|
|
end
|
|
|
|
function cc.ExtraAction:update(time)
|
|
end
|
|
|
|
function cc.ExtraAction:step(dt)
|
|
end
|
|
|
|
|
|
cc.ActionInterval = cc.ActionInterval or BaseClass(cc.FiniteTimeAction)
|
|
|
|
cc.ActionInterval.FLT_EPSILON = 1.192092896e-07
|
|
|
|
function cc.ActionInterval:__init()
|
|
self._classType = "ActionInterval"
|
|
end
|
|
|
|
function cc.ActionInterval:getElapsed()
|
|
return self._elapsed
|
|
end
|
|
|
|
function cc.ActionInterval:setAmplitudeRate(amp)
|
|
--Subclass should implement this method!
|
|
end
|
|
|
|
function cc.ActionInterval:getAmplitudeRate()
|
|
--Subclass should implement this method!
|
|
return 0
|
|
end
|
|
|
|
function cc.ActionInterval:isDone()
|
|
return self._elapsed >= self._duration
|
|
end
|
|
|
|
function cc.ActionInterval:sendUpdateEventToScript(dt, actionObject)
|
|
return false;
|
|
end
|
|
|
|
function cc.ActionInterval:step(dt)
|
|
if self._firstTick then
|
|
self._firstTick = false
|
|
self._elapsed = 0
|
|
else
|
|
self._elapsed = self._elapsed + dt
|
|
end
|
|
local updateDt = math_max(0,math_min(1,self._elapsed / math_max(self._duration,cc.ActionInterval.FLT_EPSILON)))
|
|
|
|
self:update(updateDt)
|
|
end
|
|
|
|
function cc.ActionInterval:startWithTarget(target)
|
|
cc.FiniteTimeAction.startWithTarget(self, target);
|
|
self._elapsed = 0
|
|
self._firstTick = true
|
|
end
|
|
|
|
function cc.ActionInterval:reverse()
|
|
print("Cat_Error:ActionInterval.lua [ActionInterval:reverse] should not exec this method!")
|
|
return nil
|
|
end
|
|
|
|
function cc.ActionInterval:clone()
|
|
print("Cat_Error:ActionInterval.lua [ActionInterval:clone] should not exec this method!")
|
|
return nil
|
|
end
|
|
|
|
function cc.ActionInterval:initWithDuration(d)
|
|
self._duration = d
|
|
if self._duration == 0 then
|
|
self._duration = cc.ActionInterval.FLT_EPSILON
|
|
end
|
|
|
|
self._elapsed = 0
|
|
self._firstTick = true
|
|
|
|
return true
|
|
end
|
|
|
|
cc.MoveTypeMap = cc.MoveTypeMap or {
|
|
["AnchoredPos"] = {GetFunc=cc.Wrapper.GetAnchoredPosition, SetFunc=cc.Wrapper.SetAnchoredPosition},
|
|
["LocalPos"] = {GetFunc=cc.Wrapper.GetLocalPosition, SetFunc=cc.Wrapper.SetLocalPosition},
|
|
["Pos"] = {GetFunc=cc.Wrapper.GetPosition, SetFunc=cc.Wrapper.SetPosition},
|
|
}
|
|
--MoveBy start
|
|
cc.MoveBy = cc.MoveBy or BaseClass(cc.ActionInterval)
|
|
--别用.New了,用create前缀的接口
|
|
function cc.MoveBy:__init(duration, delta_x, delta_y, delta_z, previous_x, previous_y, previous_z )
|
|
self:initWithMoveType(duration, delta_x, delta_y, delta_z, "LocalPos", previous_x, previous_y, previous_z)
|
|
end
|
|
--移动节点的anchoredPosition
|
|
function cc.MoveBy.createAnchoredType( duration, x, y, previous_x, previous_y )
|
|
local action = cc.MoveBy.New()
|
|
action:initWithMoveType(duration, x, y, 0, "AnchoredPos", previous_x, previous_y)
|
|
return action
|
|
end
|
|
--移动节点的position绝对坐标
|
|
function cc.MoveBy.createAbsType( duration, x, y, z, previous_x, previous_y, previous_z )
|
|
local action = cc.MoveBy.New()
|
|
action:initWithMoveType(duration, x, y, z, "Pos", previous_x, previous_y, previous_z)
|
|
return action
|
|
end
|
|
--移动节点的localPosition
|
|
function cc.MoveBy.createLocalType( duration, x, y, z, previous_x, previous_y, previous_z )
|
|
local action = cc.MoveBy.New()
|
|
action:initWithMoveType(duration, x, y, z, "LocalPos", previous_x, previous_y, previous_z)
|
|
return action
|
|
end
|
|
|
|
function cc.MoveBy:initWithMoveType(duration, delta_x, delta_y, delta_z, move_type, previous_x, previous_y, previous_z)
|
|
cc.ActionInterval.initWithDuration(self, duration)
|
|
self.move_type = move_type
|
|
self._positionDeltaX = delta_x or 0
|
|
self._positionDeltaY = delta_y or 0
|
|
self._positionDeltaZ = delta_z or 0
|
|
self._previousPositionX, self._previousPositionY, self._previousPositionZ = previous_x, previous_y, previous_z
|
|
end
|
|
|
|
function cc.MoveBy:clone()
|
|
local action = cc.MoveBy.New()
|
|
action:initWithMoveType(self._duration, self._positionDeltaX, self._positionDeltaY, self._positionDeltaZ, self.move_type)
|
|
return action
|
|
end
|
|
|
|
function cc.MoveBy:reverse()
|
|
local action = cc.MoveBy.New()
|
|
action:initWithMoveType(self._duration, self._positionDeltaX and -self._positionDeltaX, self._positionDeltaY and -self._positionDeltaY, self._positionDeltaZ and -self._positionDeltaZ, self.move_type)
|
|
return action
|
|
end
|
|
|
|
function cc.MoveBy:startWithTarget(target)
|
|
cc.ActionInterval.startWithTarget(self, target)
|
|
if not self._previousPositionX or not self._previousPositionY then
|
|
self._previousPositionX, self._previousPositionY, self._previousPositionZ = cc.MoveTypeMap[self.move_type].GetFunc(self._target)
|
|
end
|
|
self._previousPositionZ = self._previousPositionZ or 0--anchored pos没有Z轴
|
|
self._startPositionX, self._startPositionY, self._startPositionZ = self._previousPositionX, self._previousPositionY, self._previousPositionZ
|
|
end
|
|
|
|
function cc.MoveBy:update(t)
|
|
if self._target then
|
|
if self._positionDeltaX and self._positionDeltaX ~= 0 then
|
|
self._previousPositionX = self._startPositionX + (self._positionDeltaX * t)
|
|
end
|
|
if self._positionDeltaY and self._positionDeltaY ~= 0 then
|
|
self._previousPositionY = self._startPositionY + (self._positionDeltaY * t)
|
|
end
|
|
if self._positionDeltaZ and self._positionDeltaZ ~= 0 then
|
|
self._previousPositionZ = self._startPositionZ + (self._positionDeltaZ * t)
|
|
end
|
|
cc.MoveTypeMap[self.move_type].SetFunc(self._target, self._previousPositionX, self._previousPositionY, self._previousPositionZ)
|
|
end
|
|
end
|
|
--MoveBy end
|
|
|
|
--MoveTo start
|
|
cc.MoveTo = cc.MoveTo or BaseClass(cc.MoveBy)
|
|
--尽量别用.New了,用create前缀的接口
|
|
function cc.MoveTo:__init(duration, x, y, z, previous_x, previous_y, previous_z)
|
|
self:initWithMoveType(duration, x, y, z, "LocalPos", previous_x, previous_y, previous_z)
|
|
end
|
|
--移动节点的anchoredPosition
|
|
function cc.MoveTo.createAnchoredType( duration, x, y, previous_x, previous_y )
|
|
local action = cc.MoveTo.New()
|
|
action:initWithMoveType(duration, x, y, 0, "AnchoredPos", previous_x, previous_y)
|
|
return action
|
|
end
|
|
--移动节点的position绝对坐标
|
|
function cc.MoveTo.createAbsType( duration, x, y, z, previous_x, previous_y, previous_z )
|
|
local action = cc.MoveTo.New()
|
|
action:initWithMoveType(duration, x, y, z, "Pos", previous_x, previous_y, previous_z)
|
|
return action
|
|
end
|
|
--移动节点的localPosition
|
|
function cc.MoveTo.createLocalType( duration, x, y, z, previous_x, previous_y, previous_z )
|
|
local action = cc.MoveTo.New()
|
|
action:initWithMoveType(duration, x, y, z, "LocalPos", previous_x, previous_y, previous_z)
|
|
return action
|
|
end
|
|
|
|
function cc.MoveTo:initWithMoveType(duration, x, y, z, move_type, previous_x, previous_y, previous_z)
|
|
cc.ActionInterval.initWithDuration(self, duration)
|
|
self.move_type = move_type
|
|
self._endPositionX = x or 0
|
|
self._endPositionY = y or 0
|
|
self._endPositionZ = z or 0
|
|
self._previousPositionX, self._previousPositionY, self._previousPositionZ = previous_x, previous_y, previous_z
|
|
end
|
|
|
|
function cc.MoveTo:clone()
|
|
local action = cc.MoveTo.New()
|
|
action:initWithMoveType(self._duration, self._endPositionX, self._endPositionY, self._endPositionZ, "LocalPos")
|
|
return action
|
|
end
|
|
|
|
function cc.MoveTo:startWithTarget(target)
|
|
cc.MoveBy.startWithTarget(self, target)
|
|
local oldX, oldY, oldZ = self._previousPositionX, self._previousPositionY, self._previousPositionZ
|
|
if not oldX or not oldY then
|
|
oldX, oldY, oldZ = cc.MoveTypeMap[self.move_type].GetFunc(self._target)
|
|
end
|
|
self._positionDeltaX = self._endPositionX - oldX
|
|
self._positionDeltaY = self._endPositionY - oldY
|
|
self._positionDeltaZ = self._endPositionZ - (oldZ or 0)
|
|
end
|
|
|
|
function cc.MoveTo:reverse()
|
|
print("reverse() not supported in MoveTo")
|
|
return nil
|
|
end
|
|
--MoveTo end
|
|
|
|
--Sequence start
|
|
cc.Sequence = cc.Sequence or BaseClass(cc.ActionInterval)
|
|
|
|
function cc.Sequence:__init(...)
|
|
self._actions = {}
|
|
self:initWithTable({...})
|
|
end
|
|
|
|
function cc.Sequence.createWithTwoActions(actionOne, actionTwo)
|
|
local sequence = cc.Sequence.New()
|
|
sequence:initWithTwoActions(actionOne, actionTwo);
|
|
return sequence;
|
|
end
|
|
|
|
function cc.Sequence.createWithTable( action_tb )
|
|
local action = cc.Sequence.New()
|
|
action:initWithTable(action_tb)
|
|
return action
|
|
end
|
|
|
|
function cc.Sequence:initWithTable(actions)
|
|
local count = #actions
|
|
if (count == 0) then
|
|
--进入这里也是正常的
|
|
return
|
|
end
|
|
|
|
if (count == 1) then
|
|
return self:initWithTwoActions(actions[1], cc.ExtraAction.New());
|
|
end
|
|
|
|
local prev = actions[1]
|
|
for i=2,#actions-1 do
|
|
prev = cc.Sequence.createWithTwoActions(prev, actions[i])
|
|
end
|
|
|
|
self:initWithTwoActions(prev, actions[count]);
|
|
end
|
|
|
|
function cc.Sequence:initWithTwoActions(actionOne, actionTwo)
|
|
local d = actionOne:getDuration() + actionTwo:getDuration()
|
|
cc.ActionInterval.initWithDuration(self, d)
|
|
self._actions[0] = actionOne
|
|
self._actions[1] = actionTwo
|
|
return true
|
|
end
|
|
|
|
function cc.Sequence:clone()
|
|
local a = cc.Sequence.New()
|
|
a:initWithTwoActions(self._actions[0]:clone(), self._actions[1]:clone() )
|
|
return a
|
|
end
|
|
|
|
function cc.Sequence:startWithTarget(target)
|
|
cc.ActionInterval.startWithTarget(self, target)
|
|
self._split = self._actions[0]:getDuration() / self._duration
|
|
self._last = -1
|
|
end
|
|
|
|
function cc.Sequence:stop()
|
|
-- Issue #1305
|
|
if ( self._last ~= - 1) then
|
|
self._actions[self._last]:stop()
|
|
end
|
|
|
|
cc.ActionInterval.stop(self)
|
|
end
|
|
|
|
function cc.Sequence:update(t)
|
|
local found = 0
|
|
local new_t = 0.0
|
|
|
|
if( t < self._split ) then
|
|
found = 0
|
|
if( self._split ~= 0 ) then
|
|
new_t = t / self._split
|
|
else
|
|
new_t = 1
|
|
end
|
|
else
|
|
found = 1;
|
|
if ( self._split == 1 ) then
|
|
new_t = 1;
|
|
else
|
|
new_t = (t-self._split) / (1 - self._split );
|
|
end
|
|
end
|
|
|
|
if ( found==1 ) then
|
|
if( self._last == -1 ) then
|
|
-- action[0] was skipped, execute it.
|
|
self._actions[0]:startWithTarget(self._target);
|
|
self._actions[0]:update(1.0)
|
|
self._actions[0]:stop()
|
|
elseif( self._last == 0 ) then
|
|
-- switching to action 1. stop action 0.
|
|
self._actions[0]:update(1.0)
|
|
self._actions[0]:stop()
|
|
end
|
|
elseif (found==0 and self._last==1 ) then
|
|
self._actions[1]:update(0);
|
|
self._actions[1]:stop();
|
|
end
|
|
-- Last action found and it is done.
|
|
if( found == self._last and self._actions[found]:isDone() ) then
|
|
return
|
|
end
|
|
|
|
-- Last action found and it is done
|
|
if( found ~= self._last ) then
|
|
self._actions[found]:startWithTarget(self._target);
|
|
end
|
|
self._actions[found]:update(new_t);
|
|
self._last = found;
|
|
end
|
|
|
|
function cc.Sequence:reverse()
|
|
return cc.Sequence.createWithTwoActions(self._actions[1]:reverse(), self._actions[0]:reverse())
|
|
end
|
|
|
|
--Sequence end
|
|
|
|
--ScaleTo start
|
|
|
|
cc.ScaleTo = cc.ScaleTo or BaseClass(cc.ActionInterval)
|
|
|
|
function cc.ScaleTo:__init(duration, sx, sy, sz)
|
|
self:initWithDuration(duration, sx, sy, sz);
|
|
end
|
|
|
|
function cc.ScaleTo:initWithDuration(duration, sx, sy, sz)
|
|
cc.ActionInterval.initWithDuration(self, duration)
|
|
self._endScaleX = sx or 1
|
|
self._endScaleY = sy or 1
|
|
self._endScaleZ = sz or 1
|
|
end
|
|
|
|
function cc.ScaleTo:clone()
|
|
return ScaleTo.New(self._duration, self._endScaleX, self._endScaleY, self._endScaleZ)
|
|
end
|
|
|
|
function cc.ScaleTo:reverse()
|
|
print("reverse() not supported in ScaleTo")
|
|
return nil
|
|
end
|
|
|
|
function cc.ScaleTo:startWithTarget(target)
|
|
cc.ActionInterval.startWithTarget(self, target);
|
|
self._startScaleX, self._startScaleY, self._startScaleZ = self._target.localScale.x,self._target.localScale.y,self._target.localScale.z
|
|
self._deltaX = self._endScaleX - self._startScaleX;
|
|
self._deltaY = self._endScaleY - self._startScaleY;
|
|
self._deltaZ = self._endScaleZ - self._startScaleZ;
|
|
end
|
|
|
|
function cc.ScaleTo:update(time)
|
|
if self._target then
|
|
self._target.localScale = Vector3(self._startScaleX + self._deltaX * time, self._startScaleY + self._deltaY * time, self._startScaleZ + self._deltaZ * time)
|
|
end
|
|
end
|
|
|
|
--ScaleTo end
|
|
|
|
--Fade start
|
|
cc.FadeTo = cc.FadeTo or BaseClass(cc.ActionInterval)
|
|
|
|
function cc.FadeTo:__init(duration, opacity, isAllChildren)
|
|
self:initWithDuration(duration, opacity, isAllChildren)
|
|
end
|
|
|
|
function cc.FadeTo:initWithDuration(duration, opacity, isAllChildren)
|
|
cc.ActionInterval.initWithDuration(self, duration)
|
|
self._toOpacity = opacity
|
|
self._isAllChildren = isAllChildren
|
|
end
|
|
|
|
function cc.FadeTo:clone()
|
|
return FadeTo.New(self._duration, self._toOpacity, self._isAllChildren)
|
|
end
|
|
|
|
function cc.FadeTo:reverse()
|
|
print("reverse() not supported in FadeTo");
|
|
return nil;
|
|
end
|
|
|
|
function cc.FadeTo:startWithTarget(target)
|
|
cc.ActionInterval.startWithTarget(self, target)
|
|
self._fromOpacity = self._fromOpacity or cc.Wrapper.GetAlpha(self._target)
|
|
end
|
|
|
|
function cc.FadeTo:setCurOpacity( alpha )
|
|
self._fromOpacity = alpha
|
|
end
|
|
|
|
-- function cc.FadeTo:initChildrenList( )
|
|
-- if not self.childrenList then
|
|
-- self.childrenList = self._target:GetComponentsInChildren(typeof(UnityEngine.RectTransform))
|
|
-- end
|
|
-- end
|
|
|
|
function cc.FadeTo:update(time)
|
|
if self._target then
|
|
local newOpacity = (self._fromOpacity + (self._toOpacity - self._fromOpacity) * time)
|
|
if self._isAllChildren then
|
|
cc.Wrapper.SetChildrenAlpha(self._target, newOpacity, self)
|
|
-- self:initChildrenList()
|
|
-- if not self.childrenList then return end
|
|
-- for i=0,self.childrenList.Length-1 do
|
|
-- local child = self.childrenList[i]
|
|
-- cc.Wrapper.SetAlpha(child, newOpacity)
|
|
-- end
|
|
else
|
|
cc.Wrapper.SetAlpha(self._target, newOpacity)
|
|
end
|
|
end
|
|
end
|
|
|
|
cc.FadeIn = cc.FadeIn or BaseClass(cc.FadeTo)
|
|
|
|
function cc.FadeIn:__init(d)
|
|
self:initWithDuration(d,1.0);
|
|
end
|
|
|
|
function cc.FadeIn:clone()
|
|
return cc.FadeIn.New(self._duration)
|
|
end
|
|
|
|
function cc.FadeIn:reverse()
|
|
return cc.FadeOut.New(self._duration)
|
|
end
|
|
|
|
function cc.FadeIn:startWithTarget(target)
|
|
cc.ActionInterval.startWithTarget(self, target)
|
|
|
|
self._toOpacity = 1.0
|
|
|
|
self._fromOpacity = cc.Wrapper.GetAlpha(self._target)
|
|
end
|
|
|
|
cc.FadeOut = cc.FadeOut or BaseClass(cc.FadeTo)
|
|
|
|
function cc.FadeOut:__init(d)
|
|
self:initWithDuration(d,0.0)
|
|
end
|
|
|
|
function cc.FadeOut:clone()
|
|
return cc.FadeOut.New(self._duration,0.0);
|
|
end
|
|
|
|
function cc.FadeOut:startWithTarget(target)
|
|
cc.ActionInterval.startWithTarget(self, target);
|
|
|
|
self._toOpacity = 0.0
|
|
|
|
self._fromOpacity = cc.Wrapper.GetAlpha(self._target)
|
|
end
|
|
|
|
function cc.FadeOut:reverse()
|
|
return cc.FadeIn.New(self._duration)
|
|
end
|
|
|
|
--Fade end
|
|
|
|
--Rotate start
|
|
--huangcong可以用了rotate_type旋转轴
|
|
--[rotate_type == 1 z轴]
|
|
--[rotate_type == 2 x轴]
|
|
--[rotate_type == 3 y轴]
|
|
cc.RotateTo = cc.RotateTo or BaseClass(cc.ActionInterval)
|
|
|
|
function cc.RotateTo:__init(duration, dstAngle, rotate_type)--0.1, targetRotate
|
|
self._dstAngle = 0
|
|
self._startAngle = 0
|
|
self._diffAngle = 0
|
|
self.rotate_type = rotate_type or 1
|
|
self:initWithDuration(duration, dstAngle)
|
|
end
|
|
|
|
function cc.RotateTo:initWithDuration(duration, dstAngle)
|
|
cc.ActionInterval.initWithDuration(self, duration)
|
|
self._dstAngle = dstAngle
|
|
end
|
|
|
|
function cc.RotateTo:clone()
|
|
return cc.RotateTo.New(self._duration, self._dstAngle)
|
|
end
|
|
|
|
function cc.RotateTo:calculateAngles(startAngle, diffAngle, dstAngle)
|
|
if (startAngle > 0) then
|
|
startAngle = math_fmod(startAngle, 360.0)
|
|
else
|
|
startAngle = math_fmod(startAngle, -360.0)
|
|
end
|
|
|
|
diffAngle = dstAngle - startAngle
|
|
if (diffAngle > 180) then
|
|
diffAngle = diffAngle - 360
|
|
end
|
|
if (diffAngle < -180) then
|
|
diffAngle = diffAngle + 360
|
|
end
|
|
return startAngle, diffAngle
|
|
end
|
|
|
|
function cc.RotateTo:startWithTarget(target)
|
|
cc.ActionInterval.startWithTarget(self, target)
|
|
self._startAngle = target.eulerAngles
|
|
if self.rotate_type == 1 then
|
|
self._startAngle_num, self._diffAngle = self:calculateAngles(self._startAngle.z, self._diffAngle, self._dstAngle)
|
|
elseif self.rotate_type == 2 then
|
|
self._startAngle_num, self._diffAngle = self:calculateAngles(self._startAngle.x, self._diffAngle, self._dstAngle)
|
|
elseif self.rotate_type == 3 then
|
|
self._startAngle_num, self._diffAngle = self:calculateAngles(self._startAngle.y, self._diffAngle, self._dstAngle)
|
|
end
|
|
end
|
|
|
|
function cc.RotateTo:update(time)
|
|
if (self._target) then
|
|
local newRotation = self._startAngle_num + self._diffAngle * time
|
|
if self.rotate_type == 1 then--Z
|
|
self._target.localRotation = Quaternion.Euler(0,0,newRotation)
|
|
elseif self.rotate_type == 2 then--X
|
|
self._target.localRotation = Quaternion.Euler(newRotation,0,0)
|
|
elseif self.rotate_type == 3 then--Y
|
|
self._target.localRotation = Quaternion.Euler(0,newRotation,0)
|
|
end
|
|
end
|
|
end
|
|
|
|
function cc.RotateTo:reverse()
|
|
print("RotateTo doesn't support the 'reverse' method")
|
|
return nil
|
|
end
|
|
|
|
--huangcong可以用了rotate_type旋转轴
|
|
--[rotate_type == 1 z轴]
|
|
--[rotate_type == 2 x轴]
|
|
--[rotate_type == 3 y轴]
|
|
cc.RotateBy = cc.RotateBy or BaseClass(cc.ActionInterval)
|
|
|
|
function cc.RotateBy:__init(duration, deltaAngle, rotate_type)
|
|
self._deltaAngle = 0
|
|
self._startAngle = 0
|
|
self:initWithDuration(duration, deltaAngle)
|
|
self.rotate_type = rotate_type or 1
|
|
end
|
|
|
|
function cc.RotateBy:initWithDuration(duration, deltaAngle)
|
|
cc.ActionInterval.initWithDuration(self, duration)
|
|
self._deltaAngle = deltaAngle
|
|
end
|
|
|
|
function cc.RotateBy:clone()
|
|
return cc.RotateBy.New(self._duration, self._deltaAngle)
|
|
end
|
|
|
|
function cc.RotateBy:startWithTarget(target)
|
|
cc.ActionInterval.startWithTarget(self, target)
|
|
|
|
self._startAngle = target.eulerAngles
|
|
end
|
|
|
|
function cc.RotateBy:update(time)
|
|
if (self._target) then
|
|
if self.rotate_type == 1 then--Z轴
|
|
self._startAngle_num = self._startAngle.z
|
|
local newRotation = self._startAngle_num + self._deltaAngle * time
|
|
self._target.localRotation = Quaternion.Euler(0,0,newRotation)
|
|
elseif self.rotate_type == 2 then--X轴
|
|
self._startAngle_num = self._startAngle.x
|
|
local newRotation = self._startAngle_num + self._deltaAngle * time
|
|
self._target.localRotation = Quaternion.Euler(newRotation,0,0)
|
|
elseif self.rotate_type == 3 then--Y轴
|
|
self._startAngle_num = self._startAngle.y
|
|
local newRotation = self._startAngle_num + self._deltaAngle * time
|
|
self._target.localRotation = Quaternion.Euler(0,newRotation,0)
|
|
end
|
|
end
|
|
end
|
|
|
|
function cc.RotateBy:reverse()
|
|
return cc.RotateBy.New(self._duration, -self._deltaAngle, self.rotate_type)
|
|
end
|
|
-- Rotate end
|
|
|
|
--Repeat start
|
|
cc.Repeat = cc.Repeat or BaseClass(cc.ActionInterval)
|
|
|
|
function cc.Repeat:__init(action, times)
|
|
self:initWithAction(action, times)
|
|
end
|
|
|
|
function cc.Repeat:initWithAction(action, times)
|
|
local d = action:getDuration() * times
|
|
cc.ActionInterval.initWithDuration(self, d)
|
|
self._times = times;
|
|
self._innerAction = action;
|
|
|
|
self._actionInstant = action._classType and action._classType == "ActionInstant" or false
|
|
|
|
self._total = 0;
|
|
end
|
|
|
|
function cc.Repeat:clone()
|
|
-- no copy constructor
|
|
return cc.Repeat.New(self._innerAction:clone(), self._times)
|
|
end
|
|
|
|
function cc.Repeat:startWithTarget(target)
|
|
self._total = 0
|
|
self._nextDt = self._innerAction:getDuration()/self._duration
|
|
cc.ActionInterval.startWithTarget(self, target)
|
|
self._innerAction:startWithTarget(target)
|
|
end
|
|
|
|
function cc.Repeat:stop()
|
|
self._innerAction:stop()
|
|
cc.ActionInterval.stop(self)
|
|
end
|
|
|
|
-- issue #80. Instead of hooking step:, hook update: since it can be called by any
|
|
-- container action like Repeat, Sequence, Ease, etc..
|
|
function cc.Repeat:update(dt)
|
|
if (dt >= self._nextDt) then
|
|
while (dt >= self._nextDt and self._total < self._times) do
|
|
self._innerAction:update(1.0)
|
|
self._total = self._total + 1
|
|
|
|
self._innerAction:stop();
|
|
self._innerAction:startWithTarget(self._target)
|
|
self._nextDt = self._innerAction:getDuration()/self._duration * (self._total+1)
|
|
end
|
|
|
|
-- fix for issue #1288, incorrect end value of repeat
|
|
if((dt - 1.0) < cc.ActionInterval.FLT_EPSILON and (dt - 1.0) > -cc.ActionInterval.FLT_EPSILON and self._total < self._times) then
|
|
self._innerAction:update(1.0);
|
|
self._total = self._total + 1
|
|
end
|
|
|
|
-- don't set an instant action back or update it, it has no use because it has no duration
|
|
if (not self._actionInstant) then
|
|
if (self._total == self._times) then
|
|
-- minggo: inner action update is invoked above, don't have to invoke it here
|
|
-- self._innerAction:update(1);
|
|
self._innerAction:stop()
|
|
else
|
|
-- issue #390 prevent jerk, use right update
|
|
self._innerAction:update(dt - (self._nextDt - self._innerAction:getDuration()/self._duration))
|
|
end
|
|
end
|
|
else
|
|
self._innerAction:update(math_fmod(dt * self._times,1.0))
|
|
end
|
|
end
|
|
|
|
function cc.Repeat:isDone()
|
|
return self._total == self._times
|
|
end
|
|
|
|
function cc.Repeat:reverse()
|
|
return cc.Repeat.New(self._innerAction:reverse(), self._times)
|
|
end
|
|
|
|
cc.RepeatForever = cc.RepeatForever or BaseClass(cc.ActionInterval)
|
|
|
|
function cc.RepeatForever:__init(action)
|
|
self:initWithAction(action)
|
|
end
|
|
|
|
function cc.RepeatForever:initWithAction(action)
|
|
self._innerAction = action
|
|
end
|
|
|
|
function cc.RepeatForever:clone()
|
|
return cc.RepeatForever.New(self._innerAction:clone())
|
|
end
|
|
|
|
function cc.RepeatForever:startWithTarget(target)
|
|
cc.ActionInterval.startWithTarget(self, target)
|
|
self._innerAction:startWithTarget(target)
|
|
end
|
|
|
|
function cc.RepeatForever:step(dt)
|
|
self._innerAction:step(dt);
|
|
if (self._innerAction:isDone()) then
|
|
local diff = self._innerAction:getElapsed() - self._innerAction:getDuration()
|
|
if (diff > self._innerAction:getDuration()) then
|
|
diff = math_fmod(diff, self._innerAction:getDuration())
|
|
end
|
|
self._innerAction:startWithTarget(self._target)
|
|
-- to prevent jerk. issue #390, 1247
|
|
self._innerAction:step(0.0);
|
|
self._innerAction:step(diff);
|
|
end
|
|
end
|
|
|
|
function cc.RepeatForever:isDone()
|
|
return false
|
|
end
|
|
|
|
function cc.RepeatForever:reverse()
|
|
return cc.RepeatForever.New(self._innerAction:reverse())
|
|
end
|
|
--Repeat end
|
|
|
|
--Spawn start
|
|
cc.Spawn = cc.Spawn or BaseClass(cc.ActionInterval)
|
|
|
|
function cc.Spawn:__init(...)
|
|
self._actions = {}
|
|
self:initWithTable({...})
|
|
end
|
|
|
|
function cc.Spawn.createWithTwoActions(actionOne, actionTwo)
|
|
local Spawn = cc.Spawn.New()
|
|
Spawn:initWithTwoActions(actionOne, actionTwo);
|
|
return Spawn
|
|
end
|
|
|
|
function cc.Spawn:initWithTable(actions)
|
|
local count = #actions
|
|
if (count == 0) then
|
|
--进入这里也是正常的
|
|
return
|
|
end
|
|
|
|
if (count == 1) then
|
|
return initWithTwoActions(actions[1], cc.ExtraAction.New());
|
|
end
|
|
|
|
local prev = actions[1]
|
|
for i=2,#actions-1 do
|
|
prev = cc.Spawn.createWithTwoActions(prev, actions[i])
|
|
end
|
|
|
|
self:initWithTwoActions(prev, actions[count]);
|
|
end
|
|
|
|
function cc.Spawn:initWithTwoActions(actionOne, actionTwo)
|
|
local d1 = actionOne:getDuration()
|
|
local d2 = actionTwo:getDuration()
|
|
local d = math_max(d1 , d2)
|
|
cc.ActionInterval.initWithDuration(self, d)
|
|
self._one = actionOne
|
|
self._two = actionTwo
|
|
if (d1 > d2) then
|
|
self._two = cc.Sequence.New(actionTwo, cc.DelayTime.New(d1 - d2));
|
|
elseif (d1 < d2) then
|
|
self._one = cc.Sequence.New(actionOne, cc.DelayTime.New(d2 - d1));
|
|
end
|
|
end
|
|
|
|
function cc.Spawn:clone()
|
|
local a = cc.Spawn.New()
|
|
a:initWithTwoActions(self._one:clone(), self._two:clone() )
|
|
return a
|
|
end
|
|
|
|
function cc.Spawn:startWithTarget(target)
|
|
cc.ActionInterval.startWithTarget(self, target)
|
|
self._one:startWithTarget(target)
|
|
self._two:startWithTarget(target)
|
|
end
|
|
|
|
function cc.Spawn:stop()
|
|
self._one:stop()
|
|
self._two:stop()
|
|
cc.ActionInterval.stop(self)
|
|
end
|
|
|
|
function cc.Spawn:update(time)
|
|
if (self._one) then
|
|
self._one:update(time)
|
|
end
|
|
if (self._two) then
|
|
self._two:update(time)
|
|
end
|
|
end
|
|
|
|
function cc.Spawn:reverse()
|
|
return cc.Spawn.New(self._one:reverse(), self._two:reverse())
|
|
end
|
|
--Spawn end
|
|
|
|
--DelayTime start
|
|
|
|
cc.DelayTime = cc.DelayTime or BaseClass(cc.ActionInterval)
|
|
|
|
function cc.DelayTime:__init(d)
|
|
self:initWithDuration(d);
|
|
end
|
|
|
|
function cc.DelayTime:clone()
|
|
return cc.DelayTime.New(self._duration)
|
|
end
|
|
|
|
function cc.DelayTime:update(time)
|
|
--什么都不干
|
|
end
|
|
|
|
function cc.DelayTime:reverse()
|
|
return cc.DelayTime.New(self._duration)
|
|
end
|
|
|
|
--DelayTime end
|
|
--SizeBy start
|
|
cc.SizeBy = cc.SizeBy or BaseClass(cc.ActionInterval)
|
|
|
|
function cc.SizeBy:__init(duration, delta_w, delta_h)
|
|
self:initWithDuration(duration, delta_w, delta_h)
|
|
end
|
|
|
|
function cc.SizeBy:clone()
|
|
return cc.SizeBy.New(self._duration, self._SizeDeltaW, self._SizeDeltaH)
|
|
end
|
|
|
|
function cc.SizeBy:reverse()
|
|
return cc.SizeBy.New(self._duration, -self._SizeDeltaW, -self._SizeDeltaH)
|
|
end
|
|
|
|
function cc.SizeBy:startWithTarget(target)
|
|
cc.ActionInterval.startWithTarget(self, target)
|
|
|
|
self._previousSizeWidht,self._previousSizeHeight = GetSizeDeltaXY(self._target)
|
|
self._startSizeX,self._startSizeY = self._previousSizeWidht,self._previousSizeHeight
|
|
end
|
|
|
|
function cc.SizeBy:update(t)
|
|
if self._target then
|
|
local currentW,currentH = GetSizeDeltaXY(self._target)
|
|
local diffX = currentW - self._previousSizeWidht
|
|
local diffY = currentH - self._previousSizeHeight
|
|
local newSizeW = self._startSizeX + (self._SizeDeltaW * t)
|
|
local newSizeH = self._startSizeY + (self._SizeDeltaH * t)
|
|
-- self._target:SetVectorValue(WidgetProperty.Size,newSizeW,newSizeH)
|
|
SetSizeDelta(self._target, newSizeW, newSizeH)
|
|
self._previousSizeWidht = newSizeW
|
|
self._previousSizeHeight = newSizeH
|
|
end
|
|
end
|
|
|
|
function cc.SizeBy:initWithDuration(duration, delta_w, delta_h)
|
|
cc.ActionInterval.initWithDuration(self,duration)
|
|
self._SizeDeltaW = delta_w
|
|
self._SizeDeltaH = delta_h
|
|
end
|
|
|
|
--SizeBy end
|
|
|
|
--SizeTo start
|
|
cc.SizeTo = cc.SizeTo or BaseClass(cc.SizeBy)
|
|
function cc.SizeTo:__init(duration, w, h)
|
|
self:initWithSize(duration, w, h)
|
|
end
|
|
|
|
function cc.SizeTo:initWithSize(duration, w, h)
|
|
cc.ActionInterval.initWithDuration(self, duration)
|
|
self._endSizeW = w
|
|
self._endSizeH = h
|
|
end
|
|
|
|
function cc.SizeTo:clone()
|
|
return cc.SizeTo.New(self._duration, self._endSizeW, self._endSizeH)
|
|
end
|
|
|
|
function cc.SizeTo:startWithTarget(target)
|
|
cc.SizeBy.startWithTarget(self, target)
|
|
local oldW = self._target.sizeDelta.x
|
|
local oldH = self._target.sizeDelta.y
|
|
self._SizeDeltaW = self._endSizeW - oldW
|
|
self._SizeDeltaH = self._endSizeH - oldH
|
|
end
|
|
|
|
function cc.SizeTo:reverse()
|
|
print("reverse() not supported in SizeTo")
|
|
return nil
|
|
end
|
|
--SizeTo end
|
|
|
|
|
|
-- Bezier cubic formula:
|
|
-- ((1 - t) + t)3 = 1
|
|
-- Expands to ...
|
|
-- (1 - t)3 + 3t(1-t)2 + 3t2(1 - t) + t3 = 1
|
|
function cc.bezierat( a, b, c, d, t )
|
|
return (math_pow(1-t,3) * a +
|
|
3*t*(math_pow(1-t,2))*b +
|
|
3*math_pow(t,2)*(1-t)*c +
|
|
math_pow(t,3)*d )
|
|
end
|
|
|
|
-- BezierBy start
|
|
cc.BezierBy = cc.BezierBy or BaseClass(cc.ActionInterval)
|
|
|
|
--t为动作时间,c为控制点信息,比如 {end_pos={x=0,y=0},control_1={x=1,y=1},control_2={x=2,y=2}}
|
|
function cc.BezierBy:__init(t, c)
|
|
self:initWithDuration(t, c)
|
|
end
|
|
|
|
function cc.BezierBy:initWithDuration(t, c)
|
|
cc.ActionInterval.initWithDuration(self, t)
|
|
self._config = c
|
|
end
|
|
|
|
function cc.BezierBy:startWithTarget(target)
|
|
cc.ActionInterval.startWithTarget(self, target)
|
|
local x, y = cc.Wrapper.GetLocalPosition(self._target)
|
|
self._startPosition = {x=x, y = y}
|
|
self._previousPosition = {x=x, y = y}
|
|
end
|
|
|
|
function cc.BezierBy:clone()
|
|
return cc.BezierBy.New(self._duration, self._config)
|
|
end
|
|
|
|
function cc.BezierBy:update(time)
|
|
if (self._target) then
|
|
local xa = 0;
|
|
local xb = self._config.control_1.x;
|
|
local xc = self._config.control_2.x;
|
|
local xd = self._config.end_pos.x;
|
|
|
|
local ya = 0;
|
|
local yb = self._config.control_1.y;
|
|
local yc = self._config.control_2.y;
|
|
local yd = self._config.end_pos.y;
|
|
|
|
local x = cc.bezierat(xa, xb, xc, xd, time);
|
|
local y = cc.bezierat(ya, yb, yc, yd, time);
|
|
|
|
-- #if CC_ENABLE_STACKABLE_ACTIONS
|
|
-- Vec2 currentPos = _target->getPosition();
|
|
-- Vec2 diff = currentPos - _previousPosition;
|
|
-- _startPosition = _startPosition + diff;
|
|
|
|
-- Vec2 newPos = _startPosition + Vec2(x,y);
|
|
-- _target->setPosition(newPos);
|
|
|
|
-- _previousPosition = newPos;
|
|
-- #else
|
|
cc.Wrapper.SetLocalPosition(self._target, self._startPosition.x+x, self._startPosition.y+y)
|
|
-- #endif // !CC_ENABLE_STACKABLE_ACTIONS
|
|
end
|
|
end
|
|
|
|
function cc.BezierBy:reverse()
|
|
local r = {}
|
|
r.end_pos = {x=-self._config.end_pos.x, y=-self._config.end_pos.y}
|
|
r.control_1 = {x=0, y=0}
|
|
r.control_1.x = self._config.control_2.x - self._config.end_pos.x
|
|
r.control_1.y = self._config.control_2.y - self._config.end_pos.y
|
|
|
|
r.control_2 = {x=0, y=0}
|
|
r.control_2.x = self._config.control_1.x - self._config.end_pos.x
|
|
r.control_2.y = self._config.control_1.y - self._config.end_pos.y
|
|
|
|
return cc.BezierBy.New(self._duration, r)
|
|
end
|
|
|
|
-- BezierTo start
|
|
cc.BezierTo = cc.BezierTo or BaseClass(cc.BezierBy)
|
|
|
|
function cc.BezierTo:__init(t, c)
|
|
self:initWithDuration(t, c)
|
|
end
|
|
|
|
function cc.BezierTo:initWithDuration(t, c)
|
|
cc.ActionInterval.initWithDuration(self, t)
|
|
self._toConfig = c
|
|
end
|
|
|
|
function cc.BezierTo:clone()
|
|
return cc.BezierTo.New(self._duration, self._toConfig)
|
|
end
|
|
|
|
function cc.BezierTo:startWithTarget(target)
|
|
cc.BezierBy.startWithTarget(self, target)
|
|
self._config = {}
|
|
self._config.control_1 = {x=0,y=0}
|
|
self._config.control_1.x = self._toConfig.control_1.x - self._startPosition.x
|
|
self._config.control_1.y = self._toConfig.control_1.y - self._startPosition.y
|
|
self._config.control_2 = {x=0,y=0}
|
|
self._config.control_2.x = self._toConfig.control_2.x - self._startPosition.x
|
|
self._config.control_2.y = self._toConfig.control_2.y - self._startPosition.y
|
|
|
|
self._config.end_pos = {x=0,y=0}
|
|
self._config.end_pos.x = self._toConfig.end_pos.x - self._startPosition.x
|
|
self._config.end_pos.y = self._toConfig.end_pos.y - self._startPosition.y
|
|
end
|
|
|
|
function cc.BezierTo:reverse()
|
|
return nil
|
|
end
|
|
|
|
--DelayTime end
|
|
|
|
--cc.Animation
|
|
cc.Animation = cc.Animation or BaseClass(cc.ActionInterval)
|
|
|
|
function cc.Animation:__init(data,duration)
|
|
self:initWithAnimationData(data,duration)
|
|
end
|
|
|
|
function cc.Animation:initWithAnimationData( data,duration)
|
|
self.total_duration = 0
|
|
self.TotalDelayUnits = 0
|
|
self.cur_frame = 1
|
|
|
|
for i,v in ipairs(data) do
|
|
self.TotalDelayUnits = self.TotalDelayUnits + v.unit
|
|
end
|
|
self.total_duration = self.TotalDelayUnits * duration
|
|
self.splitTime = {}
|
|
local accumUnitsOfTime = 0
|
|
local newUnitOfTimeValue = self.total_duration / self.TotalDelayUnits
|
|
for i,v in ipairs(data) do
|
|
local value = (accumUnitsOfTime * newUnitOfTimeValue) / self.total_duration
|
|
accumUnitsOfTime = accumUnitsOfTime + v.unit
|
|
table.insert(self.splitTime,value)
|
|
end
|
|
cc.ActionInterval.initWithDuration(self, self.total_duration)
|
|
|
|
self.data = data
|
|
end
|
|
|
|
function cc.Animation:startWithTarget(target)
|
|
cc.ActionInterval.startWithTarget(self, target)
|
|
self.img = self._target:GetComponent("Image")
|
|
self.cur_frame = 1
|
|
end
|
|
|
|
function cc.Animation:update(t)
|
|
if self._target then
|
|
for i= self.cur_frame,#self.data do
|
|
if self.splitTime[i] <= t then
|
|
local index = i
|
|
if self.data[index].not_auto_size then
|
|
lua_resM:setImageSprite(self, self.img,self.data[index].ab, self.data[index].res,false)
|
|
else
|
|
lua_resM:setImageSprite(self, self.img,self.data[index].ab, self.data[index].res,true)
|
|
end
|
|
if self.data[index] and self.data[index].callback then
|
|
local callback = self.data[index].callback
|
|
callback()
|
|
end
|
|
self.cur_frame = i + 1
|
|
else
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function cc.Animation:reverse()
|
|
return nil
|
|
end
|