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