LUA中测试鱼死亡动作、炸弹轨迹、炸弹爆炸动作

这篇博客介绍了如何在LUA中创建鱼类和炸弹对象,包括它们的创建、死亡动作、轨迹动画以及爆炸效果。通过函数如`Fish:moveWithParabola`实现曲线轨迹,`Fish:addPath`设置不同类型的路径,如直线、圆周、摆线等。同时,展示了如何使用`DieAnimation`函数进行死亡动画,以及如何捕获并销毁鱼和炸弹的逻辑。
摘要由CSDN通过智能技术生成

Fish.lua:

 

--[[
------------------------------------
一条鱼
------------------------------------
Ivan_han@2013/4/16 11:08:17
------------------------------------
]]

function CreateObj(pSpriteFrame)
    return CCSprite:createWithSpriteFrame(pSpriteFrame)
end

Fish = class("Fish", CreateObj)

Fish.__index = Fish
--Fish.isCatch = false
--Fish.fishType=1

CCLuaLog("Fish...................."..tostring(Fish.__index))

function Fish:spriteWithSpriteFrame(pSpriteFrame)
    local fish = Fish.new(pSpriteFrame)
    if (fish~=nil)then
    fish:autorelease()
          fish:retain()
 end
 return fish
end

function Fish:spriteWithSpriteFrameName(pszSpriteFrameName)
    if(pszSpriteFrameName == nil) then
        CCLuaLog("Fish.spriteWithSpriteFrameName.pszSpriteFrameName.Nil!")
        return nil
    end
    local pFrame = CCSpriteFrameCache:sharedSpriteFrameCache():spriteFrameByName(pszSpriteFrameName)
    if (pFrame~=nil)then
  return self:spriteWithSpriteFrame(pFrame)
 end
end

function Fish:randomCatch(level)
 local rnd = SIX_Utility:new():RNDNUM(0,9)
 if(rand >= level) then
        return true
    end
    return false
end


--[[
function Fish:getIsCatch()
    return isCatch
end

function Fish:setIsCatch(IsCatch)
    isCatch=IsCatch
end
]]

--[[
三阶贝塞尔曲线(P_0,P_1,P_2,P_3)退化为二阶贝塞尔曲线(P_0,P_1,P_2,即抛物线:起点P_0=控制点P_1,控制点P_2,终点P_3)
参数说明:
startP----轨迹起点
endP----轨迹终点
startAngle----
endAngle----
time----动画时长
]]
function Fish:moveWithParabola(startP,endP,startAngle,endAngle,time)
 local sx = startP.x;
 local sy = startP.y;
 local ex =endP.x;
 local ey =endP.y;

 local h = self:getContentSize().height * 0.5;
 local pos=CCPoint(sx,sy);
 self:setPosition(pos);
 self:setRotation(startAngle);

 -- 贝塞尔曲线
 local bezier=ccBezierConfig:new();
 -- 控制点1(起点)
 bezier.controlPoint_1 = ccp(sx, sy);
 -- 控制点2
 --bezier.controlPoint_2 = ccp(sx+(ex-sx)*0.5, sy+(ey-sy)*0.5);
 bezier.controlPoint_2 = ccp(sx+(ex-sx)*0.5, sy+(ey-sy)*0.5+100); 
 -- 终点
 bezier.endPosition = ccp(endP.x, endP.y);

 local actionMove = CCBezierTo:create(time, bezier);
 local actionRotate = CCRotateTo:create(time, endAngle);
 local action = CCSpawn:createWithTwoActions(actionMove, actionRotate);
 local pcc=CCCallFunc:create(function()
          self:removeFromParentAndCleanup(true)
    end)
 local sq = CCSequence:createWithTwoActions(action,pcc); 
 self:runAction(sq);
end

function CircleTrace(t)
          --圆中心为(350,300),半径为150,轨迹起点为(500,300)的逆时针圆轨迹
          local x=150*math.cos(2*math.pi*t)
          local y=150*math.sin(2*math.pi*t)
          return ccp(350+x,300+y)
end

function EllipseTrace(t)
          --椭圆中心为(350,300),长半径为150,短半径为120,轨迹起点为(500,300),焦点F_1为(260,300),焦点F_2为(440,300)的逆时针椭圆轨迹
          local C=ccp(350,300)
          local a=150
          local b=120
          local c=90
          local x=a*math.cos(2*math.pi*t)
          local y=b*math.sin(2*math.pi*t)
          return ccp(C.x+x,C.y+y)
end

function SinTrace(t)
          --轨迹起点为(500,300),振幅为150的正弦曲线轨迹
          local C=ccp(350,300)
          local a=150
          local x=a*2*math.pi*t
          local y=a*math.sin(2*math.pi*t)
          return ccp(C.x+x,C.y+y)
end

--[[
获得圆上点的坐标
参数说明:
startP--轨迹起点坐标
centerP--圆心坐标
deltArg--相对于轨迹起点的辐角主值增量 
]]
function GetCirclePos(startP,centerP,deltArg)
          local startarg=math.atan2(startP.y-centerP.y,startP.x-centerP.x);--轨迹起点相对于圆心的辐角主值
          local tempx=(startP.x-centerP.x)*(startP.x-centerP.x);
    local tempy=(startP.y-centerP.y)*(startP.y-centerP.y);
    local r=math.sqrt(tempx+tempy);--圆的半径
          local x=r*math.cos(startarg+deltArg)--圆上点相对于圆心的X坐标偏移
          local y=r*math.sin(startarg+deltArg)--圆上点相对于圆心的Y坐标偏移
          return ccp(centerP.x+x,centerP.y+y)
end

--[[
圆轨迹
参数说明:
t----轨迹参数方程中的参数
startP----轨迹起点坐标
centerP----圆心坐标
direction----取值浮点数,表示圈数,正、负圈数分别表示逆、顺时针旋转
]]
--function CircleTraceFunc(t,startP,centerP,direction)
function CircleTraceFunc(t,startPx,startPy,centerPx,centerPy,direction)
          local startP=ccp(startPx,startPy)
          local centerP=ccp(centerPx,centerPy)
          --圆中心为centerP,半径为r,轨迹起点为startP的direction弧度圆轨迹
          local startarg=math.atan2(startP.y-centerP.y,startP.x-centerP.x);--轨迹起点相对于圆心的辐角主值
         

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值