cocos场景管理器-自己用
2016-06-22 13:15
337 查看
SceneManager = SceneManager or BaseClass()
SceneManager.SCENE_TRANSITIONS = {
CROSSFADE = {cc.TransitionCrossFade, 2},
FADE = {cc.TransitionFade, 3, cc.c3b(0, 0, 0)},
FADEBL = {cc.TransitionFadeBL, 2},
FADEDOWN = {cc.TransitionFadeDown, 2},
FADETR = {cc.TransitionFadeTR, 2},
FADEUP = {cc.TransitionFadeUp, 2},
FLIPANGULAR = {cc.TransitionFlipAngular, 3, cc.TRANSITION_ORIENTATION_LEFT_OVER},
FLIPX = {cc.TransitionFlipX, 3, cc.TRANSITION_ORIENTATION_LEFT_OVER},
FLIPY = {cc.TransitionFlipY, 3, cc.TRANSITION_ORIENTATION_UP_OVER},
JUMPZOOM = {cc.TransitionJumpZoom, 2},
MOVEINB = {cc.TransitionMoveInB, 2},
MOVEINL = {cc.TransitionMoveInL, 2},
MOVEINR = {cc.TransitionMoveInR, 2},
MOVEINT = {cc.TransitionMoveInT, 2},
PAGETURN = {cc.TransitionPageTurn, 3, false},
ROTOZOOM = {cc.TransitionRotoZoom, 2},
SHRINKGROW = {cc.TransitionShrinkGrow, 2},
SLIDEINB = {cc.TransitionSlideInB, 2},
SLIDEINL = {cc.TransitionSlideInL, 2},
SLIDEINR = {cc.TransitionSlideInR, 2},
SLIDEINT = {cc.TransitionSlideInT, 2},
SPLITCOLS = {cc.TransitionSplitCols, 2},
SPLITROWS = {cc.TransitionSplitRows, 2},
TURNOFFTILES = {cc.TransitionTurnOffTiles, 2},
ZOOMFLIPANGULAR = {cc.TransitionZoomFlipAngular, 2},
ZOOMFLIPX = {cc.TransitionZoomFlipX, 3, cc.TRANSITION_ORIENTATION_LEFT_OVER},
ZOOMFLIPY = {cc.TransitionZoomFlipY, 3, cc.TRANSITION_ORIENTATION_UP_OVER},
}
function SceneManager:__init()
if SceneManager.Instance ~= nil then
return
end
print("................")
SceneManager.Instance = self
self.scene_list = {}
self.scene_list.scene_nums= 0
end
function SceneManager:delMe()
for i = #self.scene_list ,2 ,-1 do
local v = self.scene_list[i]
if v then
v:delMe()
self.scene_list[i] = nil
end
end
print("Clear All Scene ")
end
--[[
场景入栈
-------------------------------
@sceneName 场景名
@transitonScene 过渡动画
@... 参数。table
]]
function SceneManager:pushSceneWithTransition(sceneName,transitionType, ... )
local nexscene_class = require(sceneName)
local run_scene = self.scene_list[ #self.scene_list ]
ChestError(nexscene_class)
--空指针检测
local nextscene = nexscene_class.new(...)
nextscene.__cname = sceneName
self.scene_list.scene_nums = self.scene_list.scene_nums + 1
self.scene_list[ #self.scene_list + 1] = nexScene
print("SceneManager:pushScene ->>>>>>>>>>>>self.scene_list size ", self.scene_list.scene_nums)
if self.scene_list.scene_nums >= 2 then
local scene = self:converTransitionByType(transitionType,...)
cc.Director:getInstance():pushScene(scene)
end
end
function SceneManager:runScene(sceneName,transitionType, ... )
local nexscene_class = require(sceneName)
local run_scene = self.scene_list[ #self.scene_list ]
ChestError(nexscene_class)
--空指针检测
local nextscene = nexscene_class.new(...)
nextscene.__cname = sceneName
self.scene_list.scene_nums = self.scene_list.scene_nums + 1
self.scene_list[#self.scene_list + 1] = nextscene
print("SceneManager:runScene ->>>>>>>>>>>>self.scene_list size ", self.scene_list.scene_nums)
if self.scene_list.scene_nums >= 1 then
local newScene = self:getNextRunScene()
if transitionType then
newScene = self:converTransitionByType(transitionType,...)
end
ChestError(newScene)
--空指针检测
if display.getRunningScene() then
cc.Director:getInstance():replaceScene(newScene)
return
else
cc.Director:getInstance():runWithScene(newScene)
end
end
end
-- 从栈顶取出下一个场景
function SceneManager:getNextRunScene()
return self.scene_list[ #self.scene_list ] or nil
end
-- 动作转换
function SceneManager:converTransitionByType(transitionType, ...)
-- 转换相应的大写,注意只传 过度名,去掉cc例如 MOVEINB
local key = string.upper(tostring(transitionType))
-- 如果是随机的话
if key == "RANDOM" then
local transiton_nums = table.nums(SceneManager.SCENE_TRANSITIONS)
print("SceneManager.....transiton_nums的值",transiton_nums)
key = math.random(1,#transiton_nums)
end
if nil == key then
return nil
end
local scene_action_cls , count, default = unpack(SceneManager.SCENE_TRANSITIONS[key])
local nextscene = self:getNextRunScene()
ChestError(nextscene)
local cfg = ...
local scene
if count == 3 then
scene = scene_action_cls:create(cfg.time,nextscene ,cfg.other or default)
else
scene = scene_action_cls:create(cfg.time,nextscene)
end
return scene
end
-- 回到主场景--即开始游戏场景
function SceneManager:goToMain()
-- 首先连续出栈
end
SceneManager.SCENE_TRANSITIONS = {
CROSSFADE = {cc.TransitionCrossFade, 2},
FADE = {cc.TransitionFade, 3, cc.c3b(0, 0, 0)},
FADEBL = {cc.TransitionFadeBL, 2},
FADEDOWN = {cc.TransitionFadeDown, 2},
FADETR = {cc.TransitionFadeTR, 2},
FADEUP = {cc.TransitionFadeUp, 2},
FLIPANGULAR = {cc.TransitionFlipAngular, 3, cc.TRANSITION_ORIENTATION_LEFT_OVER},
FLIPX = {cc.TransitionFlipX, 3, cc.TRANSITION_ORIENTATION_LEFT_OVER},
FLIPY = {cc.TransitionFlipY, 3, cc.TRANSITION_ORIENTATION_UP_OVER},
JUMPZOOM = {cc.TransitionJumpZoom, 2},
MOVEINB = {cc.TransitionMoveInB, 2},
MOVEINL = {cc.TransitionMoveInL, 2},
MOVEINR = {cc.TransitionMoveInR, 2},
MOVEINT = {cc.TransitionMoveInT, 2},
PAGETURN = {cc.TransitionPageTurn, 3, false},
ROTOZOOM = {cc.TransitionRotoZoom, 2},
SHRINKGROW = {cc.TransitionShrinkGrow, 2},
SLIDEINB = {cc.TransitionSlideInB, 2},
SLIDEINL = {cc.TransitionSlideInL, 2},
SLIDEINR = {cc.TransitionSlideInR, 2},
SLIDEINT = {cc.TransitionSlideInT, 2},
SPLITCOLS = {cc.TransitionSplitCols, 2},
SPLITROWS = {cc.TransitionSplitRows, 2},
TURNOFFTILES = {cc.TransitionTurnOffTiles, 2},
ZOOMFLIPANGULAR = {cc.TransitionZoomFlipAngular, 2},
ZOOMFLIPX = {cc.TransitionZoomFlipX, 3, cc.TRANSITION_ORIENTATION_LEFT_OVER},
ZOOMFLIPY = {cc.TransitionZoomFlipY, 3, cc.TRANSITION_ORIENTATION_UP_OVER},
}
function SceneManager:__init()
if SceneManager.Instance ~= nil then
return
end
print("................")
SceneManager.Instance = self
self.scene_list = {}
self.scene_list.scene_nums= 0
end
function SceneManager:delMe()
for i = #self.scene_list ,2 ,-1 do
local v = self.scene_list[i]
if v then
v:delMe()
self.scene_list[i] = nil
end
end
print("Clear All Scene ")
end
--[[
场景入栈
-------------------------------
@sceneName 场景名
@transitonScene 过渡动画
@... 参数。table
]]
function SceneManager:pushSceneWithTransition(sceneName,transitionType, ... )
local nexscene_class = require(sceneName)
local run_scene = self.scene_list[ #self.scene_list ]
ChestError(nexscene_class)
--空指针检测
local nextscene = nexscene_class.new(...)
nextscene.__cname = sceneName
self.scene_list.scene_nums = self.scene_list.scene_nums + 1
self.scene_list[ #self.scene_list + 1] = nexScene
print("SceneManager:pushScene ->>>>>>>>>>>>self.scene_list size ", self.scene_list.scene_nums)
if self.scene_list.scene_nums >= 2 then
local scene = self:converTransitionByType(transitionType,...)
cc.Director:getInstance():pushScene(scene)
end
end
function SceneManager:runScene(sceneName,transitionType, ... )
local nexscene_class = require(sceneName)
local run_scene = self.scene_list[ #self.scene_list ]
ChestError(nexscene_class)
--空指针检测
local nextscene = nexscene_class.new(...)
nextscene.__cname = sceneName
self.scene_list.scene_nums = self.scene_list.scene_nums + 1
self.scene_list[#self.scene_list + 1] = nextscene
print("SceneManager:runScene ->>>>>>>>>>>>self.scene_list size ", self.scene_list.scene_nums)
if self.scene_list.scene_nums >= 1 then
local newScene = self:getNextRunScene()
if transitionType then
newScene = self:converTransitionByType(transitionType,...)
end
ChestError(newScene)
--空指针检测
if display.getRunningScene() then
cc.Director:getInstance():replaceScene(newScene)
return
else
cc.Director:getInstance():runWithScene(newScene)
end
end
end
-- 从栈顶取出下一个场景
function SceneManager:getNextRunScene()
return self.scene_list[ #self.scene_list ] or nil
end
-- 动作转换
function SceneManager:converTransitionByType(transitionType, ...)
-- 转换相应的大写,注意只传 过度名,去掉cc例如 MOVEINB
local key = string.upper(tostring(transitionType))
-- 如果是随机的话
if key == "RANDOM" then
local transiton_nums = table.nums(SceneManager.SCENE_TRANSITIONS)
print("SceneManager.....transiton_nums的值",transiton_nums)
key = math.random(1,#transiton_nums)
end
if nil == key then
return nil
end
local scene_action_cls , count, default = unpack(SceneManager.SCENE_TRANSITIONS[key])
local nextscene = self:getNextRunScene()
ChestError(nextscene)
local cfg = ...
local scene
if count == 3 then
scene = scene_action_cls:create(cfg.time,nextscene ,cfg.other or default)
else
scene = scene_action_cls:create(cfg.time,nextscene)
end
return scene
end
-- 回到主场景--即开始游戏场景
function SceneManager:goToMain()
-- 首先连续出栈
end
相关文章推荐
- cocos 本周学习api
- 【Cocos2d-x 3.0 中文基础教程】精灵帧缓存
- cocos2dx-lua sprite增加touch监听
- Cocos2d-x手游开发将log记录到文件
- cocos 获得2个点形成的线段的角度
- cocos-圆周运动 物理方法
- cocos-内存管理之sprite材质
- cocos-九宫格数据切割
- Cocos2d-x中CCSprite的Create流程--h
- cocos2dx CCUserDefault
- Cocos2d-JS 相关文章
- cocos2dx JNI DETECTED ERROR IN APPLICATION: illegal class name 'XXX'的错误修复
- cocos2dx常见的46中+22中动作详解
- 从cocos2dx源代码看android和iOS跨平台那些事
- 关于 error C2039: “create”: 不是“cocos2d::GLView”的成员的解决方法
- cocos listview 删除的3种方案
- Cocos开发VR菜鸟宝典 第六讲:操控设备的接入
- cocos阻挡层
- Cocos2d-Js ctor init onEnter的区别
- iOS和android游戏纹理优化和内存优化(cocos2d-x)