gpt4 book ai didi

c++ - Cocos2DX --> 图层实例化场景?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:41 25 4
gpt4 key购买 nike

看Cocos2dx的书籍和话题大家都是这样教的:

  1. 创建一个继承自 CCLayer 的类
  2. 在该 CCLayer 类中,实例化一个静态 SCENE
  3. 为场景添加布局

打个比方,它就像是 Egg 创建了它的 Parent。这似乎是倒退的,不直观的。为什么不这样做:

  1. 创建一个继承自 CCScene 的类(称之为 GameScene)
  2. 创建另一个继承自 CCLayer 的类(称之为 GameLayer)
  3. GameScene 类是一个单例(有一个单例成员:static GameScene* scene)
  4. 在 GameScene 类中实例化 GameLayer 类

GameLayer 类将有通常的嫌疑人:UPDATE、INIT 等,而 GameScene 类有 INIT 和它的静态自引用成员。

虽然这看起来像是更多的工作,但实际上并非如此,而且在逻辑上更有意义,此外,它为开发人员提供了一个地方,可以放置特定于 SCENE 的逻辑和特定于 LAYER 的逻辑。

这样做有什么问题吗?为什么这么多人倒着教?

示例:

#游戏场景

#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 上也有一个关于这个主题的帖子:

http://discuss.cocos2d-x.org/t/layer-instantiates-scene/18149/4

最佳答案

基类名称和子类名称之间存在混淆。

例如在 cocos2d-x wiki它们是 Layer (CCLayer) 的子类,但他们将此 Layer 子类命名为 GameScene,尽管它不是实际场景,而是一个图层。再往下,他们通过调用 createScene 创建了实际的 Scene (CCScene) 实例,我假设它会返回一个通用的 Scene 实例,并将 GameScene 实例添加到场景中:

auto scene = GameScene::createScene();
Director::getInstance()->replaceScene(scene);

所以你最终得到了以下层次结构:

Scene
Layer (custom class: GameScene)
Nodes...

现在这种奇怪的命名哲学的起源很简单,它已经在 cocos2d 社区中流传了很长时间。在很早的 cocos2d-iphone 项目模板中,您有一个继承自 CCLayerHelloWorldScene 类。它包含一个创建 CCScene 实例的类方法 scene,创建一个 HelloWorldScene 实例并在返回之前将其添加到通用场景实例。

所以基本上这只是由于项目模板、教程和书籍中的子类命名不当造成的混淆。与所有理性思想相反,“传统”在 cocos2d-x 中盛行。在 cocos2d-iphone 中,通过将模板类重命名为 HelloWorldLayer 最终解决了这个问题(我相信在 v2.x 中)。

关于c++ - Cocos2DX --> 图层实例化场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26798075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com