打开工程根目录下的配置文件config.json:
{ "init_cfg": { "isLandscape": true, "isWindowTop": false,122)">"name": "redDefense",122)">"width": 1920,122)">"height": 1080,122)">"entry": "src/main.lua",122)">"consolePort": 6050,122)">"uploadPort": 6060,122)">"debugPort": 10000,122)">"forwardConsolePort": 10089,122)">"forwardUploadPort": 10091 },122)">"simulator_screen_size": [ { "title": "iPhone 3Gs (480x320)",255)">480,255)">320 { "iPhone 4 (960x640)",255)">960,255)">640 "iPhone 5 (1136x640)",255)">1136,0)">"iPad (1024x768)",255)">1024,255)">768 "iPad Retina (2048x1536)",255)">2048,255)">1536 "Android (800x480)",255)">800,255)">480 "Android (854x480)",255)">854,0)">"Android (1280x720)",255)">1280,255)">720 "Android (1920x1080)",255)">1080 } ] } 可以看到
"entry": "src/main.lua",也就是说入口文件是main.lua,进而打开main.lua:
cc.FileUtils:getInstance():setPopupNotify(false) addSearchPath("src/") "res/")
require "config" "cocos.init"
local function main() require("app.MyApp"):create():run() end
local status,msg = xpcall(main,__G__TRACKBACK__) if not status then print(msg) end
执行main函数,main函数里加载MyApp创建并运行,进而打开MyApp.lua:
MyApp = class("MyApp",43)">load("mvc").AppBase)
function MyApp:onCreate() math.randomseed(os.time()) return MyApp
这里就有点看头,MyApp仅仅是继承自AppBase,onCreate函数只是初始化了下随机数种子,也就意味着更多的操作在AppBase中,我们打开分析:
AppBase = "AppBase")
AppBase:ctor(configs) self.configs_ = { viewsRoot = "app.views", modelsRoot = "app.models",43)">defaultSceneName = "MainScene", }
for k,153)">v in pairs(configs or {}) do configs_[k] = v if type(configs_.viewsRoot) ~= "table" viewsRoot = {viewsRoot} modelsRoot) ~= modelsRoot = {modelsRoot} DEBUG > 1 dump(configs_,0)">"AppBase configs") CC_SHOW_FPS Director:setDisplayStats(true) -- event self:onCreate() run(initSceneName) initSceneName = initSceneName or defaultSceneName enterScene(initSceneName) enterScene(sceneName,transition,255)">time,255)">more) view = createView(sceneName) view:showWithScene(view createView(name) _,153)">root ipairs(viewsRoot) local packageName = string.format("%s.%s",153)">root,153)">view = function() return require(packageName) end,128)">function(msg) if not find(msg,0)">"'%s' not found:",packageName)) "load view error: ",128)"> end) t = type(view) if and (t == or "userdata") return view:create(self,name) end error("AppBase:createView() - not found view "%s" in search paths "%s"", name,0)">table.concat(viewsRoot,0)">",")),255)">0) AppBase
在前面的分析中知道main.lua是执行的是App的run函数,作为基类的AppBase,当然也要被调用run函数,因此直接看run函数:主要是创建并进入场景initSceneName,如果run的参数没有指定开始的场景则使用默认场景defaultSceneName,默认场景在构造函数的时候被初始化为MainScene,也就是说场景默认将从MainScene开始。
如果给run指定了场景名(字符串),那么项目启动后会直接进入该场景,这点有个好处是如果要调试设计某场景可以直接从这个场景进入,不必从其他场景进入了。也就是在main.lua中这么调用即可:
run('PlayScene') end 那么项目启动后会直接进入PlayScene场景,而不再是默认的MainScene场景。
我们现在不做改动,仍然接着默认流程分析,
MainScene为主场景, 创建并显示一张背景图,创建显示一个“Play”按钮,按钮的点击事件是进入PlayScene场景。
local
MainScene
=
class
(
"MainScene"
,
cc
.
load
"mvc"
).
ViewBase
)
MainScene:-- add background image display.newSprite("MainSceneBg.jpg") :move(center) :addTo(self)
-- add play button playButton = MenuItemImage:create("PlayButton.png",0)">"PlayButton.png") :onClicked(function() self:getApp():enterScene("PlayScene") end) Menu:playButton) :cx,43)">cy - 200) :self) MainScene
PlayScene场景:
PlayScene = "PlayScene",43)">ViewBase)
GameView = import(".GameView")
PlayScene:-- create game view and add it to stage gameView_ = GameView:create() :addEventListener(GameView.events.PLAYER_DEAD_EVENT,0)">handler(self,43)">onPlayerDead)) :start() :onPlayerDead(event) -- add game over text text = "You killed %d bugs",43)">gameView_:getKills()) Label:createWithSystemFont(text,0)">"Arial",255)">96) :align(CENTER,128)">-- add exit button exitButton = "ExitButton.png",0)">"ExitButton.png") :"MainScene") exitButton) :PlayScene
PlayScene场景创建游戏逻辑视图GameView并调用start函数开始游戏,绑定了一个游戏结束的事件,这个事件会在GameView中在触发游戏结束逻辑时发生,PlayScene由于绑定了该事件,则会在游戏结束时调用其绑定的回调事件,以显示战绩和分数,显示一个退出按钮,退出按钮事件为进入MainScene场景。
至此,场景的切换已经很清晰了,那么主要的游戏逻辑便是在GameView中了。
打开工程根目录下的配置文件config.json:
"init_cfg": { "isLandscape": true,122); font-weight:bold">"isWindowTop": false,122); font-weight:bold">"name": "redDefense",122); font-weight:bold">"width": "height": "entry": "src/main.lua",122); font-weight:bold">"consolePort": "uploadPort": "debugPort": "forwardConsolePort": "forwardUploadPort": "simulator_screen_size": [ { "title": "iPhone 3Gs (480x320)",0); font-weight:bold">"iPhone 4 (960x640)",0); font-weight:bold">"iPhone 5 (1136x640)",0); font-weight:bold">"iPad (1024x768)",0); font-weight:bold">"iPad Retina (2048x1536)",0); font-weight:bold">"Android (800x480)",0); font-weight:bold">"Android (854x480)",0); font-weight:bold">"Android (1280x720)",0); font-weight:bold">"Android (1920x1080)",255)">} ] } 可以看到
"entry": "src/main.lua",也就是说入口文件是main.lua,进而打开main.lua:
false) "src/") "res/")
"config" "cocos.init"
local function "app.MyApp"):end
local if not then end
执行main函数,main函数里加载MyApp创建并运行,进而打开MyApp.lua:
"MyApp",0); font-weight:bold">"mvc").function return MyApp
这里就有点看头,MyApp仅仅是继承自AppBase,onCreate函数只是初始化了下随机数种子,也就意味着更多的操作在AppBase中,我们打开分析:
"AppBase")
"app.views",0); font-weight:bold">"app.models",0); font-weight:bold">"MainScene",128); font-weight:bold">for in or {}) do if "table" "AppBase configs") true) -- event or local "%s.%s",128); font-weight:bold">function() return require(packageName) end,128); font-weight:bold">function(if not "'%s' not found:",packageName)) "load view error: ",128); font-weight:bold"> end) if and (or "userdata") return view:create(self,name) end "AppBase:createView() - not found view "%s" in search paths "%s"",0); font-weight:bold">",")),153)">AppBase
在前面的分析中知道main.lua是执行的是App的run函数,作为基类的AppBase,当然也要被调用run函数,因此直接看run函数:主要是创建并进入场景initSceneName,如果run的参数没有指定开始的场景则使用默认场景defaultSceneName,默认场景在构造函数的时候被初始化为MainScene,也就是说场景默认将从MainScene开始。
如果给run指定了场景名(字符串),那么项目启动后会直接进入该场景,这点有个好处是如果要调试设计某场景可以直接从这个场景进入,不必从其他场景进入了。也就是在main.lua中这么调用即可:
'PlayScene') end 那么项目启动后会直接进入PlayScene场景,而不再是默认的MainScene场景。
我们现在不做改动,仍然接着默认流程分析,
MainScene为主场景, 创建并显示一张背景图,创建显示一个“Play”按钮,按钮的点击事件是进入PlayScene场景。
local
MainScene
=
class
(
"MainScene"
cc
.
load
"mvc"
).
ViewBase
)
-- add background image "MainSceneBg.jpg") :-- add play button "PlayButton.png",0); font-weight:bold">"PlayButton.png") :function() self:"PlayScene") end) MainScene
PlayScene场景:
"PlayScene",0); font-weight:bold">".GameView")
-- create game view and add it to stage gameView_ = GameView:addEventListener(GameView.-- add game over text "You killed %d bugs",0); font-weight:bold">"Arial",128); font-style:italic">-- add exit button "ExitButton.png",0); font-weight:bold">"ExitButton.png") :"MainScene") PlayScene
PlayScene场景创建游戏逻辑视图GameView并调用start函数开始游戏,绑定了一个游戏结束的事件,这个事件会在GameView中在触发游戏结束逻辑时发生,PlayScene由于绑定了该事件,则会在游戏结束时调用其绑定的回调事件,以显示战绩和分数,显示一个退出按钮,退出按钮事件为进入MainScene场景。
至此,场景的切换已经很清晰了,那么主要的游戏逻辑便是在GameView中了。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|