我们有C++基础,学习引擎总是急于求成,想立马做出一款简单的游戏给朋友玩。但是我们往往看了很多资料却一直不知道如何下手去写,有时候只要能走出第一步我们就会游刃有余,但是眼高手低的我们不是大神,需要有人指引一下。这里我就写一下我是如何入门学习cocos2dx3.1的,给大家参考一下。
如果你想第一天就写出微信打飞机,请耐心去阅读。我也是一个菜鸟,博客难免粗糙和出错,请大家谅解。加油吧!
我们创建工程后总会自带一个HelloWorld类,短短的几行代码就出来了一个游戏的雏形,请问我们真的理解它了吗?如果我们能早一点弄明白这几行代码,我们或许会比现在走得更远。
理解HelloWorld类
HelloWorld去掉退出按钮只有下面三个函数。
static cocos2d::Scene* createScene();
virtual bool init();
CREATE_FUNC(HelloWorld);//一定要自己看源码
这三个方法一定要做到透彻理解和重写。因为所有的游戏场景都需要这三个函数。
创建游戏HelloWorld场景的时候,只需要在AppDelegate写一句: Helloworld::createScene();
请看它的实现
// 'scene' is an autorelease object
auto scene = Scene::create();
// 'layer' is an autorelease object
auto layer = HelloWorld::create();
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
首先新建一个新场景,然后create一个HelloWorld层并添加到新创建的场景,最后返回这个场景给AppDelegate。
一个场景的创建和展示就是这么简单,但是你有没有发现HelloWorld中没有create呢?并且没有调用init()方法呢?我们在HelloWorld中没有在任何地方看到调用init初始化,那么这是在哪里调用的呢?
请看CREATE_FUNC的宏定义:
#defineCREATE_FUNC(__TYPE__) \
static __TYPE__*create() \
{ \
__TYPE__ *pRet = new __TYPE__(); \
if (pRet && pRet->init()) \
{ \
pRet->autorelease(); \
return pRet; \
} \
else \
{ \
delete pRet; \
pRet = NULL; \
return NULL; \
} \
}
\表示换行,因为宏定义代码如果放同一行阅读不方便。
可以看到CREATE_FUNC宏其实是定义了一个静态成员函数,这个函数可以new一个新的对象,并对其进行init()操作。
这样整个Helloworld的逻辑就清晰了:
外部类调用static cocos2d::Scene* createScene();来创建一个新的场景。 CREATE_FUNC(HelloWorld);是定义一个静态的create类成员函数,并在这个函数中调用virtual bool init();初始化这个场景。
以后每当我们新建一个场景的时候,按照这个格式即可。好了,下面该动手了。
现在请删除Helloworld新建一个叫MainScene的场景,完善该类,修改AppDelegate.cpp中的场景创建为auto scene = MainScene::createScene();运行展示新的场景。(这个时候整个屏幕还是黑暗的,,因为没有任何元素显示)。
注意:如果是新手,我建议你再看一下Helloworld里面这三句代码的定义。