《切水果》02-水果发射器

第一次写教程多多包涵

这里有两个要点1、关卡数据如果让每一轮出现什么水果,出现几个是可控的 2、如何服用对象,避免过多的销毁创建对讲造成回收不及时或者内存泄露
针对第一个问题我们把关卡数据用一个数组存起来,然后在循环中去读取关卡数据,把相应的水果抛出。
针对第二个问题我们可以设计一个备用池(等待抛出的水果) 一个飞行池(飞行中的水果)。当需要抛出水果时,就把水果对象放入飞行池(在心跳函数中遍历飞行池实现飞行动画)。当切中水果或者水果落到底部(回收对象到备用池) 具体看代码实现
效果如下图:

local FruitItem=require("app.ui.FruitItem")
local Emitter=class("Emitter",function()
    return display.newNode()
end)
local math=math
local display=display
local table=table
local pairs=pairs
local print=print
local app=app
-----关卡数据
local levelList={{1,2},{2,3,4},{5,6,1,2},{3,4,5,6,99},{2,3,4,99,5},{99,1,2,4,99},{3,4,5,1,99},{1,2,3,5,6},{2,1,99,6,4,99},{2,99,3,99,4},{2,3,4,6,99},{1,99,3,99,2,99},{1,3,99,4,5},{1,2,3,4,99,6},{1,2,3,4,5,99},{3,1,2,4,99,6},{3,2,1,4,99,5},{99,3,6,1,3,4},{99,2,3,6,5,99},{99,3,99,1,2,99},{99,2,4,5,4,99},{2,99,1,6,5,3},{4,3,2,99,1},{2,99,5,6,99},{6,3,1,99,4,5}};
-------重力加速度
local _g=1

function Emitter:ctor()
    self.itemPool={}
    self.flyPool={}
    self._levelIndex=1
    self._isGameOver=false
    self._passTime=0
    local item=nil
    for i=1,50 do 
        item=FruitItem.new(true)
        item:retain()
        self.itemPool*=item
    end
    self:setNodeEventEnabled(true)
    self:addNodeEventListener(cc.NODE_EVENT,function(event)
        if(event.name=="exit")then
            self:unscheduleUpdate()
            self.itemPool=nil
            self.flyPool=nil
        end
    end)
end
----------------------------移到飞行池
function Emitter:_addToFly(item,typevalue,delay)
    if(item==nil)then return end
    local rnd=math.random()*2-1
    if(typevalue>0)then
        item:setItemType(typevalue)
    end
    item:setRotation(0)
    item:setVisible(true)
    item.isDie=false
    item.delayMiniSec=delay
    item.angle=rnd*180/5
    item:setRotation(item.angle)
    item:pos(display.width*0.5*(1+rnd),-150)
    item.vx=(display.width*0.5-item:getPositionX())/30
    item.vy=math.sqrt(2*_g*display.height)
    item.vangle=rnd/10*180/math.pi
    self:addChild(item)
    table.insert(self.flyPool,item)
end
----------------------------移到缓存池
function Emitter:addToPool(item)
    if(item==nil)then return end
    local index=table.indexof(self.flyPool,item)
    if(index==false)then
        return
    end
    table.remove(self.flyPool,index)
    if(item.canSplit==false)then
        item:removeFromParent(true)
        return
    end
    item.isDie=false
    item:setVisible(false)
    table.insert(self.itemPool,item)
    item:removeFromParent(false)
end
--------------------------------水果抛出
function Emitter:_throwFruit(miniSec)
    if(self._isGameOver==true or miniSec*1000==0)then return end
    if(self._passTime>=50+(self._levelIndex-1)*3000)then
        local typeList=levelList
        local num=#typeList
        local item=nil
        local delay=math.floor(3*60*0.7/num)
        for i=1,num do
            item=table.remove(self.itemPool)
            self:_addToFly(item,typeList*,delay*i)
        end
        self._levelIndex=self._levelIndex+1
        if(self._levelIndex>=#levelList)then
            self._levelIndex=9
            self._passTime=3000*(self._levelIndex-1)+50
            return
        end
    end
    self._passTime=self._passTime+miniSec*1000
end
------------------------心跳
function Emitter:onEnterFrame(dt)
    self:_throwFruit(dt)
    local xpos,ypos,rotate=0,0,0
    for k,v in pairs(self.flyPool) do
        if(v.canSplit==true and v.delayMiniSec==0)then
--            app:playSoundEffect("sound/throw.mp3")
        end
        v.delayMiniSec=v.delayMiniSec-1
        if(v.delayMiniSec<=0)then
            v.vy=v.vy-_g
            xpos=v:getPositionX()+v.vx
            ypos=v:getPositionY()+v.vy
            rotate=v:getRotation()+v.vangle
            v:pos(xpos,ypos)
            v:setRotation(rotate)
            if(v.vy<=0 and v:getPositionY()<=-150)then
                self:addToPool(v)
            end
        end
    end
end
-----------------------切中
function Emitter:doHit(item,bladeAngle)
    if(item.typeID==99)then
        return
    end
    local numSin=math.sin(bladeAngle)
    local numCos=math.cos(bladeAngle)
    local part1 = FruitItem.new(false)
    local degree=bladeAngle*180/math.pi
    part1:setSpliceType(item.typeID,1)
    part1:pos(item:getPositionX(),item:getPositionY())
    part1:setRotation(degree)
    part1.vx = numSin*10
    part1.vx= part1.vx+((part1.vx>=0 and 3) or -3)
    part1.vy = numSin*10
    part1.vangle = numSin*.2
    part1.vangle=part1.vangle+((part1.vangle>=0 and 0.1) or -0.1)
    part1.vangle= part1.vangle*180/math.pi
    ---------------------------------------part2---------------------
    local part2 = FruitItem.new(false)
    part2:setSpliceType(item.typeID,2)
    part2:pos(item:getPositionX(),item:getPositionY())
    part2:setRotation(degree)
    --Math.cos(Math.PI-bladeAngle)*10
    part2.vx =-part1.vx
    part2.vy = numCos*10
    --Math.cos(bladeAngle)*.2
    part2.vangle = -part1.vangle
    self:addChild(part1)
    self:addChild(part2)
    table.insert(self.flyPool,part1)
    table.insert(self.flyPool,part2)
    self:addToPool(item)
end


return Emitter


```
**