第一次写教程多多包涵
这里有两个要点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
```
**
