前言
这个系列的前面几篇我不准备系统地讲,我们先写一写小例子,然后再从体系结构上来分析cocos lua
自动滚动地图
我们新建一个场景,把它作为游戏的主场景。
local MainScene = class("MainScene", function()
return display.newScene("MainScene")
end)
function MainScene:ctor()
-- 在层上创建场景
self.bgLayer=display.newLayer()
self.bgLayer:setAnchorPoint(0.5,0)
self.bgLayer:setPosition(display.cx,0)
self:addChild(self.bgLayer,0)
-- 我们添加两张相同的图片,这样就可以无限滚动了
self.bgSp1=display.newSprite("#background.png")
self.bgSp1:setAnchorPoint(0.5,0)
self.bgSp1:setPosition(display.cx,0)
self:addChild(self.bgSp1,1)
self.bgSp2=display.newSprite("#background.png")
self.bgSp2:setAnchorPoint(0.5,0)
self.bgSp2:setPosition(display.cx,2*display.cy)
self:addChild(self.bgSp2,1)
-- attention!下面的结构很重要
self:schedule(function()
-- 匿名函数体...
end,1/global_fps)
end
设定样式的代码我们暂且不表,如果你不能理解两张图片可以无限循环的原理,拿出两张纸,自己试试就知道了。
scheduler
接下来我们说一说整个cocos引擎的灵魂部分,scheduler–定时器(也叫调度器什么的)
scheduler是这样一种东西,形象地说,它是一张时刻表,上面记录了什么时刻应该执行什么函数,然后把这张表加入主循环,主循环在对应时刻就会调用函数。scheduler和线程不同,是一种非并行的结构,然而在很多时候,它能够模拟出多线程的效果。但是注意一点,scheduler不能频繁使用,最好的情况下,一个场景,只需要一个scheduler。
语法:Node:schedule(lambda函数体,执行间隔)
比如在上文中的自动滚动地图,我们这样调用它
-- ...
self:schedule(function()
self:bgAutoMove()
end,1/global_fps)
function MainScene:bgAutoMove()
local disHeight=display.height
local poy1=self.bgSp1:getPositionY()
-- 图片的纵坐标-4,取余是为了让它大于屏幕高度就移到上面
poy1=(poy1-4)%disHeight
-- 图片2的坐标是根据图片1计算出来的,最后的+1是为了避免黑边
local poy2=poy1-disHeight+1
self.bgSp1:setPositionY(poy1)
self.bgSp2:setPositionY(poy2)
end
此处的global_fps是一个全局常值变量,意思是这个游戏的fps值,一般我们设置为60
上面的代码解释下来就是每帧,图片1向下一移动4像素,超过高度就把它移到上面去
不同速率的scheduler
我刚刚说了我们的一个场景只要一个scheduler,那需要不同频率的时候怎么办呢?
这里有一个问题,我们的分数不需要每帧都刷新一次,我们只要每秒刷新一次怎么办,看下面的代码:
MyScore
function MainScene:ctor()
-- ...
-- 我们先创建一个文字控件来储存分数
MyScore=0
self.la=cc.ui.UILabel.new({
text="score: ",
size=40
})
self.la:addTo(self,100)
self.la:setPosition(cc.p(display.cx,display.height-100))
self.la:setAnchorPoint(0.5,0.5)
-- 我们创建一个scheduler来刷新分数
self.count=0
self:schedule(function()
-- ...
if count==59 then
self.la:setString("score: "..MyScore)
end
self.count=(self.count+1)%60
end,1/global_fps)
end
我们利用一个count,让它每60次再执行一次,这样就可以在一个scheduler里面执行不同速率的函数了。