cocos-lua Scene介绍
cocos-lua里的Scene是对cocos2d的scene进行进一步的逻辑封装,增加常用的功能及方便管理,整个游戏都由一个个Scene来构成,所有的表现代码都应该在Scene里完成,而所有的Scene都由SceneMgr来管理,
SceneMgr
管理场景模版。 管理场景实例。管理结构为由Scene构成的栈,通过LoadScene和UnloadScene完成进栈和出栈,其中第一次加载需要用FiresLoadScene。
接口列表:
- GetClass(class_name, is_need_create) --用于创建场景模版
- CreateScene(scene_name, scene_template_name) --根据场景模版创建场景实例
- DestroyScene(scene_name) --销毁场景实例
- FirstLoadScene(scene_template_name, scene_name) --用于游戏世界第一次加载场景,此场景即为根场景(RootScene)
- LoadScene(scene_template_name, scene_name) --加载指定场景
- UnLoadCurrentScene() --卸载当前场景
- ReloadCurrentScene() --重新载入当前场景(对根场景无效)
- GetScene(scene_name) --获取场景实例
- GetSceneObj(scene_name) --获取场景实例里的ccscene(cocos2d-x的scene)
- GetCurrentScene() --获取当前场景实例
- GetCurrentSceneName() --获取当前场景名称
- GetRootSceneName() --获取根场景名称
- IsRootScene() --当前场景是否为根场景
场景模版(SceneBase)
每个SceneBase均从LogicNode继承而来,需要定义_Init和_Uninit函数,范例如下: [cpp] local SceneBase= SceneMgr:GetClass(“场景名”, 1) SceneBase.property = {} –场景属性,如是否可接受触摸事件,是否可拖动,是否可缩放等 function SceneBase:_Uninit( … ) — body end function SceneBase:_Init( … ) — body end [/cpp]
1. 定义场景属性
Scene具有以下预定义属性 [cpp]Sene.property = { can_touch = 1, —是否接受触摸消息 can_drag = 1, —场景是否可以拖动 limit_drag = 1, —场景是否要在限制大小内拖动 can_scale = 1, —场景是否可以缩放(两指滑动) debug_bounding_box = 1, —是否打开碰撞盒调试(适用于骨骼动画) }[/cpp] 可通过以下接口来获取:
- IsDebugBoundingBox()
- CanTouch()
- CanDrag()
- IsLimitDrag()
- CanScale()
2. 加载场景UI
通过设置cocos_ui这个属性来加载由来加载由Cocostudio的JSON文件,格式如下: [cpp] Scene.cocos_ui = { [JSON文件地址] = { name = UI名称(不可重复), hide = 0, –加载完成后是否隐藏 button = {逻辑变量名 = 控件名, …}, text = {逻辑变量名 = 控件名, …}, image_view = {逻辑变量名 = 控件名, …}, … } } [/cpp] 对于按钮类控件,Scene类会有一个OnCocosButtonEvent处理函数,在有按钮被按下等操作时少辉触发,函数内容自己实现,格式如下: [cpp] function Scene:OnCocosButtonEvent(ui_name, button_name, event, widget_button) –body end [/cpp] 其中ui_name就是刚才填入的UI名称,button_name是刚才填入的逻辑变量名,event有4个,定义在Ui.lua中,分别是 [cpp] Ui.TOUCH_EVENT_BEGAN = 0 Ui.TOUCH_EVENT_MOVED = 1 Ui.TOUCH_EVENT_ENDED = 2 Ui.TOUCH_EVENT_CANCELED = 3 [/cpp] 加载完后,Ui管理类通过 GetUI() 来获取。UI管理类接口可参见framework/ui.lua
3. 注册事件监听
由于SceneBase是从LogicNode继承下来,所以只要调用DeclareListenEvent即可,范例如下 [cpp] Scene:DeclareListenEvent(“EVENT1”, “OnEvent1”) Scene:DeclareListenEvent(“EVENT2”, “OnEvent2”) function Scene:OnEvent1(…) … end function Scene:OnEvent2(…) … end [/cpp]
4. Layer的管理
这里对cocos2d的Layer进行了一个管理,可通过指定的name取到指定的layer,layer相关接口如下
- CreateLayer(layer_name, z_level) --创建一个新的Layer
- AddLayer(layer_name, layer, z_level) --将创建好的Layer添加到管理列表
- GetLayer(layer_name) --根据名字获取指定的Layer
几个特殊的Layer:
- MainLayer:在每个Scene创建好后会自动创建,名为“main”,可通过GetLayer(“main”) 来获取。
- UILayer:用于UI绘制的Layer,cocostuio加载的UI就位于这一图层,通过GetUILayer()来获取。
5. 精灵等元素的管理
在这里不管是Sprite还是其他的,都统一视为Obj,提供一套管理存储和快捷加载方案,接口如下
- AddObj(layer_name, obj_type, id, obj)
- GetObj(layer_name, obj_type, id)
- GetObjList(layer_name, obj_type)
- RemoveObj(layer_name, obj_type, id, is_cleanup)
6. 场景的自身基础属性设置
- SetWidth(width) —设置场景的最大宽度,主要用于限制场景拖动
- GetWidth()
- SetHeight(height) --设置场景的最大高度,主要用于限制场景拖动
- GetHeight()
- SetScale(scale, zoom_x, zoom_y, zoom_offset_x, zoom_offset_y) --设置场景的缩放比例,后面四个参数通常不用设置,主要用于聚焦缩放。
- GetScale()
- SetMaxScale(max_scale) --设置场景最大的缩放比
- SetScaleRate(scale_rate) --设置场景用手指滑动缩放的速度
7. 场景内定时器
Scene内部封装了2个定时器,分别为LogicTimer和RealTimer,它们的区别在与前者是依赖于逻辑帧的,如果游戏世界暂停,逻辑帧停止了,定时器也就会被暂停,而后者永远与真实时间保持一致。它们的接口如下:
- RegistRealTimer(frame, call_back) --返回定时器Id,单位:游戏帧
- UnregistRealTimer(timer_id)
- RegistLogicTimer(frame, call_back) --返回定时器Id,单位:游戏帧
- UnregistLogicTimer(timer_id)
8. 其他API
常用功能:
- MoveCamera(x, y) --将镜头焦点移至指定点
- SysMsg(msg, color_name) --播放系统提示消息
- SetSysMsgFont(font_name) --设置系统消息字体
- SetSysMsgSize(font_size) --设置系统消息字体大小
- ShakeScreen(range, call_back) --屏幕震动,参数为(震幅,震完后的回调)
背景图:
- SetBackGroundImage(image_list, is_suit4screen) --设置背景图,参数为(图片列表,是否要缩放以适合屏幕大小)
音效:
- LoadSoundEffect(file_path) --加载指定音效
- UnloadAllSoundEffect() --卸载所有音效
- PlaySoundEffect(file_path) --播放指定音效(须先加载)
背景音乐:
- SetBGM(bgm_path) --设置场景背景音乐(应该在Init时设置,因为Init完后就会尝试播放场景的背景音乐)
- SetBGMVolume(bgm_volume) --设置BGM音量大小,单位0 ~ 1
- PlayBGM() --强制手动从头开始播放背景音乐
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!