大佬教程收集整理的这篇文章主要介绍了[cocos2dx]cocos2dx-lua中的框架MVC,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
local function main() collectgarbage(collect) -- avoid memory leak collectgarbage(setpause,100) collectgarbage(setstepmul,5000) -- initialize director local director = cc.Director:geTinstance() --turn on display FPS director:setDisplayStats(true) --set FPs. the default value is 1.0/60 if you don't call this director:setAnimationInterval(1.0 / 60) cc.Director:geTinstance():getOpenGLView():setDesignResolutionSize(320,480,1) --create scene local scene = require(GameScenE) local gameScene = scene:startGame() end我们最后调用了GameScene类中的startGame函数,来看看GameScene这个类:
require(Managers.SceneManager) require(Managers.LayeRMANager) local GameScene = class(GameScenE) local scene = nil function GameScene:startGame() --初始化 scene = cc.Scene:create() if cc.Director:geTinstance():getRunningScene() then cc.Director:geTinstance():replaceScene(scenE) else cc.Director:geTinstance():runWithScene(scenE) end SceneManager:initLayer(scenE) self:enterGame() end function GameScene:enterGame() LayeRMANager:geTinstance():gotoLayerByType(LAYER_TYPE_MAIN) end return GameScene在startGame函数中,我们创建了一个空场景,然后调用SceneManager场景管理器来初始化场景。最后调用enterGame函数正式进入游戏主界面,其中enterGame函数中又有一个LayeRMANager层管理器。我们来看看这两个管理器是如何工作的。先看看SceneManager:
--场景管理器 SceneManager = {} --背景层 bgLayer = nil --游戏层 gameLayer = nil --弹窗层 panelLayer = nil function 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 = nil function LayeRMANager:new(o) o = o or {} setmetatable(o,self) self.__index = self return o end function LayeRMANager:geTinstance() if self.instance == nil then self.instance = self:new() end return self.instance end function LayeRMANager:gotoLayerByType(typE) if curLayer ~= nil then curLayer:destroy() end if type == LAYER_TYPE_MAIN then local layer = require(Controller.MainLayerController):create() curLayer = layer end end看看gotoLayerByType这个函数,首先切换层的时候,看看当前层是否为空,不为空就删掉。然后根据传递过来的参数来判断要切换到哪个层。 这里出现MVC中的Controller部分,看看是什么情况。这里调用了类MainLayerController中的create函数:
function MainLayerC:create() local layer = MainLayerC:new() return layer end function MainLayerC:ctor() self:createUI()--创建界面 self:addBtnEventListener()--添加按钮监听 end function MainLayerC:createUI() local layer = require(View.MainLayerView) self.mainLayer = layer:createUI() gameLayer:addChild(self.mainLayer) end这里我们又发现了R_240_11845@VC中的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 mainLayer end function MainLayerV:ctor() self:initUI() end function 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 = tag eventDispatcher:dispatchEvent(event) end self.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) end return MainLayerV可以看到,我们在主界面中添加了一张背景图和三个按钮。我们是通过资源管理器Resmanager来管理游戏中的素材的,Resmanager文件很简单:
--资源管理器 Resmanager = {} --主界面 Resmanager.main_bg = bg_big.png Resmanager.main_btn1 = cell.png Resmanager.main_btn2 = cell2.png Resmanager.main_btn3 = cell3.png这样做的好处是,如果图片改了名字或者换了路径等,只需要在这里改一次就可以了。
function MainLayerC:addBtnEventListener() --按钮事件处理 local function eventBtnListener(event) local eventNum = event._usedata local switch = { [1] = function() print(Btn onE) end,[2] = function() print(Btn two) end,[3] = function() print(Btn threE) end } switch[eventNum]() end --注册事件处理 self._eventBtnListener = cc.EventListenerCustom:create(EVENT_CLICK_MENU_MAIN,eventBtnListener) eventDispatcher:addEventListenerWithSceneGraphpriority(self._eventBtnListener,self.mainLayer) end可以看到实际情况,我们并不需要对传递过来的参数进行判断,而是定义了一个函数数组,直接根据下标来调用对应的消息响应。之后继续通过各种管理器来对游戏内容进行变化,方式和MainLayerController和MainLayerView差不多。
很多学习者甚至不知道enterScene(“MainScene”) 为什么里面可以是个字符串?
新建cocos2dx-Lua工程之后,你首先看到的main.lua启动到MyApp.lua。
require("app.MyApp").new():run()
看MyApp.lua文件:
1. require(“app.MyApp”)
这里执行的MyApp.lua的代码是:
local MyApp = class("MyApp",cc.mvc.AppBasE) -- 继承cc.mvc.AppBase return MyApp这时候,你得到了MyApp这个类(lua关于类的实现网上很多)
function MyApp:ctor() MyApp.super.ctor(self) end为什么new()了之后会执行MyApp:ctor()?请看function.lua下的function class(classname,super)方法:
function cls.new(...) local instance = cls.__create(...) -- copy fields from class to native object for k,v in pairs(cls) do instance[k] = v end instance.class = cls instance:ctor(...) return instance end可以看到,在class的实现方法里面,给每个创建的类声明了一个new()方法,方法里面调用了ctor()构造方法(ctor只是个名字,所以不是有些人认为的new了之后,当然会调用构造方法,lua没有类,只是我们模仿了类)
function MyApp:run() CCFileUtils:sharedFileUtils():addSearchPath("res/") self:enterScene("MainScene") end所以进到了MainScene.lua。
-- 声明类 MyApp = class("MyApp",cc.mvc.AppBasE) --- 类构造方法 -- function MyApp:ctor() MyApp.super.ctor(self) end --- 对应cpp版的static create()方法 -- function MyApp:create() local myApp = MyApp.new() myApp:init() end --- 你自己的方法 -- @param self -- local function launchMainScene(self) CCFileUtils:sharedFileUtils():addSearchPath("res/") self:enterScene("MainScene") end --- init 方法 -- function MyApp:init() -- add code here launchMainScene(self) end对应的main.lua将原来的require(“app.MyApp”).new():run()
require("app.MyApp") MyApp:create()这样你是不是更容易理解了,哈哈。
function AppBase:enterScene(scenename,args,transitionType,time,morE) local scenePackagename = self. packageRoot .. ".scenes." .. scenename local sceneClass = require(scenePackageName) local scene = sceneClass.new(unpack(@R_922_10586@ble(args))) display.replaceScene(scene,morE) end这样你能理解了为什么连require文件都没有就能调用MainScene,当然你要留意下,它require时候的文件路径,scene默认写的app/scenes文件夹。好了,其他的应该按照上面的思路基本都能知道为什么了
Sailor 是一个 Lua 语言的 MVC 编程框架。支持跨平台,兼容 mod_lua 或者 mod_pLua,Nginx 的 ngx_lua,或者任何支持 CGI 的 Web 服务器,如 Civetweb 或者 Mongoose,前提是必须有 CGILua。使用 Sailor 开发应用的目录结构如下:
以上是大佬教程为你收集整理的[cocos2dx]cocos2dx-lua中的框架MVC全部内容,希望文章能够帮你解决[cocos2dx]cocos2dx-lua中的框架MVC所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。