转载自:http://cn.cocos2d-x.org/tutorial/show?id=1621
从Samples中找到CoinFlip文件夹,复制其中的 res 和 script 文件夹覆盖新建工程中的 res 和 script文件。
用player运行,游戏可正常打开。
打开main.lua
1 function __G__TRACKBACK__(errorMessage) 2 print("----------------------------------------") 3 print("LUA ERROR: " .. tostring(errorMessage) .. " ") 4 print(debug.traceback("", 2)) 5 print("----------------------------------------") 6 end 7
8 require("app.MyApp").new():run() --启动后执行 MyApp 脚本,并执行 run 方法。
main.lua 是lua脚本的启动文件。
无需改动。
打开 MyApp.lua
require("config")
require("framework.init")
require("framework.shortcodes") require("framework.cc.init") local MyApp = class("MyApp", cc.mvc.AppBase) function MyApp:ctor() MyApp.super.ctor(self) self.objects_ = {} end function MyApp:run() CCFileUtils:sharedFileUtils():addSearchPath("res/") display.addSpriteFramesWithFile(GAME_TEXTURE_DATA_FILENAME, GAME_TEXTURE_IMAGE_FILENAME) -- preload all sounds for k, v in pairs(GAME_SFX) do audio.preloadSound(v) end
self:enterMenuScene()
end function MyApp:enterMenuScene() self:enterScene("MenuScene", nil, "fade", 0.6, display.COLOR_WHITE) end function MyApp:enterMoreGamesScene() self:enterScene("MoreGamesScene", nil, "fade", 0.6, display.COLOR_WHITE) end function MyApp:enterChooseLevelScene() self:enterScene("ChooseLevelScene", nil, "fade", 0.6, display.COLOR_WHITE) end function MyApp:playLevel(levelIndex) self:enterScene("PlayLevelScene", {levelIndex}, "fade", 0.6, display.COLOR_WHITE) end return MyApp
run方法主要做了三件事:设置资源路径,加载游戏资源,进入主场景。
与此同时MyApp还封装了所有场景和它们的切换方法。
进入第一个场景——MenuScene
local AdBar = import("..views.AdBar") local BubbleButton = import("..views.BubbleButton")
开头两句 import 方法和c++中用处相同,MenuScene要用到以上两个子定义的类。
local MenuScene = class("MenuScene", function() return display.newScene("MenuScene") end)
class方法有两个参数,第一个参数是类名。第二参数可以通过两种形式传递参数,一种是传入一个函数,另一种方式是传入一个Quick的类或者是Lua对象。
当传入函数时,新创建的类会以传入的函数作为构造函数。当传入的是一个对象时,会以传入的对象为父类派生下来。
所以此处是新建了一个类。
接下来是ctor方法:
1 function MenuScene:ctor() 2 self.bg = display.newSprite("#MenuSceneBg.png", display.cx, display.cy) -- bg是self的一个属性。此处是一个Sprite,用于背景的添加。 3 self:addChild(self.bg) -- 将此 Sprite 节点添加到 MenuScene 这个节点中。 4 5 self.adBar = AdBar.new() -- 信息条:adBar。 6 self:addChild(self.adBar) 7 8 -- create menu 9 self.moreGamesButton = BubbleButton.new({ -- button 是 MenuScene 的一个属性 10 image = "#MenuSceneMoreGamesButton.png", 11 x = display.left + 150, -- 设置图片位置的坐标相对于边和底的距离 12 y = display.bottom + 300, 13 sound = GAME_SFX.tapButton, 14 prepare = function() 15 self.menu:setEnabled(false) -- 关闭 menu 键的功能,防止在item作用的时候menu键也作用 16 end, 17 listener = function() 18 app:enterMoreGamesScene() -- 此方法在MyApp.lua中
19 end, 20 }) 21 22 self.startButton = BubbleButton.new({ 23 image = "#MenuSceneStartButton.png", 24 x = display.right - 150, 25 y = display.bottom + 300, 26 sound = GAME_SFX.tapButton, 27 prepare = function() 28 self.menu:setEnabled(false) 29 end, 30 listener = function() 31 app:enterChooseLevelScene() 32 end, 33 })
34 35 self.menu = ui.newMenu({self.moreGamesButton, self.startButton}) 36 self:addChild(self.menu) 37 end
ctor 方法相当于构造函数,一旦new,就会调用ctor。
(信息条就是底下这个绿色的东西)
有用的信息:
display.width和display.height表示屏幕宽度
display.cx和display.cy表示屏幕的x轴中间位置和y轴中间位置
display.left和display.right表示屏幕的最左边和最右边(x轴坐标为0和display.width的点)
display.top和display.bottom表示屏幕的顶部和底部(y轴坐标为0和display.height的点)
display.CENTER、display.LEFT_TOP、display.CENTER_TOP等分别表示node的锚点位置。
ADBar.lua
1 local AdBar = {} 2 3 function AdBar.new() 4 local sprite = display.newSprite("#AdBar.png") 5 sprite:align(display.BOTTOM_CENTER, display.cx, display.bottom) 6 return sprite 7 end 8 9 return AdBar
AdBar 是一个二次封装的精灵,new时,将自动创建并返回一个设置好精灵帧、锚点、X坐标和Y坐标的精灵。
(二次封装的目的除了外部的方便调用外,最大的动能就是代码的复用!所以可以预测到后面的编写中必定将会继续用到这个信息条)