Cocos2D-X Layer :: init()在等待Leaderboard Service时卡住了

时间:2014-11-07 16:05:32

标签: cocos2d-x freeze leaderboard app42

我试图将App42排行榜服务整合到我的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的数据将为空。但是,当onGetTopNRankings返回时,我无法返回init(),它会被卡住。

所以任何人都知道为什么我不能回到Leaderboard::init()或者有任何好主意以任何其他方式解决这个问题,我对每个建议都持开放态度。

2 个答案:

答案 0 :(得分:0)

while(!responseArrived);

这会阻塞线程(无限循环)。当您有实际数据时,需要在回调方法中填充表视图。在那之前它将是空的。这是您的应用程序设计必须处理的内容。例如,您可以显示" loading"同时动画,上面有取消按钮。

答案 1 :(得分:0)

我测试了您的代码,它在App42Cocos2dXSample

中运行良好

您遇到问题的唯一可能原因是您的代码段中的回调方法的所有者类名称。

  

scoreBoardService-> GetTopNRankers(gameName,MAX_SCORES,   此,app42callfuncND_selector(的排行榜:: onGetTopNRankings ));

在上面的陈述中, onGetTopNRankings 属于排行榜类,但在定义回调方法时,它属于 Helloworld 类:

  

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

因此,请尝试在上面的语句中将类名从Helloworld更改为Leaderboard。我希望它能奏效。