From 4220c36ec92824e364c36e48f3fa04c6c8ab7157 Mon Sep 17 00:00:00 2001 From: TanishTuteja Date: Sat, 16 Apr 2022 22:45:07 +0530 Subject: [PATCH] Completed top and side viewports --- Game.cpp | 146 +++++++++++++++++++++++++++++++++++---------- Game.h | 9 ++- MessageStructs.cpp | 14 ++--- MessageStructs.h | 2 +- MyWindow.cpp | 10 ++++ MyWindow.h | 5 +- constants.h | 4 +- 7 files changed, 146 insertions(+), 44 deletions(-) diff --git a/Game.cpp b/Game.cpp index a8c8970..945363d 100644 --- a/Game.cpp +++ b/Game.cpp @@ -22,9 +22,9 @@ #include #include "MessageStructs.h" - LGame::LGame(LWindow &window, std::string playerName, std::string opponentName, int &sockfd, sockaddr_in &theiraddr) : LScreen(window), playerName(playerName), opponentName(opponentName), sockfd(sockfd), theirAddr(theiraddr) { + window.maximize(); std::cout << "Name: " << playerName << " Opponent: " << opponentName << std::endl; backGroundMusic = Mix_LoadMUS("resources/music.mpeg"); introMusic = Mix_LoadWAV("resources/intro.wav"); @@ -47,6 +47,7 @@ void LGame::initTasks() it = std::find(currTasks.begin(), currTasks.end(), t); } while (it != currTasks.end()); currTasks.push_back(t); + taskTexts[i]->setText(t.second); } } @@ -66,7 +67,7 @@ void LGame::update() // Move the dot players[0].move(); players[1].move(); - NPCs[0].move() ; + NPCs[0].move(); SDL_Rect playerBox = players[0].getBox(); // std::cout << "After move " << playerBox.y << std::endl; @@ -99,7 +100,7 @@ void LGame::update() timeText->setText("TIME: " + hours + ":" + mins); pointsText->setText("POINTS: " + std::to_string(players[0].getPoints())); moneyText->setText("MONEY: " + std::to_string(players[0].getMoney())); - healthText->setText("HEALTH:"); + // healthText->setText("HEALTH: "); if (displayText == "") displayText = std::string("INSTRUCTIONS WILL APPEAR HERE, YOUR HOSTEL IS ") + players[0].getHostelName(); if (players[0].isBusy()) @@ -119,7 +120,7 @@ void LGame::update() gameUpdateMsg.moveFactor = players[0].getMoveFactor(); gameUpdateMsg.money = players[0].getMoney(); gameUpdateMsg.points = players[0].getPoints(); - // gameUpdateMsg.health = players[0].getHealth(); + gameUpdateMsg.health = players[0].getHealth(); int bytesUsed = serialize(&gameUpdateMsg, buf); sendto(sockfd, buf, bytesUsed, 0, (const struct sockaddr *)&theirAddr, @@ -142,7 +143,7 @@ void LGame::update() players[1].setMoveFactor(updateMsg->moveFactor); players[1].setPoints(updateMsg->points); players[1].setMoney(updateMsg->money); - // players[1].setHealth(updateMsg->health); + players[1].setHealth(updateMsg->health); } delete msg; } @@ -150,15 +151,17 @@ void LGame::update() { fprintf(stderr, "socket() failed: %s\n", strerror(errno)); } + pointsTextOpp->setText("POINTS: " + std::to_string(players[1].getPoints())); + moneyTextOpp->setText("MONEY: " + std::to_string(players[1].getMoney())); } void LGame::render(SDL_Renderer *renderer) { SDL_Rect viewport; viewport.x = 0; - viewport.y = gyRenderOffset; - viewport.w = window.getWidth(); - viewport.h = window.getHeight() - gyRenderOffset - gyRenderOffset; + viewport.y = 2 * gyRenderOffset + 3 * gyPadding; + viewport.w = window.getWidth() - tasksVPWidth; + viewport.h = window.getHeight() - 3 * gyRenderOffset - 5 * gyPadding; SDL_RenderSetViewport(renderer, &viewport); for (size_t i = 0; i < renderables.size(); i++) @@ -175,52 +178,114 @@ void LGame::render(SDL_Renderer *renderer) viewport.x = 0; viewport.y = 0; viewport.w = window.getWidth(); - viewport.h = gyRenderOffset; + viewport.h = 2 * gyRenderOffset + 3 * gyPadding; SDL_RenderSetViewport(renderer, &viewport); - SDL_SetRenderDrawColor(renderer, 0xFF, 0x00, 0x00, 0xFF); - int offset = timeText->getWidth() + 32; - timeText->render(renderer, window.getWidth() - offset, gyTextOffset); - offset += gMaxPlayerHealth + gxTextSpacing; - SDL_Rect fillRect = {window.getWidth() - offset, gyTextOffset, (players[0].getHealth() * (gMaxPlayerHealth) / mMaxPlayerHealth), 32}; - SDL_RenderFillRect(renderer, &fillRect); - SDL_Rect outlineRect = {window.getWidth() - offset, gyTextOffset, gMaxPlayerHealth, 32}; + // int offset = timeText->getWidth() + 32; + // timeText->render(renderer, window.getWidth() - offset, gyPadding); + + int offset = gMaxPlayerHealth + gxTextSpacing; + SDL_SetRenderDrawColor(renderer, 0xFF, 0x00, 0x00, 0xFF); + SDL_Rect fillRect = {window.getWidth() - offset, 2 * gyPadding + gyRenderOffset, (players[0].getHealth() * (gMaxPlayerHealth) / mMaxPlayerHealth), gyRenderOffset}; + SDL_RenderFillRect(renderer, &fillRect); + SDL_Rect outlineRect = {window.getWidth() - offset, 2 * gyPadding + gyRenderOffset, gMaxPlayerHealth, gyRenderOffset}; SDL_RenderDrawRect(renderer, &outlineRect); - offset += healthText->getWidth() + 10; - healthText->render(renderer, window.getWidth() - offset, gyTextOffset); + offset += healthText->getWidth() + gxTextSpacing; + healthText->render(renderer, window.getWidth() - offset, 2 * gyPadding + gyRenderOffset); offset += moneyText->getWidth() + gxTextSpacing; - moneyText->render(renderer, window.getWidth() - offset, gyTextOffset); + moneyText->render(renderer, window.getWidth() - offset, 2 * gyPadding + gyRenderOffset); offset += pointsText->getWidth() + gxTextSpacing; - pointsText->render(renderer, window.getWidth() - offset, gyTextOffset); + pointsText->render(renderer, window.getWidth() - offset, 2 * gyPadding + gyRenderOffset); + offset += pointsText->getWidth(); + + nameText->render(renderer, window.getWidth() - offset / 2, gyPadding); + + timeText->render(renderer, (window.getWidth() - timeText->getWidth()) / 2, (3 * gyPadding) / 2 + gyRenderOffset - timeText->getHeight() / 2); + + offset = gxTextSpacing; + healthText->render(renderer, offset, 2 * gyPadding + gyRenderOffset); + + offset += healthText->getWidth(); + SDL_SetRenderDrawColor(renderer, 0xFF, 0x00, 0x00, 0xFF); + fillRect = {offset, 2 * gyPadding + gyRenderOffset, (players[1].getHealth() * (gMaxPlayerHealth) / mMaxPlayerHealth), gyRenderOffset}; + SDL_RenderFillRect(renderer, &fillRect); + outlineRect = {offset, 2 * gyPadding + gyRenderOffset, gMaxPlayerHealth, gyRenderOffset}; + SDL_RenderDrawRect(renderer, &outlineRect); + + offset += gMaxPlayerHealth + gxTextSpacing; + moneyTextOpp->render(renderer, offset, 2 * gyPadding + gyRenderOffset); + + offset += moneyText->getWidth() + gxTextSpacing; + pointsTextOpp->render(renderer, offset, 2 * gyPadding + gyRenderOffset); + + offset += pointsTextOpp->getWidth(); + oppText->render(renderer, offset / 2, gyPadding); viewport.x = 0; - viewport.y = window.getHeight() - gyRenderOffset; + viewport.y = window.getHeight() - gyRenderOffset - 2 * gyPadding; viewport.w = window.getWidth(); - viewport.h = gyRenderOffset; + viewport.h = gyRenderOffset + 2 * gyPadding; SDL_RenderSetViewport(renderer, &viewport); - prompText->render(renderer, 0, 0); + prompText->render(renderer, 0, gyPadding); + if (players[0].isBusy()) { SDL_SetRenderDrawColor(renderer, 0xFd, 0xb3, 0x36, 0xFF); offset = taskStatusBarWidth + 10; - SDL_Rect fillRect = {window.getWidth() - offset, gyTextOffset, ((int)players[0].getCurrentTaskTimer().getTicks() * (taskStatusBarWidth)) / (players[0].getCurrentTaskTime()), gyRenderOffset}; + SDL_Rect fillRect = {window.getWidth() - offset, gyPadding, ((int)players[0].getCurrentTaskTimer().getTicks() * (taskStatusBarWidth)) / (players[0].getCurrentTaskTime()), gyRenderOffset}; SDL_RenderFillRect(renderer, &fillRect); - SDL_Rect outlineRect = {window.getWidth() - offset, gyTextOffset, taskStatusBarWidth, gyRenderOffset}; + SDL_Rect outlineRect = {window.getWidth() - offset, gyPadding, taskStatusBarWidth, gyRenderOffset}; SDL_RenderDrawRect(renderer, &outlineRect); } + + viewport.x = window.getWidth() - tasksVPWidth; + viewport.y = 3 * gyPadding + 2 * gyRenderOffset; + viewport.w = tasksVPWidth; + viewport.h = window.getHeight() - (5 * gyPadding + 3 * gyRenderOffset); + SDL_RenderSetViewport(renderer, &viewport); + + SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0xFF); + outlineRect = {0, 0, tasksVPWidth, window.getHeight() - (5 * gyPadding + 3 * gyRenderOffset)}; + SDL_RenderDrawRect(renderer, &outlineRect); + + int maxHeight = taskTexts[0]->getHeight(); + for (int i = 0; i < taskTexts.size(); i++) + { + maxHeight = maxHeight > taskTexts[i]->getHeight() ? maxHeight : taskTexts[i]->getHeight(); + } + + tasksText->render(renderer, (tasksVPWidth - tasksText->getWidth()) / 2, 16); + for (int i = 0; i < taskTexts.size(); i++) + { + taskTexts[i]->render(renderer, 8, (16 + maxHeight) * i + 20 + tasksText->getHeight() + 16); + } } void LGame::cleanUp() { + window.restore(); players[0].cleanUp(); players[1].cleanUp(); tiles[0].cleanUp(); - NPCs[0].cleanUp() ; + NPCs[0].cleanUp(); delete timeText; + delete healthText; + delete pointsText; + delete moneyText; + delete oppText; + delete nameText; + delete moneyTextOpp; + delete pointsTextOpp; + + for (int i = 0; i < currTasks.size(); i++) + { + delete taskTexts[i]; + } + delete sleepingAnimation; Mix_FreeMusic(backGroundMusic); Mix_FreeChunk(introMusic); @@ -236,7 +301,7 @@ bool LGame::initObjs() printf("Failed to load ash texture!\n"); return false; } - if (!window.loadTexture( dogTexture, "resources/dog.png")) + if (!window.loadTexture(dogTexture, "resources/dog.png")) { printf("Failed to load dog texture!\n"); return false; @@ -286,8 +351,8 @@ bool LGame::initObjs() Player ash(ashTexture, *this, 32, 32, 3, 1, 2, 0); players.push_back(ash); - NPC dog( dogTexture , *this , 32 , 32 , 1 , 3 , 2 , 0) ; - NPCs.push_back( dog ) ; + NPC dog(dogTexture, *this, 32, 32, 1, 3, 2, 0); + NPCs.push_back(dog); Player opponent(ashTexture, *this, 32, 32, 3, 1, 2, 0); players.push_back(opponent); @@ -315,10 +380,23 @@ bool LGame::initObjs() SDL_Color txtColor = {0, 0, 0, 255}; TTF_Font *font = TTF_OpenFont("resources/FrostbiteBossFight-dL0Z.ttf", 28); + TTF_Font *fontSmall = TTF_OpenFont("resources/FrostbiteBossFight-dL0Z.ttf", 26); + timeText = new Text(window, "00:00", font, txtColor); - healthText = new Text(window, "HEALTH :: ", font, txtColor); - moneyText = new Text(window, "MONEY:: ", font, txtColor); - pointsText = new Text(window, "POINTS:: ", font, txtColor); + healthText = new Text(window, "HEALTH: ", font, txtColor); + moneyText = new Text(window, "MONEY: ", font, txtColor); + pointsText = new Text(window, "POINTS: ", font, txtColor); + moneyTextOpp = new Text(window, "MONEY: ", font, txtColor); + pointsTextOpp = new Text(window, "POINTS: ", font, txtColor); + nameText = new Text(window, playerName, font, txtColor); + oppText = new Text(window, opponentName, font, txtColor); + tasksText = new Text(window, "TASKS", font, txtColor); + + for (int i = 0; i < tasksNum; i++) + { + taskTexts.push_back(new Text(window, "DUMMY", fontSmall, txtColor)); + } + displayText = "YOU HAVE BEEN ASSIGNED HOSTEL " + players[0].getHostelName(); prompText = new Text(window, displayText, font, txtColor); @@ -334,7 +412,8 @@ bool LGame::initObjs() { renderables.push_back(&NPCs[i]); } - std::cout << "OBJECTS INITIALIZED" << "\n" ; + std::cout << "OBJECTS INITIALIZED" + << "\n"; globalTime.start(); return true; } @@ -862,6 +941,7 @@ void LGame::replaceTask(std::pair task) it2 = std::find(currTasks.begin(), currTasks.end(), t); } while (it2 != currTasks.end()); currTasks[index] = t; + taskTexts[index]->setText(t.second); } void LGame::replaceTask(int task) diff --git a/Game.h b/Game.h index b9113a0..7c3cdc5 100644 --- a/Game.h +++ b/Game.h @@ -36,7 +36,7 @@ class LGame : public LScreen std::vector> currTasks; int tasksNum = 2; - std::string serverIp; + // std::string serverIp; std::string playerName, opponentName; int &sockfd; @@ -73,12 +73,19 @@ class LGame : public LScreen void initEntities(); LTimer globalTime; + Text *nameText; + Text *oppText; Text *timeText; Text *healthText; Text *moneyText; Text *pointsText; + Text *moneyTextOpp; + Text *pointsTextOpp; // for instructions on object collision Text *prompText; + Text *tasksText; + + std::vector taskTexts; public: LGame(LWindow &window, std::string playerName, std::string opponentName, int &sockfd, sockaddr_in &theiraddr); diff --git a/MessageStructs.cpp b/MessageStructs.cpp index 93f6696..dd72090 100644 --- a/MessageStructs.cpp +++ b/MessageStructs.cpp @@ -57,10 +57,10 @@ int serialize(Message *msg, char *data) *q = msgGameUpdate->points; q++; bytesUsed += 7 * sizeof(int); - // float *p = (float *)q; - // *q = msgGameUpdate->health; - // q++; - // bytesUsed += sizeof(float); + float *p = (float *)q; + *q = msgGameUpdate->health; + q++; + bytesUsed += sizeof(float); char *r = (char *)q; *r = '\0'; r++; @@ -125,9 +125,9 @@ Message *deserialize(char *data) q++; msgGameUpdate->points = *q; q++; - // float *p = (float *)q; - // msgGameUpdate->health = *p; - // p++; + float *p = (float *)q; + msgGameUpdate->health = *p; + p++; return msgGameUpdate; } default: diff --git a/MessageStructs.h b/MessageStructs.h index a8cf8a8..542639e 100644 --- a/MessageStructs.h +++ b/MessageStructs.h @@ -36,7 +36,7 @@ struct GameUpdateMessage : Message type = 2; } int x, y, velX, velY, moveFactor, money, points; - // float health; + float health; }; int serialize(Message *msg, char *data); diff --git a/MyWindow.cpp b/MyWindow.cpp index 67ac2d5..81e4e65 100644 --- a/MyWindow.cpp +++ b/MyWindow.cpp @@ -305,4 +305,14 @@ void LWindow::cleanUp() LScreen *LWindow::getCurrScreen() { return mCurrScreen; +} + +void LWindow::maximize() +{ + SDL_MaximizeWindow(mWindow); +} + +void LWindow::restore() +{ + SDL_RestoreWindow(mWindow); } \ No newline at end of file diff --git a/MyWindow.h b/MyWindow.h index 4bd3197..85be0af 100644 --- a/MyWindow.h +++ b/MyWindow.h @@ -1,7 +1,7 @@ #ifndef WINDOW_H #define WINDOW_H -#include +#include #include #include #include @@ -38,6 +38,9 @@ class LWindow void setCurrScreen(LScreen *screen); LScreen *getCurrScreen(); + void maximize(); + void restore(); + private: bool initLibs(); void cleanUp(); diff --git a/constants.h b/constants.h index b1d724c..85b13f2 100644 --- a/constants.h +++ b/constants.h @@ -1,8 +1,10 @@ const int gyRenderOffset = 32; const int gMaxPlayerHealth = 100; const int gyTextOffset = 0; -const int gxTextSpacing = 50; +const int gxTextSpacing = 40; const int FPSupdatespeed = 50; const int secondPerHealthDecrease = 1; const int secondPerHealthDecreasewithYulu = 5; const int taskStatusBarWidth = 100; +const int gyPadding = 8; +const int tasksVPWidth = 240; \ No newline at end of file