0

App42 Leaderboard Service を Cocos2D-X ゲームに統合しようとしています。コア機能 (スコアをサーバーに送信して取得する、App42 サイトに示されている方法と同じです...) は正常に動作しています。

今、CCTableView を使用してリーダーボード データを視覚化したいと考えています。

だから私はLeaderboardクラス(CCLayerから継承)を取得し、次のようなことをしています:

bool Leaderboard::init() {
    ...
    // Initialize and send App42 Scoreboard API call
    App42API::Initialize(API_KEY, SECRET_KEY);
    ScoreBoardService *scoreBoardService = App42API::BuildScoreBoardService();
    scoreBoardService->GetTopNRankers(gameName,MAX_SCORES, this,app42callfuncND_selector(Leaderboard::onGetTopNRankings));

    // responseArrived is boolean, indicates if onGetTopRankings was called
    while(!responseArrived);

    CCTableView* tableView = CCTableView::create(this, CCSizeMake(400, 100));
    tableView->setDirection(kCCScrollViewDirectionVertical);
    tableView->setPosition(winSize.width/3 , winSize.height/2);
    tableView->setDelegate(this);
    tableView->setVerticalFillOrder(kCCTableViewFillTopDown);
    this->addChild(tableView,5);
    tableView->reloadData();

    return true;
}



void HelloWorld::onGetTopNRankings(App42CallBack *sender, void *response){

    App42GameResponse *scoreResponse = (App42GameResponse*)response;

    if (scoreResponse->isSuccess)
    {
        // Save User scores to Array
        responseScores = scoreResponse->scores;
    }
    else
    {
        printf("\nerrordetails:%s",scoreResponse->errorDetails.c_str());
        printf("\nerrorMessage:%s",scoreResponse->errorMessage.c_str());
        printf("\nappErrorCode:%d",scoreResponse->appErrorCode);
        printf("\nhttpErrorCode:%d",scoreResponse->httpErrorCode);
    }
    // Response Data is saved, or Error occured, go back to init()
    responseArrived = true; 
}

onGetTopNRankingsご覧のとおり、TableView のデータが空になるため、呼び出されるのを待っています。しかし、何が起こるかというと、返されたときに init() に戻ることができず、onGetTopNRankingsスタックしてしまいます。

だから、なぜ私が戻ってこれを解決できないLeaderboard::init()のか、または他の方法でこれを解決するための良いアイデアを得られない理由を誰かが考えました.私はそれぞれの提案に対してオープンです?

4

2 に答える 2

0
while(!responseArrived);

これにより、スレッドがブロックされます (無限ループ)。実際のデータがある場合は、コールバック メソッドでテーブル ビューに入力する必要があります。それまでは空いています。これは、アプリの設計で対処する必要があるものです。たとえば、その間に「読み込み中」のアニメーションを表示し、その上にキャンセル ボタンを表示できます。

于 2014-11-07T16:30:54.103 に答える
0

コードをテストしたところ、App42Cocos2dXSampleで正常に動作しています

発生している問題の唯一の考えられる理由は、コード スニペットのコールバック メソッドの所有者クラス名です。

scoreBoardService->GetTopNRankers(gameName,MAX_SCORES, this,app42callfuncND_selector( Leaderboard ::onGetTopNRankings ));

上記のステートメントでは、onGetTopNRankings はクラス Leaderboard属していますが、コールバック メソッドを定義している間はクラスHelloworldに属しています。

void HelloWorld::onGetTopNRankings (App42CallBack *sender, void *response){

したがって、上記のステートメントでクラス名を Helloworld から Leaderboard に変更してみてください。うまくいくことを願っています。

于 2014-11-08T10:13:34.290 に答える