Cocos2D-x之HelloWorld倒底怎么玩?

笨木头花心贡献,啥?花心?不呢,是用心~

转载请注明,原文地址:http://blog.csdn.net/musicvs/article/details/8071832

正文:

看了教程,还是要自己写写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 =newCCLayer();

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_FUNC(HelloWorld);          //相当于重写create函数,让create函数返回子类对象。

4. 然后,就是这样了。

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

2012.10.29修正:

发现一个问题,会误导大家,文中说“继承了CCScene的类就可以作为场景类”,这是不对,一个场景类应该是继承了CCLayer,然后这个场景类有一个scene函数,这个函数会新建一个CCScene对象,然后返回。特此说明。

请允许我做个广告。

AndroidFans论坛,我经常在这活动,欢迎来交流:笨木头邀请您访问Android 开发论坛:
http://www.android-fans.net/?fromuid=35

.

.

.

【木头Cocos2d-x 004】HelloWorld倒底怎么玩?相关推荐

  1. java中HelloWorld原来还可以这样玩

    大家可能看到HelloWorld例子是不是都觉得博主脑子是不是有问题,怎么拿这么一个弱智的问题和例子拿来讲.实际上并不是这样的,如果是这样的我相信我就没有写这篇博客意思了.因为当我第一次看到java中 ...

  2. 1 游戏逻辑架构,Cocos2d-x游戏项目创建,HelloWorld项目创建,HelloWorld程序分析,(CCApplicationProtocol,CCApplication,AppDeleg

     1 游戏逻辑架构 详细介绍 A 一个导演同一时间只能运行一个场景,场景当中,可以同时加载多个层,一个层可以可载多个精灵.层中亦可以加层. B  场景切换 sceneàaddChild(layer ...

  3. cocos2d, Box2D

    http://antkillerfarm.github.io/ 安装 cocos2d和cocos2d-x虽然都是一家的产品,但前者是用python写的,而后者是用C++写的. 我试着在windows下 ...

  4. Cocos2d-3.x版的HelloWorld工程分析 (二)

    我们HelloWorld 从applicationDidFinishLaunching()后, 大部分人都会从这部分代码开始研究,如果想要研究main函数 如何调用applicationDidFini ...

  5. Cocos2d-x 3.0正式版 HelloWorld分析

    我们不管是对于一款编程语言的学习,还是对一个游戏引擎的学习,第一个基本都是HelloWorld,那么我们现在来分析一下,Cocos3.0正式版的HelloWord  又有哪些改进? 我们可以对比2.2 ...

  6. Cocos2d-x 3.0 红孩儿私家必修:第二章 cpp-empty-test:还是那个HelloWorld!

     第二章   cpp-empty-test:还是那个HelloWorld! 上一章我们讲到说以前的HelloWorld演示更名为cpp-empty-test.本章我们来分析一下这个cpp-empt ...

  7. linux编程拼图游戏,cocos2d-x制作拼图游戏

    由于本人最近在学习cocos2d-x,一时手痒,写一个游戏练练手,也是对cocos2d-x进一步的巩固,于是敲了两天,就写了这个拼图游戏,还挺有成就感的,:-),先把我的成果展示如下: 由于cocos ...

  8. 【史上最坑爹的游戏】001 游戏介绍及开始页面的实现

    最近史上最坑爹的游戏挺风靡的,而且又更新了2,本系列文章将来一步步把这个游戏做出来. 1. 游戏介绍 相信很多人都玩过这款游戏,如果你没玩过的话,建议你下载一个试试,那么学习此系列文章,你将更有fee ...

  9. 分享一个《捕鱼》的客户端游戏

    今天一天用cocos2d做了一个捕鱼系统的demo,资源取自广为流传的android小游戏叫做年年有余,哎,无论叫做什么吧!之前是用android写的,今天一天用cocos2d从新写了一遍!大家可以用 ...

最新文章

  1. 用MyEclipse开发Spring入门
  2. 独家 | 手把手教你学习R语言(附资源链接)
  3. WF初学者对工作流的认识
  4. linux线程同步之互斥锁——linux的关键区域
  5. 腾讯绝悟AI完全体限时开放体验,研究登上国际顶会与顶刊
  6. osgi 模块化_OSGI –模块化您的应用程序
  7. vscode python第三方库检测_VSCode中使用Pylint检查python代码
  8. ListView setOnItemClickListener无效
  9. 【活动】完整的Java学习路径《深入理解Java核心技术》(文末送书)
  10. C语言编译器Visual Studio官方正版下载安装
  11. Chrome 网页长截图
  12. 那些变态的javascript输出
  13. Skyscrapers Aren’t Scalable
  14. php 使用手机扫条码,关于扫条码的问题
  15. [《小女人的高跟鞋》偶感小记]2012年8月28日
  16. linux中 777,755等用户权限说明
  17. 手机录音如何转换成文字?学会这个简单方法,让你事半功倍!
  18. 单片机晶振概述及工作原理
  19. 移动宽带内网穿透教程,快解析nat版快速实现
  20. 了解你的敌人:跟踪僵尸网络

热门文章

  1. Android自定义UI陷阱 LayoutInflater from inflate 一定不能工作在父类或虚类里
  2. 如何从零自学成为前端工程师,怎么学习?怎么选老师?
  3. 10款Github上最火爆的国产开源项目
  4. Compilation is not supported for following modules: example, image-viewer. Unfortunately you can't h
  5. LeetCode解题(1)----------8 字符串转换整数[go]
  6. DSPE-PEG-GE11,磷脂-聚乙二醇-肿瘤细胞表皮生长因子肽GE11
  7. 浏览器内置pdf去除工具栏
  8. 计算机按键会卡住,为什么电脑有时候会卡死,按键都不起作用,只能强制性关机...
  9. css3绘制八卦图及动画效果
  10. 【C/C++】【NOI】雇佣兵代码及分析理解