0

我有一个名为 GameManager 的单例类。

游戏管理器.h

#include "cocos2d.h"

using namespace cocos2d;

class GameManager : private CCObject
{
public:
    GameManager(void);
    virtual ~GameManager(void);
    virtual bool init(void);
    static GameManager* sharedGameManager(void);

    CC_SYNTHESIZE(CCString*, email, Email);
    CC_SYNTHESIZE(CCString*, nickName, NickName);

    CC_SYNTHESIZE(int, currentGame, CurrentGame);

    CCArray* gamesArray;
};

游戏管理器.cpp

#include "GameManager.h"

static GameManager* _sharedGameManager = NULL;

GameManager* GameManager::sharedGameManager(void)
{
    if (!_sharedGameManager)
    {
    _sharedGameManager = new GameManager;
    _sharedGameManager->init();
    }

    return _sharedGameManager;
}

GameManager::GameManager(void)
{

}

GameManager::~GameManager(void)
{
    email->release();
    nickName->release();
    gamesArray->release();
}

bool GameManager::init()
{
    CCLOG("GameManager Created");

    email = CCString::create("");
    email->retain();
    nickName = CCString::create("");
    nickName->retain();

    currentGame = 0;

    gamesArray = CCArray::create();
    gamesArray->retain();

    return true;
}

我在我的登录页面中创建了 GameManager

GameManager::sharedGameManager();

我的应用程序的流程是:

Login.cpp -> GameList.cpp -> GameScreen.cpp

在登录页面中,我存储了帐户电子邮件和昵称以及在该页面中创建的 gamesArray:

//store user info to gamemanager
GameManager::sharedGameManager()->setEmail((CCString*) parseOne->objectAtIndex(3));
GameManager::sharedGameManager()->setNickName((CCString*) parseOne->objectAtIndex(7));
GameManager::sharedGameManager()->gamesArray = gameObjectArray;

一旦用户登录,就会使用 GameManager 信息创建 GameList。

所以来自单身人士的信息此时存在。

GameList 页面为 gamesArray 中的每个游戏创建一个 GameObject。每个 GameObject 都有一个附加的子按钮,用于转到 GameScreen 并将该 GameObjects id 保存到 GameManager

GameManager::sharedGameManager()->setCurrentGame(gameNumber);

CCDirector * pDirector = CCDirector::sharedDirector();
CCScene* pScene = GameScreenScene::scene();
pDirector->replaceScene(pScene);

现在奇怪的部分,当我到达 GameScreenScene 时,来自 GameManager 的数据已经消失,除了 currentGame 仍然显示正确的值。

我已经输入了一些日志来诊断问题,但我似乎无法弄清楚。

我可以在 GameListScene 更改为 GameScreenScene 之前读取这些值,但是一旦更改,这些值就消失了。

我也尝试在 GameObject 按钮调用中读取数据,但数据也不存在那里。

如果它可以帮助解决这个问题,我可以添加更多代码,如果它很简单,我只是不想淹没它。

任何帮助都是极好的。

4

2 回答 2

0

如果我是对的,

CCObject 的构造函数(可能是 Init() 函数)调用 autorelease() 并且未附加到场景的实例在一帧后自动销毁,即使它是单例实例。

我认为您的 GameManager 类没有理由从 CCObject 继承。

于 2013-10-28T04:41:33.420 回答
0

您没有保留您的自动释放对象(即电子邮件和姓名字符串),从而导致其数据在释放时被删除。currentGame 仍然存在的原因是它是一个 int (不是自动释放指针)。

您可以使用CC_SYNTHESIZE_RETAIN而不是CC_SYNTHESIZE保留这两个字符串来自动保留它们。

于 2013-10-28T15:03:36.710 回答