$ cd #回到家目录,也可以放在别的目录提示:以上过程解压后的目录应该是cocos2d-x-2.1.4,你可能改下目录名,也可以保持不变。下面的内容将会把这个目录名用{cocos2d-x}代替。比如,我的{cocos2d-x}实际指代的是/Users/liusong/cocos2d-x 2、使用cocos2d-x自带的工具创建工程。
$ wget https://cocos2d-x.googlecode.com/files/cocos2d-x-2.1.4.zip
$ unzip cocos2d-x-2.1.4.zip
$ cd {cocos2d-x}/tools/project-creator提示:这里创建的工程名称MyGame会在后续教程中频繁出现,如果你不是使用这个名称,那么请注意在后面自行更改 3、下载、安装、配置CocosBuilder的最新版(此时最新版为3.0 alpha4)。 在这里我推荐使用Git来clone源码的方式来下载CocosBuilder,因为目前CocosBuilder尚在发展中,并不太完善和稳定,下载源代码的好处是今后遇到问题时可以自己通过追踪源代码来解决,也可以及时合并最新的补丁而不用等官方发布新版。
$ ./create_project.py -project MyGame -package com.MyCompany.AwesomeGame -language javascript #创建一个名叫MyGame的跨平台工程,会在{cocos2d-x}/projects/目录下自动生成MyGame工程代码
$ cd ../../projects/MyGame #切换到工程目录
$ rm -rf Resources/ #删除默认生成的资源目录,后面会用到CocosBuilder生成的资源目录
$ cd #回到家目录,也可以放在别的目录在打开的Xcode工程中,确认左上角的scheme是CocosBuilder而不是其他,直接点击“Run”,经过一段时间的编译运行后CocosBuilder将会被打开。这时候,你可以在CocosBuilder根目录下的build文件夹中看到Xcode生成的CocosBuilder.app文件。今后如果有需要启动CocosBuilder,就可以直接打开这个来启动,无须再在Xcode中编译运行,除非是你修改过CocosBuilder的源码。这个我们后面会提到。 在打开的CocosBuilder界面中新建一个CocosBuilder工程(File->New->New Project),注意这里的命名一定和之前的项目名称一样,并且要保存在工程目录。如下图所示:
$ git clone https://github.com/cocos2d/CocosBuilder.git
$ cd CocosBuilder
$ git submodule update --init --recursive
$ open ./CocosBuilder/CocosBuilder.Xcodeproj #打开CocosBuilder的Xcode工程
$ cd {cocos2d-x}/projects/MyGame #切换到项目根目录
$ vim Classes/AppDelegate.cpp
最后,修改applicationDidFinishLaunching的内容如下:
bool AppDelegate::applicationDidFinishLaunching()全部修改完成后保存,退出编辑。 仔细对比不难发现,这里所做的修改,是在应用启动的时候根据设备类型和屏幕分辨率来设置资源搜索路径。这个步骤的设置常常会被忽略掉,我本人也曾经在这里浪费掉很多时间。究其原因,是CocosBuilder给人留下了“自动适配多种分辨率”印象,从而下意识地认为这个适配工作将会由引擎来自动完成,而实际情况却不是这样。CocosBuilder可以以某个分辨率下的资源为准,通过自动缩放来为生成适配其他分辨率的资源,但游戏中如何加载这些不同的资源却需要手工设置规则。 修改iOS工程配置
{
// initialize director
CCDirector *pDirector = CCDirector::sharedDirector();
pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
CCSize designSize = CCSizeMake( 480,320);
CCSize resourceSize = CCSizeMake( 960,640);
CCSize screenSize = CCEGLView::sharedOpenGLView()->getFrameSize();
std::vector<std::string> resDirOrders;
TargetPlatform platform = CCApplication::sharedApplication()->getTargetPlatform();
if (platform == kTargetIphone || platform == kTargetIpad)
{
std::vector<std::string> searchPaths = CCFileUtils::sharedFileUtils()->getSearchPaths();
searchPaths.insert(searchPaths.begin(), "Published-iOS");
CCFileUtils::sharedFileUtils()->setSearchPaths(searchPaths);
if (screenSize.height == 1536)//iPad-hd
{
CCLog("resources-ipadhd");
resourceSize = CCSizeMake(2048, 1536);
resDirOrders.push_back("resources-ipadhd");
}
else if (screenSize.height == 768)//iPad
{
CCLog("resources-ipad");
resourceSize = CCSizeMake(1024, 768);
resDirOrders.push_back("resources-ipad");
}
else if (screenSize.height == 640)//iPhone 4/4s/5
{
CCLog("resources-iphonehd");
resourceSize = CCSizeMake( 960,640);
resDirOrders.push_back("resources-iphonehd");
}
else//iPhone 3GS
{
CCLog("resources-iphone");
resourceSize = CCSizeMake(480, 320);
resDirOrders.push_back("resources-iphone");
}
}
else if (platform == kTargetAndroid || platform == kTargetWindows)
{
if (screenSize.height > 720)
{
resourceSize = CCSizeMake( 960,640);
resDirOrders.push_back("resources-large");
}
else if (screenSize.height > 568)
{
resourceSize = CCSizeMake(480, 720);
resDirOrders.push_back("resources-medium");
}<
else
{
resourceSize = CCSizeMake(320, 568);
resDirOrders.push_back("resources-small");
}
}
CCFileUtils::sharedFileUtils()->setSearchResolutionsOrder(resDirOrders);
pDirector->setContentScaleFactor(resourceSize.width/designSize.width);
CCEGLView::sharedOpenGLView()->setDesignResolutionSize(designSize.width, designSize.height, kResolutionNoBorder);
// turn on display FPS
pDirector->setDisplayStats(true);
// set FPS. the default value is 1.0/60 if you don't call this
pDirector->setAnimationInterval(1.0 / 60);
ScriptingCore* sc = ScriptingCore::getInstance();
sc->addRegisterCallback(register_all_cocos2dx);
sc->addRegisterCallback(register_all_cocos2dx_extension);
sc->addRegisterCallback(register_all_cocos2dx_extension_manual);
sc->addRegisterCallback(register_cocos2dx_js_extensions);
sc->addRegisterCallback(register_CCBuilderReader);
sc->addRegisterCallback(jsb_register_chipmunk);
sc->addRegisterCallback(jsb_register_system);
sc->addRegisterCallback(JSB_register_opengl);
sc->addRegisterCallback(MinXmlHttpRequest::_js_register);
sc->addRegisterCallback(register_jsb_websocket);
sc->start();
CCScriptEngineProtocol *pEngine = ScriptingCore::getInstance();
CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine);
ScriptingCore::getInstance()->runScript("main.js");
return true;
}
$ open proj.ios/MyGame.Xcodeproj/ #打开iOS工程
iOS工程打开后,分别做以下三件事:
可以看到Resources分组下的main.js, res, src是显示红色的,这些文件或文件夹在此前的步骤里已经连带Resources目录删除而不存在,但其引用关系依然在,所以我们将其选中并右键点选“delete”删除。
$ cd {cocos2d-x}/projects/MyGame/Published-HTML5提示:python -m SimpleHTTPServer会在本机启动一个WebServer,监听8000端口,其默认目录即是执行命令所在的当前目录。因此注意要切换到你的Published-HTML5目录下执行。 当屏幕出现类似如下提示时表示WebServer启动成功:
$ python -m SimpleHTTPServer &
Serving HTTP on 0.0.0.0 port 8000 ...这时候打开浏览器,输入http://localhost:8000即可在浏览器中启动由CocosBuilder为我们自动生成的游戏。 至此,我们的开发环境已经全部搭建完成,从此,我们就可以开始一种全新的、完全在CocosBuilder中进行游戏开发的开发体验了。接下来,我们会以CocosBuilder为MyGame工程默认创建的资源为基础,通过示例讲解如何在CocosBuilder中进行JSB的开发。 三、在CocosBuilder中进行游戏开发 打开MyGame的CocosBuilder工程(也可以用图形界面的菜单选项打开File->Open):
$ open {cocos2d-x}/projects/MyGame/MyGame.ccbproj
其界面大致介绍如下图:
$ vim {cocos2d-x}/extensions/CCBReader/CCLayerLoader.cpp
将
#define PROPERTY_TOUCH_ENABLED "isTouchEnabled"
#define PROPERTY_ACCELEROMETER_ENABLED "isAccelerometerEnabled"
#define PROPERTY_MOUSE_ENABLED "isMouseEnabled"
#define PROPERTY_KEYBOARD_ENABLED "isKeyboardEnabled"
替换为:#define PROPERTY_TOUCH_ENABLED "touchEnabled"这个问题已经存在了较长的时间,但至今最新版本依然没有得以解决。 做完以上修改后,我们回到CocosBuilder。双击打开MainScene.ccb,选中根节点(CCLayer),我们在右侧最下面的CCLayer属性设置中可以看到四个选项,其各自的含义解释如下图:
#define PROPERTY_ACCELEROMETER_ENABLED "accelerometerEnabled"
#define PROPERTY_MOUSE_ENABLED "mouseEnabled"
#define PROPERTY_KEYBOARD_ENABLED "keyboardEnabled"
MainScene.prototype.onDidLoadFromCCB = function()以上代码中,onDidLoadFromCCB方法会在ccb文件加载完成后自动调用,类似iOS中的viewDidLoad。我们在onDidLoadFromCCB中分别将三种触屏事件转发给控制器自定义的方法去处理。在触屏开始事件的处理方法onTouchesBegan中,我们将触屏位置信息转换成文本显示在屏幕上,实现了我们的目标。另外两个onTouchesMoved和onTouchesEnded暂时没有用上,但我们应该能就此理解它们的用法了。 2、HTTP网络请求 为了更好地演示XMLHttpRequest的用法,我们利用前面配置HTML5环境时开启的WebServer来提供一个HTTP服务接口,该接口直接返回一段JSON格式的字符串,JavaScript将在接收到接口返回的数据时进一步解析处理。
{
cc.log('MainScene ccb file has been loaded!');
this.rootNode.onTouchesBegan = function( touches, event) {
// 将触屏开始事件转发给控制器 (this)
this.controller.onTouchesBegan(touches, event);
return true;
};
this.rootNode.onTouchesMoved = function( touches, event) {
// 将触屏移动事件转发给控制器 (this)
this.controller.onTouchesMoved(touches, event);
return true;
};
this.rootNode.onTouchesEnded = function( touches, event) {
// 将触屏结束事件转发给控制器 (this)
this.controller.onTouchesEnded(touches, event);
return true;
};
};
MainScene.prototype.onTouchesBegan = function(touches, event)
{
// 修改文本内容
this.helloLabel.setString("TOUCH START: "+parseInt(touches[0].getLocation().x)+", "+parseInt(touches[0].getLocation().y));
};
MainScene.prototype.onTouchesMoved = function(touches, event)
{
// do some staff here
};
MainScene.prototype.onTouchesEnded = function(touches, event)
{
// do some staff here
};
$ cd {cocos2d-x}/projects/MyGame/Published-HTML5以上操作在WebServer的根目录创建了一个test.json文件,内容是一段JSON格式的文本。我们的目标是玩家点击屏幕上的按钮时向http://localhost:8000/test.json发起一个HTTP请求,并将返回数据中data字段的内容打印在屏幕上。 同样,双击打开MainScene.js,将MainScene.prototype.onPressButton的方法修改如下:
$ echo '{"data":"I am from the remote server"}' > test.json
// Create callback for button
MainScene.prototype.onPressButton = function()
{
// Rotate the label when the button is pressed //this.helloLabel.runAction(cc.RotateBy.create(1,360)); //新增以下代码 var theHelloLabel = this.helloLabel; var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState==4) {// 4 = "loaded" if (xhr.status==200) {// 200 = "OK" var response = JSON.parse(xhr.responseText); cc.log(response); theHelloLabel.setString(response.data); } else { cc.log("Problem retrieving JSON data:" + xhr.statusText); } } }; //发起一个GET请求 xhr.open("GET", "http://localhost:8000/test.json"); xhr.send(null);
}; 3、多分辨率适配方案[待更新,欢迎提交] 4、WebSocket[待更新,欢迎提交] 5、Plugin-X整合绑定[待更新,欢迎提交] 6、自定义第三方库的绑定[待更新,欢迎提交] 7、在线资源更新解决方案[待更新,欢迎提交] (招聘广告:本教程的作者目前正在创业做一个原创的社交娱乐项目,目前团队已经有5个人,分别是2个技术、1个策划、1个产品和1个美术。产品为原创且很多创新,题材也比较新颖,不是山寨和换皮,未来发展空间比较大。团队目前在寻找熟悉Cocos2d-x的朋友合作,需要精通C++,以及有良好的学习能力,欢迎前来了解情况。联系邮箱:loosengle ## 163.com QQ:八零四五*三七)