HelloWorldScene解析

2024-01-22 21:08
文章标签 解析 helloworldscene

本文主要是介绍HelloWorldScene解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://blog.sina.com.cn/s/blog_9c3d739101017d2n.html

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::CCScenescene();

 

    void menuCloseCallback(CCObjectpSender);

 

    CREATE_FUNC(HelloWorld);

};

menuCloseCallback函数我觉得可以暂时不理它,算了,还是忍不住要理一下。它是一个回调函数,没了,仅此而已,就是AndroidOnClickListener里面的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函数,看看CCLayercreate函数:

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函数的:

CCSceneHelloWorld::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::CCScenescene();

    CREATE_FUNC(HelloWorld);

};

 

3. 最后的最后,当然是总结

很混乱,我自己也很混乱,原来我的表达能力(噗,我自己也无法原谅自己啊= =),所以要总结一下。

1). HelloWorld工程主要就是教我们创建一个场景类

2). AppDelegate.cpp里会创建第一个显示的场景类,此时用的方法是runWithScene

3).要新建一个场景类,就一定要有以下三个函数:

virtual bool init();                // 初始化,可以在这里创建精灵

   

static cocos2d::CCScenescene();  // 在这里要自己新建一个CCScene类,然后把我们自定义的场景类作为一个CCLayer添加到这个CCScene类中

   

CREATE_FUNC(HelloWorld);           // 相当于重写create函数,让create函数返回子类对象。

4. 然后,就是这样了。

 

好了,以上就是我从HelloWorld工程能够发现的东西了,肯定会有不少错误的思想,但是现在的我还无法修正。所以,仅供参考,嘿嘿~

这篇关于HelloWorldScene解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/634237

相关文章

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

使用Java实现一个解析CURL脚本小工具

《使用Java实现一个解析CURL脚本小工具》文章介绍了如何使用Java实现一个解析CURL脚本的工具,该工具可以将CURL脚本中的Header解析为KVMap结构,获取URL路径、请求类型,解析UR... 目录使用示例实现原理具体实现CurlParserUtilCurlEntityICurlHandler

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

java中的HashSet与 == 和 equals的区别示例解析

《java中的HashSet与==和equals的区别示例解析》HashSet是Java中基于哈希表实现的集合类,特点包括:元素唯一、无序和可包含null,本文给大家介绍java中的HashSe... 目录什么是HashSetHashSet 的主要特点是HashSet 的常用方法hasSet存储为啥是无序的

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用