Quick_Cocos基础(三)

来源:互联网 发布:实况2016优化 编辑:程序博客网 时间:2024/06/16 20:18

前言

这个系列的前面几篇我不准备系统地讲,我们先写一写小例子,然后再从体系结构上来分析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,那需要不同频率的时候怎么办呢?
这里有一个问题,我们的分数不需要每帧都刷新一次,我们只要每秒刷新一次怎么办,看下面的代码:

MyScorefunction 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里面执行不同速率的函数了。

0 0