我如何从不是我的"bool HelloWorld::init()"的方法"this->addChild(sprite)"
How do I `this->addChild(sprite)` from a method that is not my `bool HelloWorld::init()`
我正在尝试使用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"是要添加到的对象。或者在第二种情况下显式发生,即您传递要将云添加到的目标实例。
理论上的第三种方法是拥有全局、静态成员或某种单例,并通过这些方法使对象实例可用。我建议使用前两种中的一种。
- 无法"this"指针传递到另一个类并在 CPP 中调用该类的任何方法
- 在类方法中使用 "this" 指针是否是一种好的做法?
- const_cast const 方法中的"this"将"this"分配给外部变量?
- C++虚拟方法,不需要"this"指针 - 优化
- 将"this"从父类方法转换为子类方法是一种好的做法吗?
- 有没有办法强制对 clang-format/clang-tidy 中的类成员/方法使用 "this->"?
- 错误:候选函数不可行:'this'参数具有类型 'const' 但方法未标记为 const
- 是否可以在实例方法中使用带有"this"的重载运算符?
- C++集合方法:函数'setCost'不可行:'this'参数的类型'const value_type'
- 我的类方法中是否需要"this pointer"?
- 方法定义中的错误"passing const List<int> as this argument discards qualifiers"
- 调用类的方法时,类的指针"this"变为 null C++
- C++ substr 方法 - "invalid use of ‘this’ in non-member function"
- C++使用*this从静态方法调用一个抽象方法
- 如何自动更新重写方法的 *this 返回类型
- (C++)将"this"作为默认参数传递给静态方法
- 为什么有些类方法返回"*this"(self的对象引用)?
- "this"参数显式传递给方法调用
- C++使用不同的类作为方法的'this'调用存储在类中的方法的正确语法是什么?
- C++ 通过引用将“this”传递到方法中