C++ Cocos2DX-->;层实例化场景?
在Cocos2dx上阅读书籍和主题每个人似乎都在这样教它:C++ Cocos2DX-->;层实例化场景?,c++,cocos2d-x,C++,Cocos2d X,在Cocos2dx上阅读书籍和主题每个人似乎都在这样教它: 创建从CCLayer继承的类 在该CCLayer类中,实例化静态场景 将布局添加到场景中 打个比方,这就像鸡蛋创造了它的父母。这似乎是倒退的,非直觉的。为什么不这样做: 创建一个从CCScene继承的类(称之为GameSene) 创建另一个从CCLayer继承的类(称为GameLayer) GameSecene类是一个singleton(有一个singleton成员:staticGameSecene*scene) 在GameSecene
#ifndef __GameScene__
#define __GameScene__
#include "cocos2d.h"
using namespace cocos2d;
class GameScene : public cocos2d::CCScene
{
public:
~GameScene();
virtual bool init();
static GameScene* scene();
CREATE_FUNC(GameScene);
};
#endif /* defined(__GameScene__) */
#include "GameScene.h"
#include "GameLayer.h"
GameScene::~GameScene() {}
GameScene* GameScene::scene()
{
GameScene *scene = GameScene::create();
GameLayer *layer = GameLayer::create();
scene->addChild(layer);
return scene;
}
bool GameScene::init()
{
if (!CCScene::init()) return false;
return true;
}
#游戏玩家
#ifndef __GAMELAYER_H__
#define __GAMELAYER_H__
#include "cocos2d.h"
using namespace cocos2d;
class GameLayer : public cocos2d::CCLayer
{
public:
~GameLayer();
virtual bool init();
virtual void draw();
void update(float dt);
CREATE_FUNC(GameLayer);
};
#endif // __GAMELAYER_H__
#include "GameLayer.h"
GameLayer::~GameLayer() {}
bool GameLayer::init()
{
if (!CCLayer::init())
return false;
this->schedule(schedule_selector(GameLayer::update));
return true;
}
void GameLayer::draw() {}
void GameLayer::update(float dt) {}
最后在AppDelegate CPP中
bool AppDelegate::applicationDidFinishLaunching()
{
// initialize director
...
...
// Create a scene
GameScene *pScene = GameScene::scene();
// Run
pDirector->runWithScene(pScene);
return true;
}
我在cocos2dx上也有一个关于这个主题的帖子:
基类名称和子类名称之间存在混淆 例如,在<代码>层(CCLayer)的子类中,他们将该层命名为<代码>层子类<代码>游戏场景,即使它不是实际场景,它也是一个层。接下来,他们通过调用
createScene
,创建实际场景(CCScene)实例,我假设该实例返回一个通用场景实例,并将游戏场景实例添加到场景中:
auto scene = GameScene::createScene();
Director::getInstance()->replaceScene(scene);
因此,您最终会得到以下层次结构:
Scene
Layer (custom class: GameScene)
Nodes...
现在,这种奇怪命名哲学的起源很简单,它在cocos2d社区已经存在了很长时间。在早期的cocos2d iphone项目模板中,您有一个继承自CCLayer
的HelloWorldScene
类。它包含一个类方法scene
,该方法创建了CCScene
的实例,创建了HelloWorldScene
实例,并在返回它之前将其添加到通用场景实例中
因此,基本上这只是一个混乱,因为在项目模板、教程和书籍中,子类的名称很糟糕。与所有理性思维相反,“传统”在cocos2d-x中占了上风。在cocos2d iphone中,通过将模板类重命名为
HelloWorldLayer
Rodger EngelbertCoCoCoS2D-x的作者(我相信是在v2.x中)最终解决了这个问题。初学者指南通过电子邮件回答了这个问题
嗨,杰森
无需遵循模板中使用的策略。事实上
除了Cocos2d-x团队之外,我不知道有谁在做这件事,我只知道
是否在本书的示例中使用过它以保持一致性
一个场景是独一无二的,这也是导演所需要的。它是
可以在过渡期间运行两个场景,但其他情况除外
场景在结构上被视为建筑中的一个块。你
可以将项目组织为多个块,也可以不组织为多个块,但是
至少需要一个
但你可以随心所欲。你可以使用场景
更重要的是,一些开发人员为了
并将重点放在主图层对象上。还有,记住
模板中生成的代码只是试图给您一个
尽可能快地画画布。这不是最好的开始
这是你的项目的一个要点。由你来做决定
罗杰
你是说CCLayer而不是CCLayout?这是什么版本的cocos2d-x?通常,CCScene实例位于层次的根。如果有一本书做得不一样,那可能只是做错了,但我不能不看就肯定。你能给这本书命名或添加一个链接到一个以“怪异方式”完成的教程吗?纠正了“布局”的错误。当你创建一个新项目时,默认的模板代码是“怪异方式”设置。Rodger Engelbert在《Cocos2d-X by Example初学者指南》中也有类似的内容。你可以在这里看到它的例子,其中创建了一个“游戏场景”类,但它继承了CCLayer。我几乎可以肯定,我在问题中提出的方式没有问题,但可能还有其他一些问题我还不了解框架,以及为什么它会以通常的方式教授?(或者,也许这只是脱离了传统,它的教学方式是这样的?很好的解释和我所想的……传统。从逻辑上讲,按照我的建议进行布局更有意义。完全同意;当一个类是一个层的子类时,将其称为“场景”是非常令人困惑的,但将其称为一个层然后返回一个场景也是令人困惑的(它的父母)。我将打破这个传统。:)