quick-cocos2dx 实例 ------ nightclub

--[[
    今天开始学习第一个sample: NightClub。
    这个示例看似简单,实际用到了quick的很多功能,
    如:音频、Tiles地图、touch事件、批次渲染、动画、动作等

    下面开始着手逐行抄写分析MainScene.lua
]]

--[[
    首先,定义一个新的场景类,类名是“MainScene”。
    而对于何时实例化这个类,则是由AppBase的enterScene完成,
    所以我们不用关心在哪调用new函数,只需要在使用时调用app:enterScene("场景名")
]]
local MainScene = class("MainScene", function()
        return display.newScene("MainScene")
    end)

-- 构造函数
function MainScene:ctor()
    -- 地图, 用bgTitle.png瓦片拼接而成
    local ground = display.newTilesSprite("bgTile.png");
    self:addChild(ground);

    -- 触摸层。
    self.touchLayer = display.newLayer();
    self:addChild(self.touchLayer)

    -- 舞台批渲染节点
    self.stageNode = display.newBatchNode("stage.png", 100)
    self:addChild(self.stageNode)

    -- player批处理渲染节点
    self.playerNode = display.newBatchNode("player.png",  100000)
    self:addChild(self.playerNode)
    self.resIds = {
        "player_f0006","player_f0015","player_f0016","player_f0018","player_f0021",
        "player_f0025","player_f0026","player_f0032","player_f0033","player_f0037",
        "player_f0038","player_f0046","player_f0057","player_f0067","player_f0068",
        "player_f0069","player_f0070","player_f0073","player_f0208","player_f0209",
    }

    -- 动画名字及动画帧数
    self.actionNames = {"dance_a_1", "dance_a_2", "stand_1", "stand_2", "walk_1", "walk_2"}
    self.actionNums = {8, 8, 4, 4, 8, 8}   

    -- 存储创建出的对象
    self.objs = {}

end

--[[
    创建单个对象
    @param resId
    @param actionId
    @param x
    @param y
    @param isFixed
]]
function MainScene:genObject(resId, actionId, x, y, isFixed)
    -- 创建帧序列
    local frames = display.newFrames(resId .. "_" .. self.actionNames[actionId] .."_%02d.png", 1, self.actionNums[actionId])
    local sprite = display.newSprite(frames[1], x, y)

    -- 一定概率水平翻转(朝向)
    if math.random(1, 2) == 1 then
        sprite:setFlipX(true)
    end
    if isFixed == nil then
        self.objs[#self.objs + 1] = sprite
    end
    -- 添加到player批渲染结点
    self.playerNode:addChild(sprite);
    -- 创建动画
    local animation = display.newAnimation(frames, math.random(1, 2) / 15)
    -- 播放动画
    sprite:playAnimationForever(animation)
end

--[[
    创建players
    @param num:个数
]]
function MainScene:genObjects(num)
    for i = 1, num do
        local rand1 = math.random(1, #self.resIds)
        local actId = math.random(1, #self.actionNames)

        local x = math.random(15, display.width - 15)
        local y = math.random(120, display.height - 75)

        self:genObject(self.resIds[rand1], actId, x, y)
    end
end

--[[
创建舞台
@param x
@param y
]]
function MainScene:genStageObject(x, y)
    local frames = display.newFrames("bg%02d.png", 1, 4);
    local sprite = display.newSprite(frames[1], x, y)
    self.stageNode:addChild(sprite);
    local animation = display.newAnimation(frames, math.random(1, 2) / 10)
    sprite:playAnimationForever(animation)
end

--[[
创建舞台+舞台上的player
]]
function MainScene:genInitObjects()
    local ofstX = 58
    local ofstY = 112
    for i = 0, 8 do
        self:genStageObject(ofstX + i * 105, ofstY)
        local rand1 = math.random(1, #self.resIds)
        self:genObject(self.resIds[rand1], 1, ofstX + i * 105, ofstY - 15, true)
    end
end

--[[
touch事件处理函数
@param event
@param x
@param y
]]
function MainScene:onTouch(event, x, y)
    print (event)
    if("began" == event) then
        return true
    end
end

--[[
进入场景
]]
function MainScene:onEnter()
   -- 播放背景音乐
        audio.playMusic("sound/newdali.mp3", true)
        -- 加载plist
        display.addSpriteFramesWithFile("stage.plist", "stage.png")
        display.addSpriteFramesWithFile("player.plist", "player.png")
        -- 创建object
        self:genInitObjects()
        self:genObjects(91)
        
        -- 注册touch事件处理函数
        -- 单点触摸
        self.touchLayer:addTouchEventListener(function(event, x, y)
            return self:onTouch(event, x, y)
        end)
        self.touchLayer:setTouchEnabled(true)
  
end

return MainScene

你可能感兴趣的:(lua,cocos2dx,quick-lua,nightclub)