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。
我正在将游戏从 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。