multiplayer pong game for LPC 1768

Dependencies:   mbed MbedJSONValue mbed-rtos Adafruit_ST7735 Adafruit_GFX EthernetInterface DebouncedInterrupt

Committer:
vsoltan
Date:
Sat Nov 28 03:22:06 2020 +0000
Revision:
32:7cbf4d9a82af
Parent:
30:59e9a5409e65
Child:
34:b19f39ad74ac
flush the socket upon game restart

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vsoltan 17:32ae1f106002 1
vsoltan 18:32fce82690a1 2 #include "gamestate.h"
vsoltan 15:9d90f68e53da 3
vsoltan 15:9d90f68e53da 4 GameState::GameState() {
vsoltan 15:9d90f68e53da 5 Coord playerOneLocation = {0, 0};
vsoltan 15:9d90f68e53da 6 Coord playerTwoLocation = {0, 0};
vsoltan 15:9d90f68e53da 7 Coord ballLocation = {0, 0};
vsoltan 18:32fce82690a1 8 this->localPlayerNum = 0;
vsoltan 15:9d90f68e53da 9 this->p1_loc = playerOneLocation;
vsoltan 15:9d90f68e53da 10 this->p2_loc = playerTwoLocation;
vsoltan 15:9d90f68e53da 11 this->ball_loc = ballLocation;
vsoltan 25:4a965eccb922 12 this->has_started = 0;
vsoltan 29:4708bfb863cb 13 this->countdown = 0;
vsoltan 27:fcc5fee18a24 14 this->is_done = 0;
vsoltan 27:fcc5fee18a24 15 this->score[0] = 0;
vsoltan 27:fcc5fee18a24 16 this->score[1] = 0;
vsoltan 15:9d90f68e53da 17 }
vsoltan 15:9d90f68e53da 18
vsoltan 15:9d90f68e53da 19 Coord GameState::getPlayerOneLocation() {
vsoltan 15:9d90f68e53da 20 return this->p1_loc;
vsoltan 15:9d90f68e53da 21 }
vsoltan 15:9d90f68e53da 22
vsoltan 15:9d90f68e53da 23 Coord GameState::getPlayerTwoLocation() {
vsoltan 15:9d90f68e53da 24 return this->p2_loc;
vsoltan 15:9d90f68e53da 25 }
vsoltan 15:9d90f68e53da 26
vsoltan 15:9d90f68e53da 27 Coord GameState::getBallLocation() {
vsoltan 15:9d90f68e53da 28 return this->ball_loc;
vsoltan 15:9d90f68e53da 29 }
vsoltan 15:9d90f68e53da 30
vsoltan 27:fcc5fee18a24 31 void GameState::updateAndRender(MbedJSONValue *serverResponse, Graphics *gfx) {
vsoltan 18:32fce82690a1 32 string typeResponse = (*serverResponse)["type"].get<std::string>();
vsoltan 32:7cbf4d9a82af 33 if (typeResponse == "connected") {
vsoltan 25:4a965eccb922 34 if (serverResponse->hasMember("player")) {
vsoltan 25:4a965eccb922 35 this->localPlayerNum = (char)(*serverResponse)["player"].get<int>();
vsoltan 25:4a965eccb922 36 }
vsoltan 18:32fce82690a1 37 gfx->renderWaitingRoom();
vsoltan 18:32fce82690a1 38 } else if (typeResponse == "gameState") {
vsoltan 29:4708bfb863cb 39 MbedJSONValue &serverGameState = (*serverResponse)["gameState"];
vsoltan 29:4708bfb863cb 40 if (!has_started && serverGameState.hasMember("countdown")) {
vsoltan 30:59e9a5409e65 41 int countdownValue = (serverGameState)["countdown"].get<int>() / 1000;
vsoltan 29:4708bfb863cb 42 if (countdownValue > 0) {
vsoltan 30:59e9a5409e65 43 gfx->eraseCountdown(this);
vsoltan 30:59e9a5409e65 44 setCountdown(countdownValue);
vsoltan 30:59e9a5409e65 45 gfx->renderCountdown(this);
vsoltan 29:4708bfb863cb 46 return;
vsoltan 29:4708bfb863cb 47 } else {
vsoltan 29:4708bfb863cb 48 has_started = 1;
vsoltan 29:4708bfb863cb 49 printf("reseting display\n\r");
vsoltan 29:4708bfb863cb 50 gfx->reset();
vsoltan 29:4708bfb863cb 51 }
vsoltan 23:c38680c32552 52 }
vsoltan 23:c38680c32552 53 gfx->eraseGameState(this);
vsoltan 29:4708bfb863cb 54
vsoltan 21:992294ffabf4 55 if (serverGameState.hasMember("playerOnePos")) {
vsoltan 23:c38680c32552 56 this->p1_loc.x = (serverGameState)["playerOnePos"].get<int>();
vsoltan 21:992294ffabf4 57 }
vsoltan 21:992294ffabf4 58 if (serverGameState.hasMember("playerTwoPos")) {
vsoltan 23:c38680c32552 59 this->p2_loc.x = (serverGameState)["playerTwoPos"].get<int>();
vsoltan 21:992294ffabf4 60 }
vsoltan 21:992294ffabf4 61 if (serverGameState.hasMember("ballPos")) {
vsoltan 22:1c49e1fae846 62
vsoltan 22:1c49e1fae846 63 int8_t updated_ball_x = (int8_t)(serverGameState)["ballPos"][0].get<int>();
vsoltan 22:1c49e1fae846 64 int8_t updated_ball_y = (int8_t)(serverGameState)["ballPos"][1].get<int>();
vsoltan 21:992294ffabf4 65 this->ball_loc.x = updated_ball_x;
vsoltan 21:992294ffabf4 66 this->ball_loc.y = updated_ball_y;
vsoltan 21:992294ffabf4 67 }
vsoltan 21:992294ffabf4 68 if (serverGameState.hasMember("isOver")) {
vsoltan 21:992294ffabf4 69 this->is_done = (char)(serverGameState)["isOver"].get<int>();
vsoltan 21:992294ffabf4 70 }
vsoltan 27:fcc5fee18a24 71 if (serverGameState.hasMember("score")) {
vsoltan 27:fcc5fee18a24 72 this->score[0] = (serverGameState)["score"][0].get<int>();
vsoltan 27:fcc5fee18a24 73 this->score[1] = (serverGameState)["score"][1].get<int>();
vsoltan 27:fcc5fee18a24 74 }
vsoltan 23:c38680c32552 75 // TODO: check if hash has already been set
vsoltan 21:992294ffabf4 76 if (serverGameState.hasMember("hash")) {
vsoltan 23:c38680c32552 77 strcpy(this->lobbyHash,
vsoltan 23:c38680c32552 78 (serverGameState)["hash"].get<std::string>().c_str());
vsoltan 27:fcc5fee18a24 79 this->lobbyHash[20] = 0;
vsoltan 22:1c49e1fae846 80 }
vsoltan 20:b2687089661c 81 gfx->renderGameState(this);
vsoltan 18:32fce82690a1 82 }
vsoltan 15:9d90f68e53da 83 }
vsoltan 15:9d90f68e53da 84
vsoltan 19:58cc5465f647 85 Coord GameState::getPlayerLocation(char player) {
vsoltan 19:58cc5465f647 86 if (player == 0) {
vsoltan 19:58cc5465f647 87 return getPlayerOneLocation();
vsoltan 19:58cc5465f647 88 }
vsoltan 19:58cc5465f647 89 return getPlayerTwoLocation();
vsoltan 19:58cc5465f647 90 }
vsoltan 19:58cc5465f647 91
vsoltan 23:c38680c32552 92 char *GameState::getLobbyHash() {
vsoltan 23:c38680c32552 93 return this->lobbyHash;
vsoltan 23:c38680c32552 94 }
vsoltan 23:c38680c32552 95
vsoltan 19:58cc5465f647 96 char GameState::getLocalPlayerNum() {
vsoltan 19:58cc5465f647 97 return this->localPlayerNum;
vsoltan 30:59e9a5409e65 98 }
vsoltan 19:58cc5465f647 99
vsoltan 30:59e9a5409e65 100 int GameState::getCountdown() {
vsoltan 29:4708bfb863cb 101 return this->countdown;
vsoltan 29:4708bfb863cb 102 }
vsoltan 29:4708bfb863cb 103
vsoltan 29:4708bfb863cb 104 void GameState::setCountdown(int val) {
vsoltan 29:4708bfb863cb 105 this->countdown = val;
vsoltan 29:4708bfb863cb 106 }
vsoltan 29:4708bfb863cb 107
vsoltan 27:fcc5fee18a24 108 int GameState::getPlayerOneScore() {
vsoltan 27:fcc5fee18a24 109 return this->score[0];
vsoltan 27:fcc5fee18a24 110 }
vsoltan 27:fcc5fee18a24 111
vsoltan 27:fcc5fee18a24 112 int GameState::getPlayerTwoScore() {
vsoltan 27:fcc5fee18a24 113 return this->score[1];
vsoltan 27:fcc5fee18a24 114 }
vsoltan 27:fcc5fee18a24 115
vsoltan 30:59e9a5409e65 116 char GameState::hasStarted() {
vsoltan 30:59e9a5409e65 117 return this->has_started;
vsoltan 30:59e9a5409e65 118 }
vsoltan 30:59e9a5409e65 119
vsoltan 27:fcc5fee18a24 120 char GameState::done() {
vsoltan 15:9d90f68e53da 121 return this->is_done;
vsoltan 15:9d90f68e53da 122 }