0

GameManager という名前のシングルトン クラスがあります。

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

GameManager.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 に到達すると、正しい値を表示している currentGame を除いて、GameManager からのデータが失われます。

問題を診断するためにいくつかのログを入力しましたが、理解できないようです。

GameListScene が GameScreenScene に変更される直前に値を読み取ることができますが、変更されると値は失われます。

ゲームオブジェクトのボタン呼び出しでもデータを読み込んでみましたが、そこにもデータが存在しません。

これを理解するのに役立つ場合は、さらにコードを追加できます。簡単なものであれば、これをフラッディングしたくありませんでした。

どんな助けでも素晴らしいでしょう。

4

2 に答える 2

0

自動解放オブジェクト (つまり、電子メールと名前の文字列) を保持していないため、解放時にそのデータが削除されます。currentGame がまだ存在する理由は、それが int (autorelease ポインターではない) であるためです。

CC_SYNTHESIZE_RETAINこれら 2 つの文字列を保持する代わりに使用CC_SYNTHESIZEして、自動的に保持することができます。

于 2013-10-28T15:03:36.710 に答える
0

私が正しければ、

CCObject のコンストラクター (おそらく Init() 関数) は autorelease() を呼び出し、シーンにアタッチされていないインスタンスは、シングルトン インスタンスであっても 1 フレーム後に自動的に破棄されます。

GameManager クラスが CCObject から継承する理由はないと思います。

于 2013-10-28T04:41:33.420 に答える