snakeplusplus/src/gamestate.cpp

124 lines
2.8 KiB
C++
Raw Normal View History

// GameState.cpp
2023-03-17 20:13:50 -05:00
#include <string>
#include <SFML/Graphics.hpp>
#include "common.h"
#include "display.h"
#include "gamestate.h"
GameState::GameState()
{
return;
}
2023-03-17 20:13:50 -05:00
void GameState::SetGameSettings(int argc, char* argv[])
{
std::string convertedString;
for (int i = 0; i < argc; i++)
{
convertedString = argv[i];
if (convertedString == "--no-sfml")
useSFML = false;
}
}
2023-03-12 08:50:50 -05:00
void GameState::StartGame()
{
2023-03-17 20:13:50 -05:00
ApplySettings();
ResetGameBoard();
graphics->StartGameWindow();
2023-03-12 08:50:50 -05:00
RunGameLoop();
return;
2023-03-12 08:50:50 -05:00
}
2023-03-17 20:13:50 -05:00
void GameState::ApplySettings(void)
{
if (useSFML)
graphics.reset(new SFML());
else
graphics.reset(new CommandLine());
return;
2023-03-17 20:13:50 -05:00
}
// TODO: Reimplement for DisplayInterface
void GameState::DisplayEndScreen(void)
{
graphics->DisplayEndScreen();
return;
}
2023-03-12 08:50:50 -05:00
sf::Vector2f GameState::GetGameBoundaries(void)
{
return graphics->gameBoundaries;
2023-03-12 08:50:50 -05:00
}
void GameState::GetKeyboardInput(void)
{
2023-03-17 20:13:50 -05:00
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
player.UpdateDirection(kLeft);
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
player.UpdateDirection(kUp);
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
player.UpdateDirection(kDown);
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
player.UpdateDirection(kRight);
return;
}
void GameState::PlaceNewSnakePart(sf::Vector2f location)
{
gameBoard.at(location.y).at(location.x) = 'o';
return;
}
void GameState::PlayerWantsToContinue(void)
{
graphics->CheckContinue();
return;
}
2023-03-12 08:50:50 -05:00
// Generates new food until not colliding with player
void GameState::RegenerateFood(void)
{
sf::Vector2f newLocation = playerFood.GetFoodLocation();
bool isUpdated = false;
2023-03-12 08:50:50 -05:00
// Keep making new food until generating a valid spot
2023-03-17 20:13:50 -05:00
while (gameBoard.at(newLocation.y).at(newLocation.x) == 'o')
{
isUpdated = true;
2023-03-12 08:50:50 -05:00
playerFood.GenerateNewFood(GetGameBoundaries());
newLocation = playerFood.GetFoodLocation();
}
if (isUpdated)
gameBoard.at(newLocation.y).at(newLocation.x) = 'x';
2023-03-12 08:50:50 -05:00
return;
}
void GameState::ResetGameBoard(void)
{
gameBoard.clear();
sf::Vector2f boardDimensions = GetGameBoundaries();
std::vector<char> tempBoard;
tempBoard.resize(boardDimensions.x, ' ');
gameBoard.resize(boardDimensions.y, tempBoard);
playerFood.GenerateNewFood(boardDimensions);
sf::Vector2f foodStartLocation = playerFood.GetFoodLocation();
gameBoard.at(foodStartLocation.y).at(foodStartLocation.x) = 'x';
return;
}
2023-03-12 08:50:50 -05:00
void GameState::RunGameLoop(void)
{
while (graphics->IsOpen())
{
GetKeyboardInput();
PlaceNewSnakePart(player.MoveSnake());
2023-03-12 08:50:50 -05:00
RegenerateFood();
graphics->DisplayGameState(&gameBoard);
if (isGameOver)
PlayerWantsToContinue();
}
return;
}
2023-03-12 08:50:50 -05:00