婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > lua開發中實現MVC框架的簡單應用

lua開發中實現MVC框架的簡單應用

熱門標簽:漳州智云呼電話機器人 清朝地圖標注哈爾濱 地圖標注大廈 新岸線智能電銷機器人 個人怎么在地圖標注需要的店鋪 怎么去除地圖標注 冀州市地圖標注 百度地圖標注早餐區域 武漢外呼防封系統多少錢

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

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

       先來看看項目的目錄結構:

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

        我們以游戲的運行流程為線索來展開說明。

        運行項目,進入到main.lua文件,來看看main函數:

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 

       這里我們又發現了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 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" 

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

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

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差不多。

        到這里,MVC應用的簡單介紹就結束啦,希望大家能夠喜歡本文,能夠對大家學習lua有所幫助。

您可能感興趣的文章:
  • Lua游戲開發教程之時區問題詳解
  • Lua在各個操作系統中的開發環境配置教程
  • 安裝Nginx+Lua開發環境
  • Centos7 安裝Nginx整合Lua的示例代碼
  • Nginx安裝lua-nginx-module模塊的方法步驟
  • cocos2dx+lua實現橡皮擦功能
  • Lua中三種循環語句的使用講解
  • Lua中的變量與賦值方法
  • Lua協同程序coroutine的簡介及優缺點
  • Luvit像Node.js一樣寫Lua應用

標簽:臺灣 德宏 天門 天門 濰坊 金昌 儋州 宣城

巨人網絡通訊聲明:本文標題《lua開發中實現MVC框架的簡單應用》,本文關鍵詞  lua,開發,中,實現,MVC,框架,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《lua開發中實現MVC框架的簡單應用》相關的同類信息!
  • 本頁收集關于lua開發中實現MVC框架的簡單應用的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲小说欧美激情另类| 国产日本亚洲高清| 色天天综合色天天久久| 国产不卡在线视频| 不卡一区二区在线| 91蝌蚪porny成人天涯| 日本久久一区二区三区| 欧美日韩国产片| 精品福利一区二区三区免费视频| 日韩精品一区二区三区视频在线观看| 欧美成人官网二区| 欧美激情一区三区| 最新日韩av在线| 午夜伦理一区二区| 精东粉嫩av免费一区二区三区| 国产一区福利在线| 色综合久久中文字幕综合网| 欧美精品丝袜久久久中文字幕| 日韩精品专区在线影院观看| 欧美极品少妇xxxxⅹ高跟鞋| 亚洲一区二区视频在线| 美女一区二区视频| 99久久久久久| 日韩三级伦理片妻子的秘密按摩| 2017欧美狠狠色| 亚洲免费观看高清| 久久成人羞羞网站| av动漫一区二区| 欧美一区二区三区视频在线| 欧美国产一区二区| 婷婷中文字幕一区三区| 国产毛片精品一区| 欧美高清www午色夜在线视频| 亚洲精品一区二区三区99| 亚洲视频中文字幕| 老色鬼精品视频在线观看播放| 色婷婷综合久久久中文一区二区 | 日韩亚洲欧美高清| 国产日产欧产精品推荐色| 午夜婷婷国产麻豆精品| 国产精品99久久久久久有的能看| 在线观看日韩国产| 亚洲国产精品传媒在线观看| 日韩电影一区二区三区四区| 一本色道久久综合亚洲精品按摩| 精品久久久影院| 日日摸夜夜添夜夜添国产精品 | 欧美人xxxx| 国产精品天美传媒沈樵| 青青青伊人色综合久久| 日本精品一区二区三区高清 | 欧美美女一区二区在线观看| 国产精品网曝门| 黑人精品欧美一区二区蜜桃 | 日韩亚洲欧美高清| 亚洲国产视频一区| 91蝌蚪porny成人天涯| 国产欧美日韩在线看| 奇米777欧美一区二区| 91福利国产精品| 日韩毛片高清在线播放| 播五月开心婷婷综合| 国产欧美一区二区精品秋霞影院| 国产做a爰片久久毛片| 欧美一级二级三级蜜桃| 日韩中文字幕一区二区三区| 欧美午夜片在线看| 亚洲影视在线播放| 欧美日韩一区在线观看| 亚洲国产日韩在线一区模特| 91久久奴性调教| 亚洲高清视频在线| 欧美高清hd18日本| 裸体一区二区三区| 精品国产乱子伦一区| 精品一区二区三区免费观看| 26uuu亚洲婷婷狠狠天堂| 国产一本一道久久香蕉| 亚洲国产精品成人综合色在线婷婷| 岛国av在线一区| 亚洲人成精品久久久久久| 欧美主播一区二区三区美女| 亚洲va欧美va国产va天堂影院| 色婷婷国产精品综合在线观看| 一区二区成人在线观看| 69久久99精品久久久久婷婷| 毛片av一区二区| 欧美国产激情二区三区| 色综合久久久久综合| 午夜av一区二区| 久久夜色精品国产欧美乱极品| 久久99精品久久久久久动态图 | 91蜜桃免费观看视频| 亚洲一区二区三区四区中文字幕| 欧美精品丝袜中出| 国产**成人网毛片九色| 亚洲尤物在线视频观看| 精品免费99久久| 91啪亚洲精品| 国产呦萝稀缺另类资源| 中文字幕一区二区不卡| 777精品伊人久久久久大香线蕉| 久久国产三级精品| 亚洲精品欧美专区| 精品少妇一区二区三区| 色激情天天射综合网| 精品写真视频在线观看| 亚洲一线二线三线久久久| 欧美va亚洲va国产综合| 91小宝寻花一区二区三区| 日韩高清国产一区在线| 最新国产成人在线观看| 日韩免费视频一区| 色8久久人人97超碰香蕉987| 国产精品一区二区三区乱码| 亚洲成人免费影院| 亚洲日本一区二区| 久久久久九九视频| 欧美一激情一区二区三区| 色婷婷av久久久久久久| 国产成人免费视频精品含羞草妖精| 亚洲国产中文字幕在线视频综合| 国产三级三级三级精品8ⅰ区| 337p亚洲精品色噜噜噜| 欧美系列日韩一区| 97久久精品人人做人人爽 | 欧美图片一区二区三区| 懂色av一区二区三区免费看| 麻豆成人综合网| 五月综合激情日本mⅴ| 亚洲最新视频在线播放| 日本一区二区三区在线观看| 2020国产精品自拍| 欧美xxxxx牲另类人与| 欧美一区二区在线播放| 91精品蜜臀在线一区尤物| 欧美色图片你懂的| 欧美在线短视频| 欧美三级在线看| 在线免费亚洲电影| 色激情天天射综合网| 99精品一区二区三区| 97se亚洲国产综合在线| 99精品偷自拍| 日本丶国产丶欧美色综合| 91麻豆精品秘密| 一本色道久久加勒比精品 | 亚洲欧美在线高清| 自拍偷拍国产精品| 亚洲天堂精品视频| 亚洲国产一区视频| 日韩国产一二三区| 九九视频精品免费| 国产揄拍国内精品对白| 国产超碰在线一区| 91麻豆免费视频| 欧美日本乱大交xxxxx| 91精品国产综合久久精品图片| 91精品久久久久久久91蜜桃| 欧美成人伊人久久综合网| 久久人人97超碰com| 国产精品大尺度| 亚洲制服丝袜在线| 日韩电影在线免费看| 国产乱色国产精品免费视频| 成人国产精品免费观看视频| 91国偷自产一区二区开放时间| 日本乱码高清不卡字幕| 日韩一区二区三区免费看| 久久精品一区蜜桃臀影院| 亚洲人亚洲人成电影网站色| 午夜欧美视频在线观看| 国产成人自拍网| 欧美色精品在线视频| 久久综合九色综合久久久精品综合| 国产欧美精品在线观看| 午夜a成v人精品| 丁香激情综合国产| 91精品啪在线观看国产60岁| 国产日韩欧美综合一区| 亚洲午夜免费电影| 国产成人在线视频免费播放| 91黄色免费看| 久久日一线二线三线suv| 一级做a爱片久久| 国产米奇在线777精品观看| 欧美专区日韩专区| 国产精品网友自拍| 国产最新精品免费| 欧美日本韩国一区二区三区视频 | 久久丁香综合五月国产三级网站| 99re热视频这里只精品| 欧美精品一区二区在线观看| 亚洲综合色自拍一区| 国精产品一区一区三区mba视频 | 在线欧美日韩精品| 欧美极品另类videosde| 精品一区二区三区免费| 欧美三区在线观看| 亚洲精品日日夜夜|