亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發(fā) > 綜合 > 正文

lua開發(fā)中實(shí)現(xiàn)MVC框架的簡單應(yīng)用

2024-07-21 23:04:27
字體:
供稿:網(wǎng)友

       先簡單說說MVC,即Model View Controller。Model(模型),一般負(fù)責(zé)數(shù)據(jù)的處理;View(視圖),一般負(fù)責(zé)界面的顯示;Controller(控制器),一般負(fù)責(zé)前端的邏輯處理。拿一款手機(jī)游戲來說,界面UI的顯示、布局等就是View負(fù)責(zé);點(diǎn)擊了按鈕,手勢的滑動等操作由Controller來處理;游戲中需要的數(shù)據(jù)資源就交給Model。

       接下來,看看在游戲開發(fā)中怎么用,這里用Lua(環(huán)境使用cocos code ide)給大家說說。

       先來看看項目的目錄結(jié)構(gòu):

lua,mvc框架,lua框架

        其中cocos、Controller、Model、View這個不用多說,Event里面保存的全局消息類型,Managers是用于管理游戲中的東東的,比如管理資源,管理各種場景切換,層的切換等等。Utilities提供一些工具類,比如字符串的處理等。大家也可以根據(jù)自己的需求來定制目錄,比如定義一個NetCenter文件夾,專門用于處理網(wǎng)絡(luò)的。本例子中沒有用到數(shù)據(jù)操作和工具類,所以這兩個文件夾為空。

        我們以游戲的運(yùn)行流程為線索來展開說明。

        運(yùn)行項目,進(jìn)入到main.lua文件,來看看main函數(shù):

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 

        我們最后調(diào)用了GameScene類中的startGame函數(shù),來看看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函數(shù)中,我們創(chuàng)建了一個空場景,然后調(diào)用SceneManager場景管理器來初始化場景。最后調(diào)用enterGame函數(shù)正式進(jìn)入游戲主界面,其中enterGame函數(shù)中又有一個LayerManager層管理器。我們來看看這兩個管理器是如何工作的。先看看SceneManager:

--場景管理器 SceneManager = {}  --背景層 bgLayer = nil --游戲?qū)?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這個函數(shù),首先切換層的時候,看看當(dāng)前層是否為空,不為空就刪掉。然后根據(jù)傳遞過來的參數(shù)來判斷要切換到哪個層。這里出現(xiàn)MVC中的Controller部分,看看是什么情況。這里調(diào)用了類MainLayerController中的create函數(shù):

function MainLayerC:create()   local layer = MainLayerC:new()   return layer end  function MainLayerC:ctor()   self:createUI()--創(chuàng)建界面   self:addBtnEventListener()--添加按鈕監(jiān)聽 end  function MainLayerC:createUI()   local layer = require("View.MainLayerView")   self.mainLayer = layer:createUI()   gameLayer:addChild(self.mainLayer) end 

       這里我們又發(fā)現(xiàn)了MVC中的View,在createUI函數(shù)中,我們調(diào)用了類MainLayerView的createUI函數(shù),并將其添加到場景的游戲?qū)又?。我們來看看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)      --創(chuàng)建菜單   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" 

       這樣做的好處是,如果圖片改了名字或者換了路徑等,只需要在這里改一次就可以了。

       可以看到我們給三個按鈕注冊了響應(yīng)函數(shù)menuCallback,在這個函數(shù)中,就是MVC中的V和C之間的“溝通”了。我們定義了一個自定義事件EVENT_CLICK_MENU_MAIN,并給這個事件添加了一個附帶參數(shù)_usedata,這個參數(shù)保存的是三個按鈕的tag。然后將這個事件發(fā)送給他的監(jiān)聽者。這里大家應(yīng)該明白了,我們在對應(yīng)的Controller中注冊了EVENT_CLICK_MENU_MAIN的監(jiān)聽,但有這個事件發(fā)過來時,我們就響應(yīng)。根據(jù)事件攜帶的參數(shù)_usedata,我們就知道了在View中,玩家點(diǎn)擊了哪個按鈕,這樣做的好處是,保證了每個界面只有一個消息,我們只需要根據(jù)這個消息攜帶的附加參數(shù)來判斷具體的事件,從而減少了消息個數(shù),這樣有助于游戲的效率。另外,我們在響應(yīng)這個消息的時候,也會做一定的優(yōu)化,來看看類MainLayerController的響應(yīng)函數(shù):

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 

        可以看到實(shí)際情況,我們并不需要對傳遞過來的參數(shù)進(jìn)行判斷,而是定義了一個函數(shù)數(shù)組,直接根據(jù)下標(biāo)來調(diào)用對應(yīng)的消息響應(yīng)。之后繼續(xù)通過各種管理器來對游戲內(nèi)容進(jìn)行變化,方式和MainLayerController和MainLayerView差不多。

        到這里,MVC應(yīng)用的簡單介紹就結(jié)束啦,希望大家能夠喜歡本文,能夠?qū)Υ蠹覍W(xué)習(xí)lua有所幫助。

 
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
欧美中文在线视频| 亚洲丝袜一区在线| 日本一本a高清免费不卡| 亚洲av毛片在线观看| 国模吧视频一区| 欧美性做爰猛烈叫床潮| 99国产精品久久久| 天天堂资源网在线观看免费视频| 精品国产一区二区三区四区在线观看| 中文字幕在线永久在线视频2020| 精品成人免费自拍视频| 精品亚洲精品福利线在观看| 久久精品亚洲精品国产欧美| 奇米777第四色| 色综合电影网| 丝袜美腿美女被狂躁在线观看| 免费在线观看毛片网站| 国产大学生粉嫩无套流白浆| 影音先锋男人在线资源| 欧美黑人视频一区| 777琪琪电影午夜理伦片| 99久久伊人久久99| 国产精品一区在线观看你懂的| 亚洲激情在线观看视频| 另类中文字幕国产精品| 国产精品88888| 女人色在线免费视频| 精品素人av| 特级西西444www大胆免费看| 欧美极品美女视频网站在线观看免费| 国产综合色产在线精品| 影音av资源网| 亚洲午夜一二三区视频| 99久久精品费精品国产风间由美| 免费在线观看视频一区| 日韩欧美视频在线免费观看| 中文字幕日韩欧美在线视频| jlzzjlzz亚洲日本少妇| 日本一区二区高清视频| 一级片一区二区三区| 少妇视频一区| 91香蕉国产在线观看| 久久精品人人爽| 精品视频在线观看一区二区| 91九色精品| 玖玖精品一区| 国产精品吊钟奶在线| 91久久精品无码一区二区| 久久亚洲国产| 免费久久网站| 午夜视频久久久| 亚洲国产日本| 福利视频导航大全| 成人一级片网站| 免费在线观看一区二区| 91精品福利在线一区二区三区| 欧美日韩国产精品专区| 中日韩脚交footjobhd| 亚洲精品乱码久久久久久久久| 精品淫伦v久久水蜜桃| 中文在线资源观看视频网站免费不卡| 精品成人一区二区三区免费视频| 麻豆影院在线观看| sm一区二区三区| 日韩不卡一区二区| 99sesese| 最新中文字幕2018| 高潮毛片又色又爽免费| 国产夫妻在线观看| 最新一本之道波多野结衣| 91极品尤物在线播放国产| 天堂资源在线观看| 国产中年熟女高潮大集合| 黄色一区二区在线观看| 国产精品伦一区二区| 91成人免费在线视频| 四虎成人精品在永久免费| 热re99久久精品国产66热| 成人日韩在线| 羞羞网站在线观看入口免费| 成人日韩欧美| 99久精品国产| 成人综合激情网| 久久久久久久极品| 日本天堂网在线| av成人在线看| 97香蕉久久超级碰碰高清版| 亚洲成人教育av| 欧美性xxxx巨大黑人猛| 日韩av一区二| 中文乱码免费一区二区| 国产成人综合亚洲91猫咪| 欧美三级xxx| 无码无套少妇毛多18pxxxx| 精品久久人人做人人爱| 国产自产视频一区二区三区| 亚洲天堂2017| 99热精品在线播放| 调教+趴+乳夹+国产+精品| 免费在线观看av网址| free性丰满69性欧美| 成年片费网站色大全免费视频| av先锋影音少妇| 国产精品刘玥久久一区| 经典三级在线视频| 理论片在线观看理伦片| 国产主播在线一区| 精品国产乱码久久久久久闺蜜| a级片免费观看| gogogo免费高清日本写真| 日本一二三区不卡| 精品久久一区二区三区蜜桃| 国产一区二区日韩| 午夜视频在线瓜伦| 亚洲永久精品大片| 一区二区中文字幕在线| 亚洲国产精品嫩草影院久久av| 国产又黄又猛又粗| 久久精品日产第一区二区三区| 久久久久久久免费视频| 国产大尺度在线观看| 99综合精品久久| 午夜影院免费在线| 蜜桃狠狠色伊人亚洲综合网站| 在线精品一区| caopon在线免费视频| 欧美6699在线视频免费| 天天摸天天干天天操| 自拍视频亚洲| 91看片在线观看| 99久re热视频这里只有精品6| 新天天拍日日拍狠狠拍| 99久久婷婷国产综合精品青牛牛| 粉嫩aⅴ一区二区三区| 怡红院怡春院首页| 电影亚洲精品噜噜在线观看| 欧美一区二区在线免费观看| 99久久无色码| 黄色在线论坛| 欧美午夜不卡影院在线观看完整版免费| 国产成人综合精品在线| 精品中文字幕av| 超碰成人在线观看| 欧美日韩大片一区二区三区| 日韩电影天堂视频一区二区| 亚洲欧美国产中文| 精品人伦一区二区色婷婷| 国产精品毛片a∨一区二区三区|国| 国产欧美日韩在线播放| 欧美最顶级丰满的aⅴ艳星| 小泽玛利亚一区二区三区视频| 亚洲欧洲xxxx| 亚洲色偷偷色噜噜狠狠99网| 亚洲免费激情视频| 成人av视屏| 日韩精品乱码av一区二区| 一级女性全黄久久生活片免费| 久久国产综合| 性欧美丰满熟妇xxxx性仙踪林| 国产三级中文字幕| 26uuu国产精品视频| 久久久久久久免费视频| 中文字幕在线观看精品| 免费人成又黄又爽又色| 99热在线免费| 国产福利久久久| 天天精品视频| 久久精品二区亚洲w码| 俺来俺也去www色在线观看| 亚洲精品鲁一鲁一区二区三区| 欲求不满中文字幕| 欧美国产一区视频在线观看| 中文字幕无码精品亚洲资源网久久| 波多野结衣一二三四区| 国产精品资源在线看| 亚洲一区在线观看视频| 成人蜜桃视频| 亚洲美女性生活| 青娱乐国产在线视频| 久久久久久久综合狠狠综合| 欧美日韩一级二级三级| 国产精品自拍三区| 精品视频在线播放| 久久精品人人做人人爽电影蜜月| 国产乱码精品一区二区三区不卡| 丰满人妻一区二区三区53号| 中文岛国精品亚洲一区| 亚洲理论电影在线观看| 成人黄色免费片| 91色中文字幕| 成人欧美视频在线| 亚洲在线资源| 日本va欧美va精品| 亚洲色图欧美日韩| 青青草原av在线播放| 国产日韩欧美日韩| 人人做人人澡人人爽欧美| 精品久久久久久久久久久久久| 涩爱av色老久久精品偷偷鲁| 性猛交富婆╳xxx乱大交一| 免费精品一区二区| 青草青草久热精品视频在线网站| av成人动漫在线观看| 亚洲国产欧美一区二区三区不卡| 久久久久免费精品国产| 亚洲一区亚洲| 欧美韩国日本综合| 欧美不卡在线| 在线一区观看| 在线观看欧美精品| 成年人视频免费在线观看| 精品一区二区91| 91欧美激情一区二区三区成人| 国产九色91回来了| 91精品国产自产在线观看永久| 日韩成人av在线| 国产理论在线观看| 欧美一区二区视频在线观看2020| 美女搞黄视频在线观看| 国产美女三级无套内谢| av在线播放网站| 伊人网综合在线| 国产片一区二区三区| 蜜桃av免费观看| 亚洲白虎美女被爆操| 熟女俱乐部一区二区视频在线| 嫩草www视频在线观看高清| 五月天婷亚洲天综合网鲁鲁鲁| 黄色在线免费| 亚洲欧洲日本精品| 成年人视频在线免费观看| 欧美国产日韩二区| 欧美肉大捧一进一出免费视频| 成人综合视频在线| 日本美女一区| 亚洲精品视频导航| 久久精品视频在线免费观看| 日韩av大全| 清纯唯美综合亚洲| 国产精品10p综合二区| 日韩精选在线观看| 毛片av中文字幕一区二区| 日韩在线观看免费网站| 精品久久久久久久久国产字幕| 在线观看国产高清视频| 亚洲韩国日本中文字幕| 成人黄色免费网| 欧美在线一二三区| 欧美一区二区在线视频| 女人香蕉久久**毛片精品| 成人精品国产免费网站| 国产精品视频导航| 精品视频久久久| 欧美午夜影院一区| 一区二区三区在线播放欧美| 久久经典综合| 久久久亚洲欧洲日产国码αv| 久久综合丝袜日本网| 国产成人精选| 国产成人精品av在线| 美女网站在线观看| 日本免费网站视频| 大波视频国产精品久久| 中文字幕无线码一区| 日本一区二区三区视频| 人妻少妇无码精品视频区| 亚洲少妇一区二区三区| av7777777| 欧美日韩国产不卡在线看| 人妻无码中文字幕免费视频蜜桃| jizzjizz国产精品喷水| 精品久久久久久久久久久久包黑料| 国产精品高清亚洲| 日韩精品导航| 国产福利91精品一区二区| 91精品一区国产高清在线gif| 一区高清视频| 51国偷自产一区二区三区的来源| 国产女主播视频一区二区| 国产主播一区二区三区| 亚洲一区二区综合| 成人精品在线| 第一页在线视频| 国产福利片在线| 国产在线观看91一区二区三区| 一级毛片高清视频| 狠狠色伊人亚洲综合成人| www.黄色国产| 国产主播福利| 91蜜桃臀久久一区二区| 一个人在线观看免费视频www| 日本精品视频在线| www.色综合| 天天碰日日操| 欧美在线xxxx| 香蕉视频在线看| 成人自拍在线| 美女被黑人爆操网站| 日韩一区二区三区高清免费看看| 久久免费公开视频| 亚洲精品一区二区三区四区高清| 欧美国产日韩电影| 日日爱夜夜操| 久热国产在线| 日本三级久久| 天堂网av2018| 日韩中文字幕91| 五月天中文字幕在线| 日韩美女毛茸茸| 欧美黄色片免费观看| 国产目拍亚洲精品99久久精品| 中文字幕乱码在线观看| 国产乱论精品| 欧美色老女人| 国产福利精品一区二区| 丝袜免费视频| 4438欧美| 日本卡一卡2卡3卡4精品卡网站| 一区二区三区国产豹纹内裤在线| 欧美福利在线观看| 怕怕欧美视频免费大全| 羞羞色午夜精品一区二区三区| 91免费国产视频网站| 天天色影综合网| 欧美另类一区二区三区| 国产一区二区美女视频| 国产在线三区| 国产亚洲欧美在线视频|