新建工程以后总要看看长什么样吧,工程结构和原来的相同,不同的是helloworld中的几处有点区别。新建类的时候看到了auto这个关键字,原来是声明局部变量的时候使用的,但是我们很少用,c++11的时候就不代表这个意思了,现在是根据初始化自动推断变量的类型。cocos2d-x中的父类不是CCObject了,取而代之的是Ref。回调函数的使用方面也有不同,有了一个宏CC_CALLBACK_用来绑定函数和对象的,其他2.x中所有的回调函数都变成了这个宏,具体的区别我在代码中说了,下面看代码吧!

#include "HelloWorldScene.h"

USING_NS_CC;

Scene* HelloWorld::createScene()
{
	//auto原来代表的是临时变量,比如写在这个函数中的int i,前边默认是有一个auto的,但是由于这个auto关键字很少使用
	//在c++11中已经没有这个意思了,现在的auto是根据初始化表达式自动的推断变量的类型,记住变量一定要有初始化啊
    auto scene = Scene::create();

    auto layer = HelloWorld::create();

    scene->addChild(layer);

    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    if ( !Layer::init() )
    {
        return false;
    }

    Size visibleSize = Director::getInstance()->getVisibleSize();
    Point origin = Director::getInstance()->getVisibleOrigin();

    auto closeItem = MenuItemImage::create(
                                           "CloseNormal.png",
                                           "CloseSelected.png",
										   //CC_CALLBACK_1的作用是将回调函数和this对象绑定起来,3.0使用了c++11的特性,除了有
										   //CC_CALLBACK_1还有CC_CALLBACK_0、CC_CALLBACK_2、CC_CALLBACK_3分别代表的就
										   //是回调函数必须有的参数的个数,像menuCloseCallback必须有一个参数,所以这里是1,在他
										   //的后边可以跟上自己希望传递的参数,我这里传递了1,2在menuCloseCallBack的声明处就加上
										   //这俩个参数,这么想想确实是挺方便的
                                           CC_CALLBACK_1(HelloWorld::menuCloseCallback, this,1,2));

	closeItem->setPosition(Point(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,
                                origin.y + closeItem->getContentSize().height/2));

    auto menu = Menu::create(closeItem, NULL);
    menu->setPosition(Point::ZERO);
    this->addChild(menu, 1);

    auto label = LabelTTF::create("Hello World", "Arial", 24);

    label->setPosition(Point(origin.x + visibleSize.width/2,
                            origin.y + visibleSize.height - label->getContentSize().height));

    this->addChild(label, 1);

    auto sprite = Sprite::create("HelloWorld.png");

    sprite->setPosition(Point(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

    this->addChild(sprite, 0);

    return true;
}

//3.0的Ref类替代了CCObject类,成为了所有类的父类
void HelloWorld::menuCloseCallback(Ref* pSender,int i,int j)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
	MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
    return;
#endif
	CCLog("%d %d",i,j);

	//3.0获取单例对象的方法改为了getInstance
    Director::getInstance()->end();

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif
}

运行游戏,感觉窗口有点大啊,我们就在appdelegate中设置一下吧!

bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if(!glview) {
        glview = GLView::create("My Game");
		//设置游戏窗口的大小
		glview->setFrameSize(480,320);
        director->setOpenGLView(glview);
    }

    // turn on display FPS
    director->setDisplayStats(true);

    // set FPS. the default value is 1.0/60 if you don't call this
    director->setAnimationInterval(1.0 / 60);

    // create a scene. it's an autorelease object
    auto scene = HelloWorld::createScene();

    // run
    director->runWithScene(scene);

    return true;
}

通过HelloWorld看看3.0中的几个新特性

有关区别总结如下,虽然现在还没有用到,先贴上来,用到的时候方便查看。

1、以CC开头的类从此去掉CC。

2、单例的操作换成了getInstance() 和 destroyInstance()。

3、新的触摸机制,后续文章会写。

4、回调函数的用法,本人说明了一部分,其他的后续说明。

5、get属性的获取使用get前缀,如node->getBoundingBox()。

6、一些宏的变化。

// in v2.1
ccColor3B color3B = ccc3(0, 0, 0);
ccc3BEqual(color3B, ccc3(1, 1, 1));
ccColor4B color4B = ccc4(0, 0, 0, 0);
ccColor4F color4F = ccc4f(0, 0, 0, 0);
color4F = ccc4FFromccc3B(color3B);
color4F = ccc4FFromccc4B(color4B);
ccc4FEqual(color4F, ccc4F(1, 1, 1, 1));
color4B = ccc4BFromccc4F(color4F);

color3B = ccWHITE;

// in v3.0
Color3B color3B = Color3B(0, 0, 0);
color3B.equals(Color3B(1, 1, 1));
Color4B color4B = Color4B(0, 0, 0, 0);
Color4F color4F = Color4F(0, 0, 0, 0);
color4F = Color4F(color3B);
color4F = Color4F(color4B);
color4F.equals(Color4F(1, 1, 1, 1));
color4B = Color4B(color4F);

color3B = Color3B::WHITE;

7、还有不少,用到什么改什么吧。