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() --强制手动从头开始播放背景音乐