replaceScene() 弄乱了 public 变量

replaceScene() messes up a public variable

我正在将游戏从 cocos2d-iphone 2.x 移植到 cocos2d-x 3.x。 必须解决一些问题,包括严重崩溃 - 本 post 的主题。

已确定崩溃的发生是因为有时,我的 replaceScene 调用导致一个重要的 public 变量混乱。

我的class:

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());
}

被打乱的成员是desiredPosition。它在 update() 方法内部更改。问题是 update() 获得了一个已经混乱的期望位置。它只是在替换场景后才搞砸了。该问题每运行 10 次左右就会发生一次。甚至看起来,当场景被替换后第一次调用 update() 时, desiredPosition 设置为一些垃圾。是我没能学到更多。

我的播放器 class 没有单独的构造函数。

请指教

我忘了初始化另一个实例变量。该实例变量用于计算 desiredPosition。