C++ replaceSecene()将公共变量弄乱

C++ replaceSecene()将公共变量弄乱,c++,ios,mobile,cross-platform,cocos2d-x,C++,Ios,Mobile,Cross Platform,Cocos2d X,我正在将一个游戏从cocos2diphone2.x移植到cocos2d-x3.x。 必须解决一些问题,包括一次重大事故——这篇文章的主题 已经确定发生崩溃是因为有时候,我的replaceSecene调用会导致一个混乱的重要公共变量 我的班级: class Player : public cocos2d::Sprite { public: .... cocos2d::Vec2 desiredPosition; .... 我的图层方法: Scene* GameLevelLa

我正在将一个游戏从cocos2diphone2.x移植到cocos2d-x3.x。 必须解决一些问题,包括一次重大事故——这篇文章的主题

已经确定发生崩溃是因为有时候,我的replaceSecene调用会导致一个混乱的重要公共变量

我的班级:

class Player : public cocos2d::Sprite
{
public:
    ....
    cocos2d::Vec2 desiredPosition;
    ....
我的图层方法:

Scene* GameLevelLayer::createScene()
{
    // 'scene' is an autorelease object
    auto scene = Scene::create();
    // 'layer' is an autorelease object
    auto layer = GameLevelLayer::create();
    // add layer as a child to scene
    scene->addChild(layer);
    // return the scene
    return scene;
}

bool GameLevelLayer::init()
{
    // super init first
    if ( !Layer::init() )
    {
        return false;
    }
    ....
    player = (Player*) cocos2d::Sprite::create("sprite_idle_right@2x.png");
    player->setPosition(Vec2(100, 50));
    player->desiredPosition = player->getPosition();
    ....
    this->schedule(schedule_selector(GameLevelLayer::update), 1.0/60.0);
    ....
    return true;
}

void GameLevelLayer::endGame(bool won) {
    ....
    MenuItem* display;
    if (currentLevel < lastLevel && won) {
        ++currentLevel;
        display = MenuItemImage::create("next.png" ,"next.png" ,"next.png",
            CC_CALLBACK_1(GameLevelLayer::replaceSceneCallback, this));
    } else {
        // Lost the game
        currentLevel = 1;
        display = MenuItemImage::create("replay.png", "replay.png", "replay.png",
            CC_CALLBACK_1(GameLevelLayer::replaceSceneCallback, this));
    }
    ....
}

void GameLevelLayer::replaceSceneCallback(Ref* sender) {
    Director::getInstance()->replaceScene(this->createScene());
}
被邀请的成员是理想的职位。它在更新方法中更改。问题是更新得到的是一个已经混乱不堪的理想位置。它只是在一个场景被替换后才变得一团糟。这个问题大约每10次出现一次。甚至在场景被替换后第一次调用update时,desiredPosition设置为一些垃圾。是我无法学到更多

我的Player类没有单独的构造函数


请告知。

我忘了初始化另一个实例变量。该实例变量用于计算所需的位置。

CoCoCoS2D::Sprite::create创建的是一个精灵,而不是一个玩家,因此您到处都有未定义的行为。你的代码有时能工作真是倒霉。那不是构造函数,而是工厂函数。它不会创建一个玩家。您正在创建的对象之外进行编写,该对象未定义。我的意思是create调用构造函数,如:Sprite*Sprite=new std::nothrow Sprite;也许你是对的。我得考虑一下。