Long-Starlight-Snake-Game/Grid.hpp

97 lines
2.2 KiB
C++

#include "SynEngine.hpp"
class Grid : public IDrawable
{
private:
sf::Vector2i offset;
sf::Vector2i gridSize;
Cell *cellArray;
unsigned int cellCount;
Cell *CreateCellArray(sf::Vector2i);
public:
Grid();
void ApplyGridLimitsToVector2i(sf::Vector2i &);
bool SetGrid();
void UpdateCell(int, int, unsigned int, int = -1);
void Draw(sf::RenderWindow *);
~Grid();
};
Grid::Grid()
{
cellArray = NULL;
}
Cell *Grid::CreateCellArray(sf::Vector2i)
{
cellCount = gridSize.x *gridSize.y;
Cell *array = new Cell[cellCount];
if(!array) return NULL;
GameConfiguration *config = GameManager::GetConfig();
sf::Vector2i cellSize = config -> GetSpriteCellSize();
float sizeMultiplier = config -> GetSpriteSizeMultiplier();
int xPos;
int yPos;
int i;
for (i = 0; i < cellCount; i++)
{
xPos = (i % gridSize.x) * cellSize.x * sizeMultiplier + offset.x;
yPos = ((cellCount - i - 1) / gridSize.x) * cellSize.y * sizeMultiplier + offset.y;
(array + i) -> Set(xPos, yPos);
}
return array;
}
void Grid::ApplyGridLimitsToVector2i(sf::Vector2i &vector)
{
vector.x %= gridSize.x; if(vector.x < 0) vector.x += gridSize.x;
vector.y %= gridSize.y; if(vector.y < 0) vector.y += gridSize.y;
}
bool Grid::SetGrid()
{
GameConfiguration *config = GameManager::GetConfig();
if(!config) return false;
sf::Vector2i screenDimensions = config -> GetScreenDimensions();
gridSize = config -> GetGridSize();
offset = config -> GetGridOffset();
cellArray = CreateCellArray(gridSize);
return true;
}
void Grid::UpdateCell(int x, int y, unsigned int spriteIndex, int direction)
{
x %= gridSize.x; if(x < 0) x += gridSize.x;
y %= gridSize.y; if(y < 0) y += gridSize.y;
int index = x + gridSize.x * y;
Cell *cell = cellArray + index;
cell -> UpdateSprite(spriteIndex);
if(direction >= 0)
cell -> UpdateRotation(direction);
}
void Grid::Draw(sf::RenderWindow *window)
{
int i;
for (i = 0; i < cellCount; i++)
(cellArray + i) -> Draw(window);
}
Grid::~Grid()
{
delete[] cellArray;
}