cocos2d-x创建场景

今天开始学习Cocos2d-x,使用的版本是2.1.4,这个版本比较老,对应的参考资料也比较齐全。

在mac/xcode环境下,代码是写在Classes文件夹下的,和iOS应用类似,程序从AppDelegate.cpp开始,这当中也有一些生命周期方法,其中有一个

applicationDidFinishLaunching方法:

 1 bool AppDelegate::applicationDidFinishLaunching()
 2 {
 3     // 创建一个导演类
 4     CCDirector *pDirector = CCDirector::sharedDirector();
 5     pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
 6     // 设置是否显示FPS
 7     pDirector->setDisplayStats(true);
 8     //设置帧率
 9     pDirector->setAnimationInterval(1.0 / 60);
10     //创建一个初始场景
11     CCScene *pScene = MainScene::scene();
12     //执行游戏
13     pDirector->runWithScene(pScene);
14     return true;
15 }

这部分代码的意图很容易理解,不多解释了,在项目创建的时候,默认带有一个HelloWorld类,把这个类删掉,我们自己建立一个MainScene场景:

.h文件:

 1 #ifndef __MyGame__MainScene__
 2 #define __MyGame__MainScene__
 3 
 4 #include <iostream>
 5 #include "cocos2d.h"        //导入头文件
 6 using namespace cocos2d;    //使用命名空间
 7 
 8 //场景继承自CCLayer,是一个层的子类
 9 class MainScene : public CCLayer {
10 public:
11     //一个虚函数初始化方法
12     virtual bool init();
13     //一个用于构建场景的静态方法
14     static CCScene *scene();
15     //通过宏,生成一个叫做create的工厂方法
16     CREATE_FUNC(MainScene);
17 };

其中CREATE_FUNC是一个宏,用于创建一个工厂方法,它的实现是:

 1 #define CREATE_FUNC(__TYPE__) 
 2 static __TYPE__* create() 
 3 { 
 4     __TYPE__ *pRet = new __TYPE__(); 
 5     if (pRet && pRet->init()) 
 6     { 
 7         pRet->autorelease(); 
 8         return pRet; 
 9     } 
10     else 
11     { 
12         delete pRet; 
13         pRet = NULL; 
14         return NULL; 
15     } 
16 }

.m文件:

 1 #include "MainScene.h"
 2 
 3 //一个用于构建场景的静态方法
 4 CCScene *MainScene::scene() {
 5     //首先通过CCScene的工厂方法创建了一个场景
 6     CCScene *scene = CCScene::create();
 7     //调用由宏生成的工厂方法创建了一个层对象
 8     MainScene *layer = MainScene::create();
 9     //将图层添加到场景上
10     scene->addChild(layer);
11     //返回场景
12     return scene;
13 }
14 
15 //在MainScene::create方法当中调用
16 bool MainScene::init() {
17     //首先调用父类的构造方法
18     if (!CCLayer::init()) {
19         return false;
20     }
21     
22     //使用图片创建一个精灵,注意Resource下的文件不需要加路径
23     CCSprite *sprite = CCSprite::create("Icon-72.png");
24     //为场景增加一个精灵
25     this->addChild(sprite);
26     
27     return true;
28 }

这里有一些概念:

一个游戏有多个场景,这些场景之间通过导演来控制切换;一个场景内可以有多个层,每个层上也可以有多个精灵。

这样,一个最基本的游戏画面就创建出来了。

原文地址:https://www.cnblogs.com/Steak/p/3755943.html