Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Cocos2DX-->;层实例化场景?_C++_Cocos2d X - Fatal编程技术网

C++ Cocos2DX-->;层实例化场景?

C++ Cocos2DX-->;层实例化场景?,c++,cocos2d-x,C++,Cocos2d X,在Cocos2dx上阅读书籍和主题每个人似乎都在这样教它: 创建从CCLayer继承的类 在该CCLayer类中,实例化静态场景 将布局添加到场景中 打个比方,这就像鸡蛋创造了它的父母。这似乎是倒退的,非直觉的。为什么不这样做: 创建一个从CCScene继承的类(称之为GameSene) 创建另一个从CCLayer继承的类(称为GameLayer) GameSecene类是一个singleton(有一个singleton成员:staticGameSecene*scene) 在GameSecene

在Cocos2dx上阅读书籍和主题每个人似乎都在这样教它:

  • 创建从CCLayer继承的类
  • 在该CCLayer类中,实例化静态场景
  • 将布局添加到场景中
  • 打个比方,这就像鸡蛋创造了它的父母。这似乎是倒退的,非直觉的。为什么不这样做:

  • 创建一个从CCScene继承的类(称之为GameSene)
  • 创建另一个从CCLayer继承的类(称为GameLayer)
  • GameSecene类是一个singleton(有一个singleton成员:staticGameSecene*scene)
  • 在GameSecene类中实例化GameLayer类
  • GameLayer类将具有常见的嫌疑:UPDATE、INIT等,GameSecene类具有have INIT及其静态自引用成员

    虽然这看起来像是更多的工作,但事实并非如此,而且在逻辑上更有意义,而且,它为开发人员提供了一个放置场景特定逻辑和层特定逻辑的位置

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

    示例

    #游戏场景

    #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。我几乎可以肯定,我在问题中提出的方式没有问题,但可能还有其他一些问题我还不了解框架,以及为什么它会以通常的方式教授?(或者,也许这只是脱离了传统,它的教学方式是这样的?很好的解释和我所想的……传统。从逻辑上讲,按照我的建议进行布局更有意义。完全同意;当一个类是一个层的子类时,将其称为“场景”是非常令人困惑的,但将其称为一个层然后返回一个场景也是令人困惑的(它的父母)。我将打破这个传统。:)