当前位置:编程学习 > wap >>

[木头 cocos2d-x]HelloWorld倒底怎么玩?


Cocos2D-x之HelloWorld倒底怎么玩?
 
看了教程,还是要自己写写HelloWorld才能记住,于是在写HelloWorld之前,还是要看看别人的HelloWorld才行~
 
(以下CS-X均为Cocos2D-X的缩写)
 
1. 导演类
用VS新建一个CS-X工程,然后自己帮我们生成一个HelloWorld工程,然后看看AppGelegate.app文件,里面有这个函数:
bool AppDelegate::applicationDidFinishLaunching()
{
    // initialize director
    CCDirector *pDirector = CCDirector::sharedDirector();
    pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
 
    // enable High Resource Mode(2x, such as iphone4) and maintains low resource on other devices.
//     pDirector->enableRetinaDisplay(true);
 
    // 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);
 
    // create a scene. it's an autorelease object
    CCScene *pScene = HelloWorld::scene();
 
    // run
    pDirector->runWithScene(pScene);
    return true;
}
因为我还是新手,只能从表面上来理解。
 
CCDirector类,是导演类,在CS-X的里,构建一个游戏,就是构建一个世界(其实我觉得所有的程序都是在构建世界~噗),这个世界由导演类去指导演绎,于是,在打开游戏的第一步时,导演告诉程序:
pDirector->setDisplayStats(true);      // 要显示FPS数值,方便我查看游戏效率
pDirector->setAnimationInterval(1.0 / 60);    // 游戏每秒播放多少帧(这里是60帧)
pDirector->runWithScene(pScene);       // 进入游戏,首先要显示哪个场景
 
于是代码都很简单,主要是要留意,一个类继承了CCScene就可以作为场景使用,然后用导演类的runWithScene方法运行游戏的第一个场景,但是以后切换场景就要用replaceScene方法了。
 
2. 自定义场景
于是现在来看看自定义的场景类,先看看HelloWorldScene.h头文件,很短,看着舒服~
class HelloWorld : public cocos2d::CCLayer
{
public:
    virtual bool init();
    static cocos2d::CCScene* scene();
 
    void menuCloseCallback(CCObject* pSender);
 
    CREATE_FUNC(HelloWorld);
};
menuCloseCallback函数我觉得可以暂时不理它,算了,还是忍不住要理一下。它是一个回调函数,没了,仅此而已,就是Android的OnClickListener里面的onClick函数一样,但是又有点不一样,糟糕,我不解释了,乱了,这不是重点~!
 
scene函数是不可缺的,它是CCLayer的类,HelloWorld里要重写这个函数的。那scene函数在哪个地方会用到?还记得之前那段代码吗?新建一个场景类的时候是这样的:
// create a scene. it's an autorelease object
    CCScene *pScene = HelloWorld::scene();
 
    // run
    pDirector->runWithScene(pScene);
好了,就是这样的。
 
再来看看CREATE_FUNC(HelloWorld);这个我纠结了很久,CREATE_FUNC是一个宏(应该是的,我对C++只停留在初级语法):
#define CREATE_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实际上就是create函数,准确的说,是重写了CCLayer里的create函数,看看CCLayer的create函数:
CCLayer *CCLayer::create()
{
    CCLayer *pRet = new CCLayer();
    if (pRet && pRet->init())
    {
        pRet->autorelease();
        return pRet;
    }
    else
    {
        CC_SAFE_DELETE(pRet);
        return NULL;
    }
}
是的,CREATE_FUNC的作用只不过是把create的返回值改成继承了CCLayer的实际子类(有点晕,仔细逻辑一下~)
 
好了,我假设我们已经懂了CREATE_FUNC的作用了,不~!还没呢~!看看
HelloWorldScene.cpp里是怎么重写scene函数的:
CCScene* HelloWorld::scene()
{
    CCScene * scene = NULL;
    do
    {
        // 'scene' is an autorelease object
        scene = CCScene::create();
        CC_BREAK_IF(! scene);
 
        // 'layer' is an autorelease object
        HelloWorld *layer = HelloWorld::create();
        CC_BREAK_IF(! layer);
 
        // add layer as a child to scene
        scene->addChild(layer);
    } while (0);
 
    // return the scene
    return scene;
}
 
于是我们发现了,虽然HelloWorld自称是场景类,但是导演要的并不是它~!导演还是要了一个真正的CCScene类,不信你看:
            scene = CCScene::create();
这里创建了一个真正的CCScene类。
 
还不够,再看:
    HelloWorld *layer = HelloWorld::create();
    scene->addChild(layer);
HelloWorld只是作为一个layer(一个层),它被添加到刚刚创建的那个CCScene类了。好吧,现实很残酷,尽管HelloWorld基础了场景类,可它依旧不是一个真正的场景~!
 
好,紧接着,不要放松,还记得刚刚create函数里有这几句吗?
if (pRet && pRet->init())
    {
        pRet->autorelease();
        return pRet;
    }
 
OK,我知道大家还记得的,于是刚刚拿两句又还记得吗?
HelloWorld *layer = HelloWorld::create();
scene->addChild(layer);
 
是的,也就是说,场景类的init函数是一定会被调用的。
于是,这就表示,继承了CCScene的类,必须要有这三个家伙:
public:
    virtual bool init();
    static cocos2d::CCScene* scene();
    CREATE_FUNC(HelloWorld);
};
 
3. 最后的最后,当然是总结
很混乱,我自己也很混乱,原来我的表达能力(噗,我自己也无法原谅自己啊= =),所以要总结一下。
1). HelloWorld工程主要就是教我们创建一个场景类
2). AppDelegate.cpp里会创建第一个显示的场景类,此时用的方法是runWithScene
3).要新建一个场景类,就一定要有以下三个函数:
virtual bool init();                // 初始化,可以在这里创建精灵
  
static cocos2d::CCScene* scene();  // 在这里要自己新建一个CCScene类,然后把我们自定义的场景类作为一个CCLayer添加到这个CCScene类中
  
CREATE_F
补充:移动开发 , 其他 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,