您的位置:首页 > 编程语言 > Lua

Lua_顺序动作、组合动作、重复动作、永远重复动作和反向动作

2015-04-28 00:25 225 查看
require "Cocos2d"
require "Cocos2dConstants"

-- for CCLuaEngine traceback
function __G__TRACKBACK__(msg)
    cclog("----------------------------------------")
    cclog("LUA ERROR: " .. tostring(msg) .. "\n")
    cclog(debug.traceback())
    cclog("----------------------------------------")
    return msg
end

local function main()
    collectgarbage("collect")
    --避免内存泄漏
    collectgarbage("setpause", 100)
    collectgarbage("setstepmul", 5000)
    
    --初始化导演
    local director = cc.Director:getInstance()
    local glview = director:getOpenGLView()
    if glview == nil then
        glview = cc.GLView:createWithRect("HelloLua", cc.rect(0, 0, 960, 640))
        director:setOpenGLView(glview)
    end

    glview:setDesignResolutionSize(960, 640, cc.ResolutionPolicy.SHOW_ALL)

    --显示帧率
    director:setDisplayStats(true)

    --设置帧率
    director:setAnimationInterval(1.0 / 60)

    --增加搜索路径
    cc.FileUtils:getInstance():addSearchPath("src")
    cc.FileUtils:getInstance():addSearchPath("res")
    
    --创建场景
    local scene = require("GameScene")
    local settingScene = scene.create()
    
    --运行场景
    if cc.Director:getInstance():getRunningScene() then
        cc.Director:getInstance():replaceScene(settingScene)
    else
        cc.Director:getInstance():runWithScene(settingScene)
    end
end

xpcall(main, __G__TRACKBACK__)
require "Cocos2d"
require "Cocos2dConstants"

-- 定义常量
kSequence             = 102
kSpawn                = 103
kRepeate              = 104
kRepeatForever1       = 105
kReverse              = 106

local size = cc.Director:getInstance():getWinSize()

local debug = true
cclog = function(...)
    if debug then
        print(string.format(...))
    end
end

local GameScene = class("GameScene",function()
    local scene = cc.Scene:createWithPhysics()
    scene:getPhysicsWorld():setDebugDrawMask(cc.PhysicsWorld.DEBUGDRAW_ALL)
    return scene
end)

function GameScene:ctor()
    self.visibleSize = cc.Director:getInstance():getVisibleSize()
    self.origin = cc.Director:getInstance():getVisibleOrigin()
end

function GameScene.create()
    local scene = GameScene.new()
    scene:addChild(scene:createAction())

    return scene
end

function GameScene:createAction()
    local layer = cc.Layer:create()

    local bg = cc.Sprite:create("Background.png")
    bg:setPosition(cc.p(size.width/2,
        size.height/2))
    layer:addChild(bg)

    local function OnClickMenu(tag, menuItemSender)
        cclog("tag = %d", tag)
        actionFlag = menuItemSender:getTag()

        local scene = require("ActionScene")
        local nextScene = scene.create()
        local ts = cc.TransitionJumpZoom:create(1, nextScene)
        cc.Director:getInstance():pushScene(ts)

    end

    local pItmLabel1 =  cc.Label:createWithBMFont("fonts/fnt2.fnt","Sequence")
    local pItmMenu1 = cc.MenuItemLabel:create(pItmLabel1)
    pItmMenu1:setTag(kSequence)
    pItmMenu1:registerScriptTapHandler(OnClickMenu)

    local pItmLabel2 = cc.Label:createWithBMFont("fonts/fnt2.fnt", "Spawn")
    local pItmMenu2 = cc.MenuItemLabel:create(pItmLabel2)
    pItmMenu2:setTag(kSpawn)
    pItmMenu2:registerScriptTapHandler(OnClickMenu)

    local pItmLabel3 = cc.Label:createWithBMFont("fonts/fnt2.fnt", "Repeate")
    local pItmMenu3 = cc.MenuItemLabel:create(pItmLabel3)
    pItmMenu3:setTag(kRepeate)
    pItmMenu3:registerScriptTapHandler(OnClickMenu)

    local pItmLabel4 = cc.Label:createWithBMFont("fonts/fnt2.fnt", "RepeatForever")
    local pItmMenu4 = cc.MenuItemLabel:create(pItmLabel4)
    pItmMenu4:setTag(kRepeatForever1)
    pItmMenu4:registerScriptTapHandler(OnClickMenu)

    local pItmLabel5 = cc.Label:createWithBMFont("fonts/fnt2.fnt", "Reverse")
    local pItmMenu5 = cc.MenuItemLabel:create(pItmLabel5)
    pItmMenu5:setTag(kReverse)
    pItmMenu5:registerScriptTapHandler(OnClickMenu)

    local menu = cc.Menu:create(pItmMenu1,pItmMenu2,pItmMenu3,pItmMenu4,pItmMenu5)
    menu:alignItemsVerticallyWithPadding(50)
    layer:addChild(menu)

    return layer
end

return GameScene
<pre name="code" class="cpp">require "Cocos2d"
require "Cocos2dConstants"

local size = cc.Director:getInstance():getWinSize()

local HIDE_TAG = true

local isPlaying = false

local plane

local ActionScene = class("ActionScene",function()
    return cc.Scene:create()
end)

function ActionScene:ctor()
    cclog("ActionScene init")
end

function ActionScene.create()
    local scene = ActionScene.new()
    scene:addChild(scene:createLayer())
    return scene
end

function ActionScene:createLayer()
    --顺序动作、组合动作、重复动作、永远重复动作和反向动作
    cclog("ActionScene actionFlag = %d", actionFlag)
    local layer = cc.Layer:create()

    local bg = cc.Sprite:create("Background.png")
    bg:setPosition(cc.p(size.width/2, size.height/2))
    layer:addChild(bg)

    plane = cc.Sprite:create("hero.png")
    plane:setPosition(cc.p(size.width / 2, size.height / 2))
    layer:addChild(plane)

    local backMenuItem = cc.MenuItemImage:create("Back-up.png","Back-down.png")
    backMenuItem:setPosition(cc.Director:getInstance():convertToGL(cc.p(140, 65)))

    local goMenuItem = cc.MenuItemImage:create("Go-up.png","Go-down.png")
    goMenuItem:setPosition(cc.Director:getInstance():convertToGL(cc.p(820, 540)))

    local menu = cc.Menu:create(backMenuItem, goMenuItem)
    menu:setPosition(cc.p(0, 0))
    layer:addChild(menu)

    local function backMenu(pSender)
        cclog("ActionScene backMenu")
        cc.Director:getInstance():popScene()
    end
    backMenuItem:registerScriptTapHandler(backMenu)

    local function goMenu(pSender)
        cclog("ActionScene goMenu")

        if actionFlag == kSequence then
            self:OnSequence(pSender)
        elseif actionFlag == kSpawn then
            self:OnSpawn(pSender)
        elseif actionFlag == kRepeate then
            self:OnRepeat(pSender)
        elseif actionFlag == kRepeatForever1 then
            self:OnRepeatForever(pSender)
        elseif actionFlag == kReverse then
            self:OnReverse(pSender)
        end
    end
    goMenuItem:registerScriptTapHandler(goMenu)

    return layer
end

function ActionScene:OnSequence(pSender)
    cclog("ActionScene OnSequence")

    local p = cc.p(size.width/2, 200)

    local ac0 = cc.Place:create(p)
    local ac1 = cc.MoveTo:create(2,cc.p(size.width - 130, size.height - 200))
    local ac2 = cc.JumpBy:create(2, cc.p(8, 8),6, 3)
    local ac3 = cc.Blink:create(2,3)
    local ac4 = cc.TintBy:create(0.5,0,255,255)

    plane:runAction(cc.Sequence:create(ac0, ac1, ac2, ac3, ac4, ac0))
end

function ActionScene:OnSpawn(pSender)
    cclog("ActionScene OnSpawn")

    local p = cc.p(size.width/2, 200)

    plane:setRotation(0)
    plane:setPosition(p)

    local ac1 = cc.MoveTo:create(2,cc.p(size.width - 100, size.height - 100))
    local ac2 = cc.RotateTo:create(2, 40)

    plane:runAction(cc.Spawn:create(ac1,ac2))
end

function ActionScene:OnRepeat(pSender)
    cclog("ActionScene OnRepeat")

    local p = cc.p(size.width/2, 200)

    plane:setRotation(0)
    plane:setPosition(p)

    local ac1 = cc.MoveTo:create(2,cc.p(size.width - 100, size.height - 100))
    local ac2 = cc.JumpBy:create(2,cc.p(10, 10), 20,5)
    local ac3 = cc.JumpBy:create(2,cc.p(-10, -10),20,3)

    local seq = cc.Sequence:create(ac1, ac2, ac3)

    plane:runAction(cc.Repeat:create(seq,3))
end

function ActionScene:OnRepeatForever(pSender)
    cclog("ActionScene OnRepeatForever")

    local p = cc.p(size.width/2, 500)

    plane:setRotation(0)
    plane:setPosition(p)

    local bezier = {
        cc.p(0, size.height / 2),
        cc.p(10, - size.height / 2),
        cc.p(10,20)
    }
    local ac1 = cc.BezierBy:create(2,bezier)
    local ac2 = cc.TintBy:create(0.5, 0, 255, 255)
    local ac1Reverse = ac1:reverse()
    local ac2Repeat = cc.Repeat:create(ac2, 4)

    local ac3 = cc.Spawn:create(ac1,ac2Repeat)
    local ac4 = cc.Spawn:create(ac1Reverse,ac2Repeat)
    local seq = cc.Sequence:create(ac3, ac4)

    plane:runAction(cc.RepeatForever:create(seq))
end

function ActionScene:OnReverse(pSender)
    cclog("ActionScene OnReverse")

    local p = cc.p(size.width/2, 300)

    plane:setRotation(0)
    plane:setPosition(p)

    local ac1 = cc.MoveBy:create(2,cc.p(40, 60))
    local ac2 = ac1:reverse()
    local seq = cc.Sequence:create(ac1, ac2)

    plane:runAction(cc.Repeat:create(seq,2))
end

return ActionScene



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: