我如何从不是我的"bool HelloWorld::init()"的方法"this->addChild(sprite)"

How do I `this->addChild(sprite)` from a method that is not my `bool HelloWorld::init()`

本文关键字:this- 方法 gt sprite addChild 我的 bool HelloWorld init      更新时间:2023-10-16

我正在尝试使用Eclipse&Cocos2d-x

我在创建一个可以从类中任何位置调用的方法时遇到了问题。

我目前的工作代码是:

bool HelloWorld::init()
{if ( !LayerColor::initWithColor(ccc4(50, 180, 220, 255) )){
        return false;
    }
    Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();
    auto closeItem = MenuItemImage::create(
                                           "CloseNormal.png",
                                           "CloseSelected.png",
                                           CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
    closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,
                                origin.y + closeItem->getContentSize().height/2));
    //auto menu = Menu::create(closeItem, NULL);
    // menu->setPosition(Vec2::ZERO);
    //this->addChild(menu, 1);
    auto label = LabelTTF::create("Kitty Katch", "Arial", 54);
    label->setPosition(Vec2(origin.x + visibleSize.width/2, origin.y + visibleSize.height - label->getContentSize().height));
    this->addChild(label, 1);
    // add "HelloWorld" splash screen"
    //auto sprite = Sprite::create("HelloWorld.png");
    //sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
    //this->addChild(sprite, 0);
    CCSprite *theCloud = CCSprite::create("cloud.png");
    theCloud->setPosition(visibleSize.width/2,visibleSize.height/2);
    this->addChild(theCloud);
    //addACloud ();
    return true;
}

这将为我的场景"添加一片云"。

但我希望能够调用void方法:

void addACloud() {
    Size visibleSize = Director::getInstance()->getVisibleSize();
    CCSprite *theCloud = CCSprite::create("cloud.png");
    theCloud->setPosition(visibleSize.width/2,visibleSize.height/2);
    //this->addChild(theCloud); //(Causes error)
    HelloWorld->addChild(theCloud); // (error: Cannot use arrow operator on a type)
}

伙计们,我做错了什么?感谢

您可以在HelloWorld类中创建一个static成员函数。你可以定义如下:

class HelloWorld {
    /// ...
public:
    static void AddCloud( CCSprite* pCloud ) {
          /// Add cloud
    }
};

然后,您将能够使用以下语法从类外调用它:

HelloWorld::AddCloud( pCloud );

但是,如果您试图将云添加到HelloWorld类(例如std::vector<CCSprite*>(中的数据结构中,那么您将无法使用静态成员函数来完成此操作,并且需要创建一个singleton。这通常是通过在类定义之后放置extern HelloWorld* g_pHelloWorld;来完成的,然后在初始化程序时,放置:g_pHelloWorld = new HelloWorld;,然后可以使用g_pHelloWorld->AddCloud( pCloud )

addACloud((方法需要访问HelloWorld对象实例。在您的原始代码中呼叫

this->addChild(theCloud);

将CCSprite对象实例添加到当前(this->(HelloWorld对象实例中。如果你想打电话给

addACloud()

您需要确保HelloWorld对象实例在函数中可用。这可以通过将AddCloud((函数作为HelloWorld类的成员函数来实现:

class HelloWorld {
    // ...   
    public:
       void addACloud();
};

然后将AddCloud实现修改为

void HelloWorld::addACloud() {
    Size visibleSize = Director::getInstance()->getVisibleSize();
    CCSprite *theCloud = CCSprite::create("cloud.png");
    theCloud->setPosition(visibleSize.width/2, visibleSize.height/2);
    this->addChild(theCloud);
}

或者,如果您希望能够将云添加到不同的对象(可能是HelloWorld的多个实例(。您可以将AddCloud留在类定义之外,但随后需要传递对象实例,您希望将影响力作为参数添加到该对象实例:

AddCloud(HelloWorld *instance);

实现中的addChild行变为:

instance->addChild(theCloud);

这一切都归结为在函数中拥有可用的对象实例。这在第一种方法中是隐式发生的,"This"是要添加到的对象。或者在第二种情况下显式发生,即您传递要将云添加到的目标实例。

理论上的第三种方法是拥有全局、静态成员或某种单例,并通过这些方法使对象实例可用。我建议使用前两种中的一种。