cocos2dx之lua项目开发中MVC框架的简单应用

****************************************************************************

时间:2015-03-31

作者:Sharing_Li

转载注明出处:

****************************************************************************

接下来,看看在游戏开发中怎么用,这里用Lua(环境使用cocos code ide)给大家说说。

先来看看项目的目录结构:

其中cocos、Controller、Model、View这个不用多说,Event里面保存的全局消息类型,Managers是用于管理游戏中的东东的,比如管理资源,管理各种场景切换,层的切换等等。Utilities提供一些工具类,比如字符串的处理等。大家也可以根据自己的需求来定制目录,比如定义一个NetCenter文件夹,专门用于处理网络的。本例子中没有用到数据操作和工具类,所以这两个文件夹为空。

我们以游戏的运行流程为线索来展开说明。

运行项目,进入到main.lua文件,来看看main函数:

local function main()collectgarbage("collect")– avoid memory leakcollectgarbage("setpause", 100)collectgarbage("setstepmul", 5000)– initialize directorlocal director = cc.Director:getInstance()–turn on display FPSdirector:setDisplayStats(true)–set FPS. the default value is 1.0/60 if you don't call thisdirector:setAnimationInterval(1.0 / 60)cc.Director:getInstance():getOpenGLView():setDesignResolutionSize(320, 480, 1)–create scenelocal scene = require("GameScene")local gameScene = scene:startGame()end

我们最后调用了GameScene类中的startGame函数,来看看GameScene这个类:

require("Managers.SceneManager")require("Managers.LayerManager")local GameScene = class("GameScene")local scene = nilfunction GameScene:startGame()–初始化scene = cc.Scene:create()if cc.Director:getInstance():getRunningScene() thencc.Director:getInstance():replaceScene(scene)elsecc.Director:getInstance():runWithScene(scene)endSceneManager:initLayer(scene)self:enterGame()endfunction GameScene:enterGame()LayerManager:getInstance():gotoLayerByType(LAYER_TYPE_MAIN)endreturn GameScene

在startGame函数中,我们创建了一个空场景,然后调用SceneManager场景管理器来初始化场景。最后调用enterGame函数正式进入游戏主界面,其中enterGame函数中又有一个LayerManager层管理器。我们来看看这两个管理器是如何工作的。先看看SceneManager:

–场景管理器SceneManager = {}–背景层bgLayer = nil–游戏层gameLayer = nil–弹窗层panelLayer = nilfunction SceneManager:initLayer(scene)bgLayer = cc.Layer:create()scene:addChild(bgLayer)gameLayer = cc.Layer:create()scene:addChild(gameLayer)panelLayer = cc.Layer:create()scene:addChild(panelLayer)end

很简单,按顺序初始化了三个空Layer。再来看看LayerManager管理器:

–Layer管理器LayerManager = {}LAYER_TYPE_MAIN = "LAYER_TYPE_MAIN"local curLayer = nilfunction LayerManager:new(o)o = o or {}setmetatable(o,self)self.__index = selfreturn oendfunction LayerManager:getInstance()if self.instance == nil thenself.instance = self:new()endreturn self.instanceendfunction LayerManager:gotoLayerByType(type)if curLayer ~= nil thencurLayer:destroy()endif type == "LAYER_TYPE_MAIN" thenlocal layer = require("Controller.MainLayerController"):create()curLayer = layerendend

看看gotoLayerByType这个函数,首先切换层的时候,看看当前层是否为空,不为空就删掉。然后根据传递过来的参数来判断要切换到哪个层。这里出现MVC中的Controller部分,看看是什么情况。这里调用了类MainLayerController中的create函数:

function MainLayerC:create()local layer = MainLayerC:new()return layerendfunction MainLayerC:ctor()self:createUI()–创建界面self:addBtnEventListener()–添加按钮监听endfunction MainLayerC:createUI()local layer = require("View.MainLayerView")self.mainLayer = layer:createUI()gameLayer:addChild(self.mainLayer)end

这里我们又发现了MVC中的View,在createUI函数中,我们调用了类MainLayerView的createUI函数,并将其添加到场景的游戏层中。我们来看看MainLayerView这个类。

local eventDispatcher = cc.Director:getInstance():getEventDispatcher()local MainLayerV = class("MainLayerView",function()return cc.Layer:create()end)function MainLayerV:createUI()local mainLayer = MainLayerV:new()return mainLayerendfunction MainLayerV:ctor()self:initUI()endfunction MainLayerV:initUI()local winSize = cc.Director:getInstance():getWinSize()self.bg = cc.Sprite:create(ResManager.main_bg)self.bg:setPosition(winSize.width / 2,winSize.height / 2)self:addChild(self.bg)local function menuCallback(tag,menuItem)local event = cc.EventCustom:new(EVENT_CLICK_MENU_MAIN)event._usedata = tageventDispatcher:dispatchEvent(event)endself.btnItem1 = cc.MenuItemImage:create(ResManager.main_btn1,ResManager.main_btn1,ResManager.main_btn1)self.btnItem1:setPosition(winSize.width / 2,winSize.height / 3)self.btnItem1:setTag(1)self.btnItem1:registerScriptTapHandler(menuCallback)self.btnItem2 = cc.MenuItemImage:create(ResManager.main_btn2,ResManager.main_btn2)self.btnItem2:setPosition(winSize.width / 2,winSize.height / 2)self.btnItem2:setTag(2)self.btnItem2:registerScriptTapHandler(menuCallback)self.btnItem3 = cc.MenuItemImage:create(ResManager.main_btn3,ResManager.main_btn3)self.btnItem3:setPosition(winSize.width / 2,winSize.height / 3 * 2)self.btnItem3:setTag(3)self.btnItem3:registerScriptTapHandler(menuCallback)–创建菜单self.menu = cc.Menu:create(self.btnItem1,self.btnItem2,self.btnItem3)self.menu:setPosition(0,0)self:addChild(self.menu)endreturn MainLayerV经验是由痛苦中粹取出来的

cocos2dx之lua项目开发中MVC框架的简单应用

相关文章:

你感兴趣的文章:

标签云: