From 04967150613b4fb9816d061716e89cc906c54a46 Mon Sep 17 00:00:00 2001 From: Grant-Postma Date: Fri, 19 Jun 2020 03:16:54 -0400 Subject: [PATCH 1/3] Highlight the game code focusbar. Touch Listener hitbox correction. Change back to MainMenu if game_uuid doesn't exist. Added game over firebase field in game_uuid. Removeing Game_Uuid on game over. Added game_outcome tracker. Leave button functionality. Added missing images. --- demos/TicTacToe/Classes/AppDelegate.cpp | 4 +- demos/TicTacToe/Classes/MainMenuScene.cpp | 48 +++-- demos/TicTacToe/Classes/TicTacToeLayer.cpp | 165 +++++++++++++----- demos/TicTacToe/Classes/TicTacToeLayer.h | 20 ++- demos/TicTacToe/Resources/create_game.png | Bin 0 -> 16999 bytes demos/TicTacToe/Resources/join_game.png | Bin 0 -> 3634 bytes demos/TicTacToe/Resources/leave_button.png | Bin 0 -> 7036 bytes .../TicTacToe/Resources/text_field_border.png | Bin 0 -> 1627 bytes demos/TicTacToe/Resources/tic_tac_toe_o.png | Bin 25402 -> 25402 bytes 9 files changed, 171 insertions(+), 66 deletions(-) create mode 100644 demos/TicTacToe/Resources/create_game.png create mode 100644 demos/TicTacToe/Resources/join_game.png create mode 100644 demos/TicTacToe/Resources/leave_button.png create mode 100644 demos/TicTacToe/Resources/text_field_border.png diff --git a/demos/TicTacToe/Classes/AppDelegate.cpp b/demos/TicTacToe/Classes/AppDelegate.cpp index 33db150b..15f1ce66 100644 --- a/demos/TicTacToe/Classes/AppDelegate.cpp +++ b/demos/TicTacToe/Classes/AppDelegate.cpp @@ -4,8 +4,10 @@ #include "TicTacToeScene.h" USING_NS_CC; +// Set based on the image width. const float kFrameWidth = 600; -const float kFrameHeight = 600; +// Set based on the image height plus 40 for windows bar. +const float kFrameHeight = 640; AppDelegate::AppDelegate() {} diff --git a/demos/TicTacToe/Classes/MainMenuScene.cpp b/demos/TicTacToe/Classes/MainMenuScene.cpp index c9376469..2aea542c 100644 --- a/demos/TicTacToe/Classes/MainMenuScene.cpp +++ b/demos/TicTacToe/Classes/MainMenuScene.cpp @@ -9,7 +9,6 @@ Scene* MainMenuScene::createScene() { // and can have sprites, labels and layers added onto it. auto scene = Scene::create(); auto layer = MainMenuScene::create(); - scene->addChild(layer); return scene; @@ -22,7 +21,8 @@ bool MainMenuScene::init() { // Creates a sprite for the create button and sets its position to the center // of the screen. TODO(grantpostma): Dynamically choose the location. auto create_button = Sprite::create("create_game.png"); - create_button->setPosition(300, 350); + create_button->setPosition(25, 200); + create_button->setAnchorPoint(Vec2(0, 0)); // Create a button listener to handle the touch event. auto create_button_touch_listener = EventListenerTouchOneByOne::create(); // Setting the onTouchBegan event up to a lambda tha will replace the MainMenu @@ -45,17 +45,21 @@ bool MainMenuScene::init() { ->getEventDispatcher() ->addEventListenerWithSceneGraphPriority(create_button_touch_listener, create_button); - // Creating, setting the position and assigning a placeholder to the text // field for entering the join game uuid. TextFieldTTF* join_text_field = cocos2d::TextFieldTTF::textFieldWithPlaceHolder( - "Join Game url", cocos2d::Size(400, 200), TextHAlignment::RIGHT, - "Arial", 42.0); - join_text_field->setPosition(100, 100); - join_text_field->setColorSpaceHolder(Color3B::GRAY); + "code", cocos2d::Size(200, 100), TextHAlignment::LEFT, "Arial", 55.0); + join_text_field->setPosition(420, 45); + join_text_field->setAnchorPoint(Vec2(0, 0)); + join_text_field->setColorSpaceHolder(Color3B::WHITE); join_text_field->setDelegate(this); + auto text_field_border = Sprite::create("text_field_border.png"); + text_field_border->setPosition(390, 50); + text_field_border->setAnchorPoint(Vec2(0, 0)); + text_field_border->setScale(.53f); + this->addChild(text_field_border, 0); // Create a touch listener to handle the touch event. TODO(grantpostma): add a // focus bar when selecting inside the text field's bounding box. auto text_field_touch_listener = EventListenerTouchOneByOne::create(); @@ -68,8 +72,13 @@ bool MainMenuScene::init() { // Show the on screen keyboard and places character inputs into the text // field. auto str = join_text_field->getString(); - auto textField = dynamic_cast(event->getCurrentTarget()); - textField->attachWithIME(); + auto text_field = dynamic_cast(event->getCurrentTarget()); + text_field->setCursorEnabled(true); + text_field->attachWithIME(); + } else { + auto text_field = dynamic_cast(event->getCurrentTarget()); + text_field->setCursorEnabled(false); + text_field->detachWithIME(); } return true; @@ -82,10 +91,12 @@ bool MainMenuScene::init() { join_text_field); // Creates a sprite for the join button and sets its position to the center - // of the screen. TODO(grantpostma): Dynamically choose the location. + // of the screen. TODO(grantpostma): Dynamically choose the location and set + // size(). auto join_button = Sprite::create("join_game.png"); - join_button->setPosition(450, 100); - + join_button->setPosition(25, 50); + join_button->setAnchorPoint(Vec2(0, 0)); + join_button->setScale(1.3f); // Create a button listener to handle the touch event. auto join_button_touch_listener = EventListenerTouchOneByOne::create(); // Setting the onTouchBegan event up to a lambda tha will replace the MainMenu @@ -95,11 +106,14 @@ bool MainMenuScene::init() { auto bounds = event->getCurrentTarget()->getBoundingBox(); auto point = touch->getLocation(); if (bounds.containsPoint(point)) { - // Getting and converting the join_text_field string to a char*. + // Getting the string from join_text_field. std::string join_text_field_string = join_text_field->getString(); - - Director::getInstance()->replaceScene( - TicTacToe::createScene(join_text_field_string)); + if (join_text_field_string.length() == 4) { + Director::getInstance()->replaceScene( + TicTacToe::createScene(join_text_field_string)); + } else { + join_text_field->setString(""); + } } return true; }; @@ -112,7 +126,7 @@ bool MainMenuScene::init() { // MainMenu scene. this->addChild(create_button); this->addChild(join_button); - this->addChild(join_text_field); + this->addChild(join_text_field, 1); return true; } diff --git a/demos/TicTacToe/Classes/TicTacToeLayer.cpp b/demos/TicTacToe/Classes/TicTacToeLayer.cpp index 8dd7122e..1553d087 100644 --- a/demos/TicTacToe/Classes/TicTacToeLayer.cpp +++ b/demos/TicTacToe/Classes/TicTacToeLayer.cpp @@ -33,6 +33,15 @@ static const int kEmptyTile = -1; static const int kPlayerOne = 0; static const int kPlayerTwo = 1; static const int kNumberOfPlayers = 2; + +// End game outcomes. +static const int kGameWon = 0; +static const int kGameLost = 1; +static const int kGameTied = 2; +static const int kGameDisbanded = 3; +static const std::array kGameOverStrings = { + "you won!", "you lost.", "you tied.", "user left."}; + // Game board dimensions. extern const int kTilesX; extern const int kTilesY; @@ -46,6 +55,7 @@ static const double kTileHeight = (kScreenHeight / kTilesY); static const int kEndGameFramesMax = 120; // Image file paths. static const char* kBoardImageFileName = "tic_tac_toe_board.png"; +static const char* kLeaveButtonFileName = "leave_button.png"; static std::array kPlayerTokenFileNames = { "tic_tac_toe_x.png", "tic_tac_toe_o.png"}; @@ -245,6 +255,7 @@ bool gameOver(int board[][kTilesY]) { TicTacToeLayer::TicTacToeLayer(string game_uuid) { join_game_uuid = game_uuid; current_player_index = kPlayerOne; + game_outcome = kGameWon; LogMessage("Initialized Firebase App."); auto app = ::firebase::App::Create(); LogMessage("Initialize Firebase Auth and Firebase Database."); @@ -252,12 +263,6 @@ TicTacToeLayer::TicTacToeLayer(string game_uuid) { // dependencies are missing. firebase::ModuleInitializer initializer; - /// Firebase Auth, used for logging into Firebase. - firebase::auth::Auth* auth; - - /// Firebase Realtime Database, the entry point to all database operations. - firebase::database::Database* database; - database = nullptr; auth = nullptr; void* initialize_targets[] = {&auth, &database}; @@ -326,32 +331,44 @@ TicTacToeLayer::TicTacToeLayer(string game_uuid) { ref.Child("total_players").SetValue(1); future_current_player_index = ref.Child("current_player_index").SetValue(kPlayerOne); + future_game_over = ref.Child("game_over").SetValue(false); + WaitForCompletion(future_game_over, "setGameOver"); WaitForCompletion(future_current_player_index, "setCurrentPlayerIndex"); WaitForCompletion(future_create_game, "createGame"); player_index = kPlayerOne; awaiting_opponenet_move = false; } else { - ref = database->GetReference("game_data").Child(join_game_uuid); - auto fIncrementTotalUsers = ref.RunTransaction([](MutableData* data) { - auto total_players = data->Child("total_players").value(); - // Completing the transaction based on the returned mutable data value. - if (total_players.is_null()) { - // Must return this if the transaction was unsuccessful. - return TransactionResult::kTransactionResultAbort; - } - int new_total_players = total_players.int64_value() + 1; - if (new_total_players > kNumberOfPlayers) { - // Must return this if the transaction was unsuccessful. - return TransactionResult::kTransactionResultAbort; - } - data->Child("total_players").set_value(new_total_players); - // Must call this if the transaction was successful. - return TransactionResult::kTransactionResultSuccess; - }); - WaitForCompletion(fIncrementTotalUsers, "JoinGameTransaction"); - - player_index = kPlayerTwo; - awaiting_opponenet_move = true; + // Checks whether the join_uuid map exists. If it does not it set the + // initialization to failed. + auto future_game_uuid = + database->GetReference("game_data").Child(join_game_uuid).GetValue(); + WaitForCompletion(future_game_uuid, "GetGameDataMap"); + auto game_uuid_snapshot = future_game_uuid.result(); + if (!game_uuid_snapshot->value().is_map()) { + initialization_failed = true; + } else { + ref = database->GetReference("game_data").Child(join_game_uuid); + auto fIncrementTotalUsers = ref.RunTransaction([](MutableData* data) { + auto total_players = data->Child("total_players").value(); + // Completing the transaction based on the returned mutable data value. + if (total_players.is_null()) { + // Must return this if the transaction was unsuccessful. + return TransactionResult::kTransactionResultAbort; + } + int new_total_players = total_players.int64_value() + 1; + if (new_total_players > kNumberOfPlayers) { + // Must return this if the transaction was unsuccessful. + return TransactionResult::kTransactionResultAbort; + } + data->Child("total_players").set_value(new_total_players); + // Must call this if the transaction was successful. + return TransactionResult::kTransactionResultSuccess; + }); + WaitForCompletion(fIncrementTotalUsers, "JoinGameTransaction"); + + player_index = kPlayerTwo; + awaiting_opponenet_move = true; + } } // Creating the board sprite , setting the position to the bottom left of the @@ -365,6 +382,47 @@ TicTacToeLayer::TicTacToeLayer(string game_uuid) { board_sprite->setPosition(0, 0); board_sprite->setAnchorPoint(Vec2(0.0, 0.0)); + leave_button_sprite = Sprite::create(kLeaveButtonFileName); + if (!leave_button_sprite) { + log("kLeaveButtonSprite: %s file not found.", kLeaveButtonFileName); + exit(true); + } + leave_button_sprite->setPosition(450, 585); + leave_button_sprite->setAnchorPoint(Vec2(0.0, 0.0)); + leave_button_sprite->setScale(.35); + + // Create a button listener to handle the touch event. + auto leave_button_sprite_touch_listener = + EventListenerTouchOneByOne::create(); + // Setting the onTouchBegan event up to a lambda will swap scenes and modify + // total_players + leave_button_sprite_touch_listener->onTouchBegan = + [this](Touch* touch, Event* event) -> bool { + auto bounds = event->getCurrentTarget()->getBoundingBox(); + auto point = touch->getLocation(); + // Replaces the scene with a new TicTacToe scene if the touched point is + // within the bounds of the button. + if (bounds.containsPoint(point)) { + // Update the game_outcome to reflect if the you rage quit or left + // pre-match. + if (remaining_tiles.size() == kNumberOfTiles) + game_outcome = kGameDisbanded; + else + game_outcome = kGameLost; + + WaitForCompletion(ref.Child("game_over").SetValue(true), "setGameOver"); + } + + return true; + }; + // Attaching the touch listener to the create game button. + Director::getInstance() + ->getEventDispatcher() + ->addEventListenerWithSceneGraphPriority( + leave_button_sprite_touch_listener, leave_button_sprite); + + board_sprite->addChild(leave_button_sprite, 1); + // TODO(grantpostma@): Modify these numbers to be based on the extern window // size & label size dimensions. cocos2d::Label* game_uuid_label = @@ -385,10 +443,13 @@ TicTacToeLayer::TicTacToeLayer(string game_uuid) { LogMessage("total_player_listener"); total_player_listener = std::make_unique(kNumberOfPlayers); + game_over_listener = std::make_unique(true); + current_player_index_listener = std::make_unique(); last_move_listener = std::make_unique(); LogMessage("%i", total_player_listener->got_value()); ref.Child("total_players").AddValueListener(total_player_listener.get()); + ref.Child("game_over").AddValueListener(game_over_listener.get()); ref.Child("current_player_index") .AddValueListener(current_player_index_listener.get()); ref.Child("last_move").AddValueListener(last_move_listener.get()); @@ -436,20 +497,21 @@ TicTacToeLayer::TicTacToeLayer(string game_uuid) { current_player_index; remaining_tiles.erase(selected_tile); current_player_index = (current_player_index + 1) % kNumberOfPlayers; - fLastMove = ref.Child("last_move").SetValue(selected_tile); + future_last_move = ref.Child("last_move").SetValue(selected_tile); future_current_player_index = ref.Child("current_player_index").SetValue(current_player_index); - WaitForCompletion(fLastMove, "setLastMove"); + WaitForCompletion(future_last_move, "setLastMove"); WaitForCompletion(future_current_player_index, "setCurrentPlayerIndex"); awaiting_opponenet_move = true; waiting_label->setString("waiting"); if (gameOver(board)) { - // Set game_over_label to reflect the use won. - game_over_label->setString("you won!"); + // Update game_outcome to reflect the use won. + WaitForCompletion(ref.Child("game_over").SetValue(true), "setGameOver"); + game_outcome = kGameWon; } else if (remaining_tiles.size() == 0) { - // Set game_over_label to reflect the game ended in a tie. - game_over_label->setString("you tied."); - // Changing back to the main menu scene. + // Update game_outcome to reflect the use tied. + WaitForCompletion(ref.Child("game_over").SetValue(true), "setGameOver"); + game_outcome = kGameTied; } } return true; @@ -466,13 +528,9 @@ TicTacToeLayer::TicTacToeLayer(string game_uuid) { // Called automatically every frame. The update is scheduled in constructor. void TicTacToeLayer::update(float /*delta*/) { - // Shows the end game label for kEndGameFramesMax to show the result of the - // game. - if (game_over_label->getString().empty() == false) { - end_game_frames++; - if (end_game_frames > kEndGameFramesMax) { - Director::getInstance()->replaceScene(MainMenuScene::createScene()); - } + // Replacing the scene with MainMenuScene if the initialization fails. + if (initialization_failed == true) { + Director::getInstance()->replaceScene(MainMenuScene::createScene()); } // Performs the actions of the other player when the // current_player_index_listener is equal to the player index. @@ -501,11 +559,28 @@ void TicTacToeLayer::update(float /*delta*/) { awaiting_opponenet_move = false; current_player_index = player_index; if (gameOver(board)) { - // Set game_over_label to reflect the use lost. - game_over_label->setString("you lost."); + // Set game_outcome to reflect the use lost. + game_outcome = kGameLost; } else if (remaining_tiles.size() == 0) { - // Set game_over_label to reflect the game ended in a tie. - game_over_label->setString("you tied."); + // Set game_outcome to reflect the game ended in a tie. + game_outcome = kGameTied; + } + } + // Shows the end game label for kEndGameFramesMax to show the result of the + // game. + else if (game_over_listener->got_value()) { + if (game_outcome == kGameDisbanded && + remaining_tiles.size() != kNumberOfTiles) + game_outcome = kGameWon; + game_over_label->setString(kGameOverStrings[game_outcome]); + end_game_frames++; + if (end_game_frames > kEndGameFramesMax) { + // TODO(grantpostma): Update authenticated users record. + WaitForCompletion(database->GetReference("game_data") + .Child(join_game_uuid) + .RemoveValue(), + "removeGameUuid"); + Director::getInstance()->replaceScene(MainMenuScene::createScene()); } } // Updates the waiting label to signify it is this players move. diff --git a/demos/TicTacToe/Classes/TicTacToeLayer.h b/demos/TicTacToe/Classes/TicTacToeLayer.h index 2a146a8b..0f75b83b 100644 --- a/demos/TicTacToe/Classes/TicTacToeLayer.h +++ b/demos/TicTacToe/Classes/TicTacToeLayer.h @@ -22,6 +22,7 @@ using firebase::database::TransactionResult; #include "firebase/future.h" #include "firebase/util.h" +using firebase::Future; static const int kTilesX = 3; static const int kTilesY = 3; @@ -36,9 +37,19 @@ class TicTacToeLayer : public Layer { TicTacToeLayer(std::string); ~TicTacToeLayer(); virtual void TicTacToeLayer::update(float); + // Tracks whether the board was unable to build + bool initialization_failed = false; + // Tracks the game outcome + int game_outcome; // Creating a string for the join game code and initializing the database // reference. std::string join_game_uuid; + /// Firebase Auth, used for logging into Firebase. + firebase::auth::Auth* auth; + + /// Firebase Realtime Database, the entry point to all database operations. + firebase::database::Database* database; + firebase::database::DatabaseReference ref; // Creating listeners for database values. // The database schema has a top level game_uuid object which includes @@ -46,13 +57,16 @@ class TicTacToeLayer : public Layer { std::unique_ptr current_player_index_listener; std::unique_ptr last_move_listener; std::unique_ptr total_player_listener; - // Creating lables and a sprite `for the board + std::unique_ptr game_over_listener; + // Creating lables and a sprites. Sprite* board_sprite; + Sprite* leave_button_sprite; cocos2d::Label* game_over_label; cocos2d::Label* waiting_label; // Creating firebase futures for last_move and current_player_index - firebase::Future fLastMove; - firebase::Future future_current_player_index; + Future future_last_move; + Future future_current_player_index; + Future future_game_over; // Creating the board, remaining available tile set and player index // variables. int current_player_index; diff --git a/demos/TicTacToe/Resources/create_game.png b/demos/TicTacToe/Resources/create_game.png new file mode 100644 index 0000000000000000000000000000000000000000..c7b08bbaf314012190c3ed7e37ceb9aaa9e309f9 GIT binary patch literal 16999 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 literal 0 HcmV?d00001 diff --git a/demos/TicTacToe/Resources/text_field_border.png b/demos/TicTacToe/Resources/text_field_border.png new file mode 100644 index 0000000000000000000000000000000000000000..cba85f27b8ac7114ca7e2dbd2263cd2d67396951 GIT binary patch literal 1627 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 From 789ee14a93ca54d3feffcf8aae3354dbbbf6c0e1 Mon Sep 17 00:00:00 2001 From: Grant-Postma Date: Fri, 19 Jun 2020 18:46:23 -0400 Subject: [PATCH 2/3] Snake_case fIncrementTotalUsers. if curly brackets. --- demos/TicTacToe/Classes/TicTacToeLayer.cpp | 44 ++++++++++++---------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/demos/TicTacToe/Classes/TicTacToeLayer.cpp b/demos/TicTacToe/Classes/TicTacToeLayer.cpp index ebe782d9..2cdff0d6 100644 --- a/demos/TicTacToe/Classes/TicTacToeLayer.cpp +++ b/demos/TicTacToe/Classes/TicTacToeLayer.cpp @@ -348,23 +348,25 @@ TicTacToeLayer::TicTacToeLayer(string game_uuid) { initialization_failed = true; } else { ref = database->GetReference("game_data").Child(join_game_uuid); - auto fIncrementTotalUsers = ref.RunTransaction([](MutableData* data) { - auto total_players = data->Child("total_players").value(); - // Completing the transaction based on the returned mutable data value. - if (total_players.is_null()) { - // Must return this if the transaction was unsuccessful. - return TransactionResult::kTransactionResultAbort; - } - int new_total_players = total_players.int64_value() + 1; - if (new_total_players > kNumberOfPlayers) { - // Must return this if the transaction was unsuccessful. - return TransactionResult::kTransactionResultAbort; - } - data->Child("total_players").set_value(new_total_players); - // Must call this if the transaction was successful. - return TransactionResult::kTransactionResultSuccess; - }); - WaitForCompletion(fIncrementTotalUsers, "JoinGameTransaction"); + auto future_increment_total_users = + ref.RunTransaction([](MutableData* data) { + auto total_players = data->Child("total_players").value(); + // Completing the transaction based on the returned mutable data + // value. + if (total_players.is_null()) { + // Must return this if the transaction was unsuccessful. + return TransactionResult::kTransactionResultAbort; + } + int new_total_players = total_players.int64_value() + 1; + if (new_total_players > kNumberOfPlayers) { + // Must return this if the transaction was unsuccessful. + return TransactionResult::kTransactionResultAbort; + } + data->Child("total_players").set_value(new_total_players); + // Must call this if the transaction was successful. + return TransactionResult::kTransactionResultSuccess; + }); + WaitForCompletion(future_increment_total_users, "JoinGameTransaction"); player_index = kPlayerTwo; awaiting_opponenet_move = true; @@ -405,10 +407,11 @@ TicTacToeLayer::TicTacToeLayer(string game_uuid) { if (bounds.containsPoint(point)) { // Update the game_outcome to reflect if the you rage quit or left // pre-match. - if (remaining_tiles.size() == kNumberOfTiles) + if (remaining_tiles.size() == kNumberOfTiles) { game_outcome = kGameDisbanded; - else + } else { game_outcome = kGameLost; + } WaitForCompletion(ref.Child("game_over").SetValue(true), "setGameOver"); } @@ -569,8 +572,9 @@ void TicTacToeLayer::update(float /*delta*/) { // game. else if (game_over_listener->got_value()) { if (game_outcome == kGameDisbanded && - remaining_tiles.size() != kNumberOfTiles) + remaining_tiles.size() != kNumberOfTiles) { game_outcome = kGameWon; + } game_over_label->setString(kGameOverStrings[game_outcome]); end_game_frames++; if (end_game_frames > kEndGameFramesMax) { From 515155ba81f646edc64eac3f1aab864bb1260102 Mon Sep 17 00:00:00 2001 From: Grant-Postma Date: Mon, 22 Jun 2020 12:10:47 -0400 Subject: [PATCH 3/3] Snake case --- demos/TicTacToe/Classes/TicTacToeLayer.cpp | 4 ++-- demos/TicTacToe/Classes/TicTacToeLayer.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/demos/TicTacToe/Classes/TicTacToeLayer.cpp b/demos/TicTacToe/Classes/TicTacToeLayer.cpp index a1a5320b..1af34c2c 100644 --- a/demos/TicTacToe/Classes/TicTacToeLayer.cpp +++ b/demos/TicTacToe/Classes/TicTacToeLayer.cpp @@ -436,10 +436,10 @@ TicTacToeLayer::TicTacToeLayer(string game_uuid) { current_player_index; remaining_tiles.erase(selected_tile); current_player_index = (current_player_index + 1) % kNumberOfPlayers; - fLastMove = ref.Child("last_move").SetValue(selected_tile); + future_last_move = ref.Child("last_move").SetValue(selected_tile); future_current_player_index = ref.Child("current_player_index").SetValue(current_player_index); - WaitForCompletion(fLastMove, "setLastMove"); + WaitForCompletion(future_last_move, "setLastMove"); WaitForCompletion(future_current_player_index, "setCurrentPlayerIndex"); awaiting_opponenet_move = true; waiting_label->setString("waiting"); diff --git a/demos/TicTacToe/Classes/TicTacToeLayer.h b/demos/TicTacToe/Classes/TicTacToeLayer.h index a25d4451..6d3e7495 100644 --- a/demos/TicTacToe/Classes/TicTacToeLayer.h +++ b/demos/TicTacToe/Classes/TicTacToeLayer.h @@ -50,7 +50,7 @@ class TicTacToeLayer : public Layer { cocos2d::Label* game_over_label; cocos2d::Label* waiting_label; // Creating firebase futures for last_move and current_player_index - firebase::Future fLastMove; + firebase::Future future_last_move; firebase::Future future_current_player_index; // Creating the board, remaining available tile set and player index // variables.