【正文】
上一篇我们已经了解了一部分项目开发相关的目录结构,今天我们依然继续为大家介绍我们这套框架的一些访问更为频繁的目录结构。也就是“main/bbframework/res”和“main/bbframework/script/app”底下的目录结构。
话不多说,我们先来看下“main/bbframework/res”(简称:“res”),也就是资源文件夹。
上图就是res文件夹的子目录,其中“ccb”里面是用于CocosBuilder开发方式使用的资源路径,简称为“ccb”。因为现在还没有使用ccb的方式开发,所以先忽略。“db”里面是数据库文件,“fnt”存放字体文件,“i18n”里面存放的是国际化资源,“img”里面存放图片、粒子文件等等。“mov”里面是视频,现在公司盒子的开场动画就放在这里。“plg”放置框架的一些插件,剩下的“snd”里面存放的是音频资源。除了以上这些子目录之外,“bb.bin”文件里面就是我们的bbframework的框架了,我们虽然可以在core里面看到框架的代码,但是游戏真正使用的框架是打包成bb.bin文件的。“box.bin”里面打包的是框架的盒子,从游戏启动的开始到开场动画、公司Logo、巴士车等等都是在盒子里面的。
除了以上这些之外,其实现在的版本里面还有“g”和“box”两个子目录,里面存放的是盒子的一些资源,这些我们暂且不说,到了项目发布阶段自然而然就知道了。剩下的“framework_precompiled.zip”也是框架要引入的增量包,我们现在也先忽略。
在以上这些目录里面我们访问较多的应该是i18n、img和snd这三个文件夹。我们先来看snd,snd里面有两个子目录,分布是“effect”和“music”,也就是音效和音乐。在游戏里面,有很多操作反馈的配音,如打斗时武器刀剑撞击在一起的声音等,都是一些短促的音频,我们称之为“音效”,通常我们会把这些放在“snd/effect”里面。除了音效,游戏里面还有一些比较长的音频,如背景音乐之类的,我们通常都放在“snd/music”里面。因为snd文件夹是bbframework框架的默认位置,所以对于音频的调用,我们通常都是从snd下一级目录开始引用。例如我有个音频文件放在“main/bbframework/res/snd/effect/test.mp3”,那我游戏里面要播放这个音效,我只要指定播放路径为“effect/test.mp3”就可以了。bbframework会自动索引到snd目录下去找。
看完音效存放目录,我们接下来看img这个目录。在res/img目录底下有“x2”、“x4”、“x8”、“”和“xx”几个子目录,现在公司为了适配不同的设备分辨率,采用了不同的图片资源。“x2”里面放置的资源我们通常称为“2倍图”、“普清图”或者“低清图”,相对应的“x4”里面放置的就是“高清图”或者叫做“4倍图”。至于“x8”和“xx”目前一般是用不到。对于二倍图和四倍图,我们项目现在统一使用四倍图进行开发,等到了测试阶段我们通过工具直接缩图,把图片统一缩小到二倍图,然后复制到x2目录底下即可。因此,我们通常在开发的时候都会要求美术导出的四倍图的图片分辨率都必须是偶数,否则缩成二倍图的时候会出现大小偏差。另外,在ios平台我们一般会保留二倍图和四倍图。然后bbframework根据设备分辨率去读取对应分辨率的图片。在android平台上,由于设备性能等问题,我们会在代码里面强制设置读取x2图,所以通常发布的时候我们只会保留x2底下的资源,其他都删除掉,以此来降低apk包的大小。
同样的,x2和x4这两个路径也和snd一样,是bbframework默认的资源索引位置。换言之,我有张图片放在“main/bbframework/res/img/x4/gameplay/bg.png”,当我游戏里面要用到这张图的时候我只要把路径设置成“gameplay/bg.png”即可。
看完img和snd,接下来我们来看下国际化资源文件夹(也就是“i18n”),其目录如下:
其中,“ar”代表阿拉伯语,“de”代表德语,“en”代表英语,“fr”代表法语,“ja”代表日本,“ko”代表韩语,“ru”代表俄语,“zh”表示中文简体,“zht”表示中文繁体。目前公司国际化的语言暂时只有以上9种,其它的我们暂且忽略。
打开以上任意一个文件夹,其子目录都包含“ccb”、“db”、“fnt”、“img”、“mov”和“snd”这6个基本文件夹,有点类似于“man/bbframework/res”的结构。实际上,这些还真的和res里面的一样,其每一个文件夹都是和res底下的同名目录一样的用途。只不过这里存放的是针对某一种特定语言的资源。比如我们游戏的名称叫做“点点画”,那么美术会给我们程序一张写着“点点画”三个字的图片,我们将其重命名为“title.png”。然后将图片放在“res/img/x4/gameplay”文件夹里面,然后游戏里面直接用“gameplay/title.png”来引用。但是这样有个问题,这张图只有中文简体有用,在英文环境下,游戏的名称应该显示英文。这时候美术会再给程序一个写着“Dot Magic”的图片,要求我们在英文环境下显示英文的标题。所以,我们会将中文的“点点画”图片放在“res/i18n/zh/img/x4/gameplay/title.png”,然后将英文的“Dot Magic”图片放在“res/i18n/en/img/x4/gameplay/title.png”。然后在“res/img”底下存放默认的资源。中文版本(只包含中文简体和繁体)的包里面的“res/img”底下存放中文简体资源。国际化版本(非中文版本)里面默认存放的都是英文资源。
bbframework在读取图片资源的时候会先去国际化文件夹里面根据当前设备语言环境读取相应的资源,当找不到该资源后才会去“res/img”里面去读取,音频等其他资源也是类似。
看完资源目录结构,我们回到“main/bbframework/script”底下的“app”下,我们将core和script拖拽到Sublime里面。
点开“script/app”,底下有很多的子目录,那每一个都是我们项目的每一个模块。现在我们基本是以场景来划分模块的,加入我们要新建一个测试用的模块“test”,那么我就会在app目录下新建一个文件夹。我们可以右键“app”,点击“New Folder...”,这时候在Sublime底部会出现一个文本输入框,我们输入小写的“test”,然后回车,这样Sublime就会在app目录下生成一个名为“test”的文件夹。注意,这里必须是小写的,因为后面框架在跳转的时候会根据场景名称来自动获取所在模块的路径,而那个路径里面的模块名称会默认转换为小写,所以这里必须用小写,不然会出问题,别问我为什么模拟器跑的好好的,这是个秘密。
在“app/test”底下我们同样创建3个文件夹“layer”、“node”和“scene”,也同样是小写的,这3个文件夹是bbframework每个模块的默认文件结构。“scene”里面放置的是模块的场景类文件,“layer”里面是场景的所有的层文件,“node”里面放置的是层里面所有的精灵节点的类文件。
对于Cocos2D系列的引擎,其游戏界面的结构就是场景(Scene)里面包含一个或多个的层(Layer),层里面包含零个或多个的精灵(Sprite)、节点(Node)或者层(Layer)。在Cocos2D里面层是可以添加到其他层里面去的。
我们在“app/test/scene”里面新建一个文件,命名为“TestScene.lua”,新建文件我们可以通过快捷键“Ctrl”+“N”来创建或者右键“scene”,选择“New File”来新建一个文件。Sublime在新建文件的时候是不需要输入文件名的,当只有你保存该文件(按下“Ctrl”+“S”)的时候,它会弹出对话框,让你选择保存位置和输入文件名。Sublime支持非常多的文件格式,所以我们在输入文件名的时候一定要输入文件的后缀名,否则Sublime是不会自动添加“.lua”为它的默认后缀名的,这点一定要注意。(当你命名保存文件,并输入文件名后,发现代码关键字没有高亮显示或者智能提示不可用时,一定要先检查是否忘记输入文件扩展名了。)如果发现命名错误,我们可以直接右键文件名,选择“Rename...”来修改文件名,这时候会在Sublime的底部打开输入框,你可以在那里修改文件名,然后回车确定。
在创建场景文件的时候一定要注意,我们通常会用驼峰命名法,每个单词首字母大写,其它小写,以此来分隔不同的单词。然后文件名一定以“Scene.lua”结尾。场景的一般模板如下:
--[[ Copyright (c) 2012-2013 Baby-Bus.com http://www.baby-bus.com/LizardMan/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ]] --[[!-- 场景类,定义场景相关操作方法及逻辑实现。 - 定义场景功能方法。 ]] ---------------------- -- 类 ---------------------- local M = classScene("Test") ---------------------- -- 公共参数 ---------------------- -- [常量] -- .. -- [操作变量] -- .. ---------------------- -- 构造方法 ---------------------- --[[-- 构造方法,定义视图实例初始化逻辑 ### Parameters: - table **params** 参数集合 ### Return: - object 对象实例 ]] function M:ctor(params) self:assertParameters(params) end ---------------------- -- 视图渲染 ---------------------- --[[-- 视图渲染,处理视图结点加载、事件绑定等相关操作 ]] function M:onRender() end ---------------------- -- 结点析构 ---------------------- --[[-- 视图析构,处理视图结点卸载、事件解除绑定等相关操作 ]] function M:onDestructor() end ---------------------- -- 模板方法 ---------------------- --[[-- 获得层名称集合, 用于动态定义该场景需要加载的层 ### Returns: - string... 层名称1, 层名称2, ... ]] function M:getLayerNames() return "Main" end --[[-- 获得获得信息集合, 用于动态定义该场景需要加载的资源(纹理, 帧等) ### Returns: - string|table... 帧名称1|{资源名称,类型,自动清理,图片后缀(包含.)}, ... ]] function M:getResourceNames() return end --[[-- 获得广告布局枚举 ### Links: UNative@addAd 参看ADLayout枚举 ### Returns: - number 广告布局枚举 ]] function M:getAdLayout() return AD_LAYOUT_TOP_CENTER end ---------------------- -- 验证 ---------------------- -- 验证参数 function M:assertParameters(params) end return M
Lua以“-- 注释内容”为单行注释,以“--[[ 注释内容 ]]”为多行注释。
在上面的“local M = classScene("Test")”这行便是创建了一个场景,保存在局部变量“M”里面,在文件最后,将M返回出去。classScene()是个全局函数,用来创建一个场景对象。其参数是场景模块的名称,注意这里的名称没有“Scene.lua”我们只要输入前缀即可,到时候进行场景跳转我们也只需要写“Test”即可,bbframework会自动在后面加上“Scene”后缀。
同样我们在“layer”文件夹下新建“MainLayer.lua”,同样的这个层的代码里面层的名称只需要写“Main”,而不用接“Layer”后缀,这点和场景是一样的,bbframework都会为我们自动配置。我们注意到在场景里面有个函数叫做“getLayerNames()”,里面返回了一个“"Main"”,这个就是场景要添加的层的名称,代码执行到这里的时候,bbframework会自动到当前场景模块的layer文件夹下寻找“MainLayer.lua”文件。
接下来我们来看下“MainLayer.lua”里面的代码:
--[[ Copyright (c) 2012-2013 Baby-Bus.com http://www.baby-bus.com/LizardMan/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ]] --[[!-- 场景层类,定义层相关操作方法及逻辑实现。 - 定义场景层功能方法。 ]] ---------------------- -- 类 ---------------------- local M = classLayer("Main") ---------------------- -- 公共参数 ---------------------- -- [常量] -- .. -- [操作变量] -- .. ---------------------- -- 构造方法 ---------------------- --[[-- 构造方法,定义视图实例初始化逻辑 ### Parameters: - table **params** 参数集合 ### Return: - object 对象实例 ]] function M:ctor(params) -- [超类调用] M.super.ctor(self, params) end ---------------------- -- 结点渲染 ---------------------- --[[-- 视图渲染,处理视图结点加载、事件绑定等相关操作 ]] function M:onRender() M.super.onRender(self)
end ---------------------- -- 结点析构 ---------------------- --[[-- 视图析构,处理视图结点卸载、事件解除绑定等相关操作 ]] function M:onDestructor() -- [超类调用] M.super.onDestructor(self) end return M
然后,我们打开“main/bbframework/script/game.lua”文件,在函数“starup()”里面添加“game:enterScene("Test")”这行代码来进行场景跳转。这个函数接收的参数就是我们场景的名称,注意不加“Scene”后缀,注意大小写。也别问我为什么,我是只能告诉你,说多了都是泪啊!
完成了以上几个操作,这个时候我们就可以打开quick-x-player模拟器。点击“open”,弹出“Project Configure”界面
点击“Select...”按钮,索引到我们的“main/bbframework”目录底下,其实是为了找到我们的脚本(script)和资源(res)。然后点击“确定”按钮,再点击“Open Project”打开项目,这时候模拟器就开始运行我们的项目了。只是这个时候我们还是什么也看不见,模拟器里面黑黑一片,这是因为我们还没有往我们的游戏里面添加任何东西,只要一个场景和一个空的层。
好了,这算是一个不成型的HelloWorld项目,因为什么也没有看到,下一次,我将为大家介绍如何在层里面添加精灵,如何创建一个自定义的精灵类并实例化。
原文:http://www.cnblogs.com/babybus-ios/p/bbframework-003.html