</pre>场景只用了一个MainScene,游戏的界面转换都是在层上实现的。<p></p><p></p><p>MainScene的内容:纯色背景一个:<span style="white-space:pre"> </span></p><pre name="code" class="html"> display.newColorLayer(cc.c4b(225,225,225,225))
:addTo(self,-1)
然后有一个层放置文字,标签等ui
self.backLayer = --display.newColorLayer(cc.c4b(225,225,225,225))
display.newLayer()
<span style="white-space:pre"> </span>:addTo(self,1)
<span style="white-space:pre"> </span>--self.backLayer:setTouchEnabled(true)
<span style="white-space:pre"> </span>self.level = 1;
cc.ui.UILabel.new({
UILabelType = 2, text = "见缝插针", size = 64})
:align(display.CENTER, display.cx, display.height-150)
:addTo(self.backLayer)
self.start_bt = cc.ui.UIPushButton.new("frame.jpg")
<span style="white-space:pre"> </span>:setButtonLabel(cc.ui.UILabel.new({text = "关卡"..self.level,size = 32}))
<span style="white-space:pre"> </span>:onButtonClicked(function ()
<span style="white-space:pre"> </span>print("1")
self.gameLayer = GameLayer.new():addTo(self)--切换到游戏层
self.backLayer:removeFromParent()--把ui组件所在的层都移除
<span style="white-space:pre"> </span>end)
<span style="white-space:pre"> </span>:align(display.CENTER, display.cx, display.height*2/3-40)
<span style="white-space:pre"> </span>:addTo(self.backLayer)
uiPushButton的onButtonClicked函数来实现界面跳转
接下来就跳转到Gamelayer里了,这个就是游戏界面了,实现:首先用一个节点来放置需要转动的大球和小球,然后通过帧定时器让他们转动;另外这个层是可触摸的,点击屏幕则将小球添加到转动的节点上,并且将下方按序排列的待插入的小球整体上移。具体代码:
首先初始化函数实现两个功能:一个是触摸事件监听,一个是设置不同关卡的参数
self.levelTable = {
[1] = {name ="第一关" , angle = 7 , startnum = 1 , waitnum = 10} ,
[2] = {name ="第二关" , angle = 3 , startnum = 2 , waitnum = 10},
[3] = {name ="第三关" , angle = 3.5, startnum = 3 , waitnum = 10},
[4] = {name ="第四关" , angle = 3.5 , startnum = 4 , waitnum = 10} ,
[5] = {name ="第五关" , angle = 3.5 , startnum = 4 , waitnum = 10} ,
[6] = {name ="第六关" , angle = 4 , startnum = 5 , waitnum = 10} ,
[7] = {name ="第七关" , angle = 4 , startnum = 5 , waitnum = 10} ,
[8] = {name ="第八关" , angle = 4.5, startnum = 6 , waitnum = 10}
}
self:addNodeEventListener(cc.NODE_TOUCH_EVENT,function ()
print("add Small boal")
self:addBoal()
end) --添加触摸事件监听(为什么touchnabale不在这里写呢,因为当从结果界面跳回游戏界面时,要从不可触摸改为可触摸,此时是不执行ctor的所以不在这里实现是否可触摸的设置)
self:onStart(1) --游戏初始化函数
然后是进入onstart函数,这个函数里实现了:首先生成空节点,用于把需要转动的元素都添加上来,实现转动,这个节点上有一个大球,以及游戏开始时就有的小球;设置可触摸;设置定时器(实现转动)
<span style="white-space:pre">function GameLayer:onStart(level)</span> --传入进入游戏时的关卡数
<span style="white-space: pre;"> </span>self.level = level
self.addboal_ ={} --已填加到转动节点的小球
self.waitboal_ ={} --待添加的小球
if self.turnNode then --当从结果界面切回游戏界面时,需要将转动节点的内容清空
--self.turnNode:removeFromParent() --在callback里已经移除了:self:removeAllChildren()
self.turnNode = nil
end
self.turnNode = display.newNode() --转动节点
:align(display.CENTER,display.cx, display.height*2/3+30)
:addTo(self)
--旋转角度
self.angle =self.levelTable[self.level].angle
--当前转过的角度
self.turnangle=0
--初始化小球数
self.startnum = self.levelTable[self.level].startnum
self.waitnum = self.levelTable[self.level].waitnum
local bigboal = display.newSprite("boal1.png")
:addTo(self.turnNode)
print("大球位置:",bigboal:getPosition())
local R = 150 +48
for i =1 ,self.startnum do
--计算初始化的小球平均分配
local x = math.sin(math.rad(360/self.startnum*(i-1)))*R
local y = math.cos(math.rad(360/self.startnum*(i-1)))*R
local smboal = display.newSprite("s.png")
:pos(x, y)
:addTo(self.turnNode)
self.addboal_[smboal]= smboal
dump(self.addboal_)
end
for i =1 ,self.waitnum do --待插入的小球
local x = display.cx
local y = display.height/2-100-60*i
local smboal = display.newSprite("s.png")
:pos(x,y)
:addTo(self)
<pre name="code" class="html"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"> </span>--添加待插入小球上的数字</span>
local num = cc.ui.UILabel.new({text = self.waitnum-i+1,size= 30}):addTo(smboal)
num:setPosition(-num:getContentSize().width/2+smboal:getContentSize().width/2,smboal:getContentSize().height/2)self.waitboal_[self.waitnum-i+1] = smboalend---设置可触摸self:setTouchEnabled(true)--设置定时器,需要在最开头添加 local scheduler = require(cc.PACKAGE_NAME .. ".scheduler")if self.timer thenscheduler.unscheduleGlobal(self.timer) ---停止上一关游戏时的定时器self.timer = nilendself.timer = scheduler.scheduleGlobal(function() 每0.05秒执行一次self:update()函数self:update() end,0.05)
end
接下来实现update函数
function GameLayer:update()
if self.waitnum <= 0 then
scheduler.unscheduleGlobal(self.timer)
self:setTouchEnabled(false)
local param = {} ---传入结果界面需要的参数,是否成功,当前关卡,以及当从结果界面切回时调用的函数
param.success = 1
param.level = self.level
param.callback = handler(self, self.callback)
local gameWin = gameWin.new(param) --切入结果界面
cc.Director:getInstance():getRunningScene():addChild(gameWin, 120)
return
end
self.turnNode:rotateBy(0,self.angle) --旋转大球和小球
self.turnangle = math.mod(self.turnangle+self.angle,360)
end
实现触摸响应的函数
function GameLayer:addBoal()
if self.waitnum <= 0 then
-- scheduler.unscheduleGlobal(self.timer)
self:setTouchEnabled(false)
return
end
local x = math.sin(math.rad(self.turnangle )) * 200
local y = math.cos(math.rad(self.turnangle + 180)) * 200
local smboal = display.newSprite("s.png")
:pos(x , y)
:addTo(self.turnNode)
--判断是否碰撞
for k,p in pairs(self.addboal_) do
local dx = p:getPositionX()-smboal:getPositionX()
local dy = p:getPositionY()-smboal:getPositionY()
local dist = math.sqrt(dx*dx+dy*dy)
if dist<48 then
--失败处理
print("gameover")
scheduler.unscheduleGlobal(self.timer)
local param = {}
param.success = 0
param.level = self.level
param.callback = handler(self, self.callback)
local gameWin = gameWin.new(param)
cc.Director:getInstance():getRunningScene():addChild(gameWin, 120)
end
end
self.addboal_[smboal] = smboal
self.waitboal_[self.waitnum]:removeFromParent()
self.waitboal_[self.waitnum]=nil
self.waitnum= self.waitnum-1
for i =1 ,self.waitnum do
local x = display.cx
local y = display.height/2-100-60*i
self.waitboal_[self.waitnum-i+1]:setPosition(x,y)
end
print(self.waitnum)
end
结果层实现:
local gameWin = class("gameWin", function ( )
return display.newColorLayer(cc.c4b(225, 225, 225, 225))
end)
function gameWin:ctor(param)
self.success = param.success
self.callback = param.callback
self.level = param.level
local text1 = "text"
local text2 = "text"
if self.success ==1 then
text1 = "YOU WIN !!!"
text2 = "下一关"
self.level = self.level +1
else
text1 = "YOU LOSE !!!"
text2 = "重玩本关"
end
cc.ui.UILabel.new({
UILabelType = 2, text = text1, size = 64})
:align(display.CENTER, display.cx, display.height-150)
:addTo(self)
self.start_bt = cc.ui.UIPushButton.new("frame.jpg")
:setButtonLabel(cc.ui.UILabel.new({UILableType = 2 ,text = text2,size = 32}))
:onButtonClicked(handler(self, self.btnCallBack))
:align(display.CENTER, display.cx, display.height*2/3-40)
:addTo(self)
--self.start_bt:setButtonLabel(cc.ui.UILabel.new({
-- UILabelType = 2, text = "下一关", size = 30 }))
end
function gameWin:btnCallBack()
self.callback(self.level)
self:removeFromParent()
end