0

我正在尝试将 App42 排行榜服务集成到我的 Cocos2D-X 游戏中。核心功能(将分数发送到服务器并检索它们,就像 App42 网站上显示的方式......)运行良好。

现在我想使用 CCTableView 可视化我的排行榜数据。

所以我得到了一个排行榜类(从 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 回答