Quick_Cocos基础(三)

前言

这个系列的前面几篇我不准备系统地讲,我们先写一写小例子,然后再从体系结构上来分析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里面执行不同速率的函数了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值