2014-11-07 6 views
0

Я пытаюсь интегрировать службу Leaderboard App42 в свою игру Cocos2D-X. Основная функциональность (отправка баллов на сервер и их получение, как показано на сайте App42 ...) работает нормально.Cocos2D-X Layer :: init() застревает при ожидании услуги Leaderboard

Теперь я хочу визуализировать данные своих лидеров с помощью 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() или у меня есть какая-то хорошая идея решить это каким-либо другим способом, я открыт для каждого предложения?

ответ

0
while(!responseArrived); 

Это блокирует нить (бесконечная петля). Вам нужно заполнить представление таблицы в методе обратного вызова, когда у вас есть фактические данные. До этого он будет пустым. Это то, с чем вам приходится иметь дело с дизайном вашего приложения. Например, вы можете отображать анимацию «загрузки», тем временем, с помощью кнопки отмены.

0

Я проверил ваш код и он работает нормально в моем App42Cocos2dXSample

Единственной возможной причины вопрос вы получаете это имя владельца класса метода обратного вызова в фрагменте коды.

scoreBoardService-> GetTopNRankers (GameName, MAX_SCORES, это, app42callfuncND_selector (Лидеров :: onGetTopNRankings));

В приведенном выше заявлении onGetTopNRankings относится к классу Leaderboard, но при определении метода обратного вызова, он принадлежит к классу Helloworld:

аннулируется HelloWorld :: onGetTopNRankings (App42CallBack * отправитель, недействительный * ответ) {

Итак, попробуйте изменить имя класса с Helloworld на Leaderboard в приведенном выше описании. Надеюсь, это сработает.