写在前面的废话:
在CocoaChina上看到了“进击的贪吃蛇”这个活动,翻了一下论坛也没什么人真的把教程发出来,正好今天闲的没事就写写这东西吧。自己之前一直在用2.0版本的cocos2dx,对于3.0几次想开坑学习都因为各种原因放弃掉了,版本更新太快,C++11新特性不熟等等。今天花了一天时间把这个东西搞定,才发现前面那些基本只是借口,虽然C++11的新特性啥的依旧不是太会,不过也能照猫画虎用一用v3.0了,只要努力去做,肯定有些收获的。
自己本身就是个不喜欢啰嗦的人,之前也想写过博客什么的,结果写完之后发现寥寥几句似乎就没得说了,表达能力果然还需要磨练。废话不多说,为了让我这东西能让更多的人看懂,不妨就把目标群体定位在用过v2.0的却感觉对v3.0无从下手的人吧,因此并不会解释很多基础的东西。通过这个教程,应该就会发现3.0也没那么可怕。
创建工程:
我现在用的最新版v3.0rc1的创建方式,和以前v2.2的python脚本创建方式又有了些区别,改为了通过cocos-console来创建新工程。
具体的步骤可以参考子龙山人的教学视频,这里就不再赘述了。
视频地址:http://v.youku.com/v_show/id_XNjg1Mzc4ODQ0.html
创建开始:
创建开始界面我们并不新建文件,直接修改HelloWorldScene.h和.cpp。
开始界面有以下几个元素:"Start Game","Game Help", “Exit Game"的文字按钮,还有本身HelloWorld自带的那些东西(我删掉了关闭的按钮)。
因此我们要做的只是在原来代码的基础上添加我们的文字按钮以及设置回调函数就好。
看代码之前我们来认识v3.0和v2.0的区别之一,也就是类型名称的改动。其实很简单,只是以前带CC的东西全部去掉就好CCLayer 变成 Layer,CCSprite 变成 Sprite,仅此而已,当然也有些特例。感兴趣的可以看下:引擎中CCType.h里面写的东西。
我们来看下HelloWorldScene.h的代码:
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__
#include "cocos2d.h"
USING_NS_CC;
class HelloWorld : public cocos2d::Layer
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
CREATE_FUNC(HelloWorld);
void menuCloseCallback(Ref* pSender);
};
#endif // __HELLOWORLD_SCENE_H__
并没有修改任何代码,只是删掉了注释,没什么可多说的。不过我们有两点可以注意到:
1.按钮的回调函数的参数类型从以前的CCobject* 变成了 Ref*。
一般来讲,从v2.0到v3.0,类型名称的变化基本都是把开头的CC去掉即可。而CCobject算是个特例吧,直接变成了Ref。为了确认我特意试了下,并没有Object这么个类型。
2.创建scene的函数名称从scene变成了createScene。
然后是HelloWorldScene.cpp的代码:
USING_NS_CC;
Scene* HelloWorld::createScene()
{
auto scene = Scene::create();
auto layer = HelloWorld::create();
scene->addChild(layer);
return scene;
}
createScene函数和以前比没任何变化,还是那四句。
然后我们编写init函数。删掉原来的注释,在Point origin = Director::getInstance()->getVisibleOrigin();这句下面开始添加自己的代码
//创建文字按钮
auto labelStart = Label::create("Start Game", "宋体", 24);
auto labelHelp = Label::create("Game Help", "宋体", 24);
auto labelExit = Label::create("Exit Game", "宋体", 24);
auto uiStart = MenuItemLabel::create(labelStart, CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
uiStart->setTag(1);
uiStart->setPosition(Point(100,200));
auto uiHelp = MenuItemLabel::create(labelHelp, CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
uiHelp->setTag(2);
uiHelp->setPosition(Point(100,150));
auto uiExit = MenuItemLabel::create(labelExit, CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
uiExit->setTag(3);
uiExit->setPosition(Point(100,50));
auto menu = Menu::create(uiStart,uiHelp, uiExit, NULL);
menu->setPosition(Point::ZERO);
this->addChild(menu, 1);
我们可以看到,创建一个文本构成的ui菜单还是和以前一样,先创建文字标签,再创建对应的MenuItemLabel,最后创建Menu把MenuItemLabel都加进去,最后在让Layer添加Menu完事。
过程仍然一样,其中也有些不可忽视的东西: