2P11/src/View/MainWindow.cpp

216 lines
5.1 KiB
C++
Raw Normal View History

#include "MainWindow.hpp"
MainWindow::MainWindow(int width, int height, std::string title):
RenderWindow(sf::VideoMode(width,height), title,sf::Style::Titlebar | sf::Style::Close),
m_skin(),
2015-05-04 12:55:15 +02:00
m_windowSize(),
m_cellSize(105,105),
m_gridSize(0,0),
m_gridPosition(),
m_spaceBetweenCell(15),
m_font()
{
//Set windows size
2015-05-03 17:34:47 +02:00
m_windowSize=RenderWindow::getSize();
2015-05-04 12:55:15 +02:00
m_gridPosition=sf::Vector2u(50,200);
//Load font
m_font.loadFromFile("./src/skin/original/Pragmatica-Medium.ttf");
2015-05-03 17:34:47 +02:00
2015-05-03 17:18:10 +02:00
//Define original skin:
m_skin.push_back(sf::Color(250,248,239)); //Background MainWindow
m_skin.push_back(sf::Color(205,192,180)); //Background cells
m_skin.push_back(sf::Color(187,173,160)); //Background grid color
m_skin.push_back(sf::Color(119,110,101)); //2 and 4 font color
2015-05-04 12:55:15 +02:00
m_skin.push_back(sf::Color(143,122,102)); //Button color
2015-05-03 17:18:10 +02:00
m_skin.push_back(sf::Color(249,246,242)); //other number font Color
2015-05-04 12:55:15 +02:00
m_skin.push_back(sf::Color(238,228,218,186)); //Game over color bg
2015-05-03 17:18:10 +02:00
//Skin 2 et le 4
m_skin.push_back(sf::Color(238,228,218)); //2
m_skin.push_back(sf::Color(237,224,200)); //4
//Skin 8 à 64
m_skin.push_back(sf::Color(242,177,121)); //8
m_skin.push_back(sf::Color(245,149,99)); //16
m_skin.push_back(sf::Color(246,124,95)); //32
m_skin.push_back(sf::Color(246,94,59)); //64
//Skin 128 à 2048
m_skin.push_back(sf::Color(237,207,114)); //128
m_skin.push_back(sf::Color(237,204,97)); //256
m_skin.push_back(sf::Color(237,200,80)); //512
m_skin.push_back(sf::Color(237,197,63)); //1024
m_skin.push_back(sf::Color(238,194,46)); //2048
//Skin for other number
m_skin.push_back(sf::Color(60,58,50)); //More than 2048
}
MainWindow::~MainWindow(){
}
void MainWindow::clearBG(){
RenderWindow::clear(m_skin.at(0));
}
2015-05-04 12:55:15 +02:00
void MainWindow::drawGrid(std::vector<std::vector<int> > grid, bool gameIsOver){
//First draw the grid
2015-05-04 12:55:15 +02:00
int gridX=m_gridPosition.x;
int gridY=m_gridPosition.y;
m_gridSize.x=(grid.at(0).size()*m_cellSize.x)+(grid.at(0).size()*m_spaceBetweenCell)+m_spaceBetweenCell;
m_gridSize.y=(grid.size()*m_cellSize.y)+(grid.size()*m_spaceBetweenCell)+m_spaceBetweenCell;
//Draw the grid
sf::RectangleShape gridShape(sf::Vector2f(m_gridSize.x,m_gridSize.y));
gridShape.setFillColor(m_skin.at(2));
gridShape.setPosition(gridX,gridY);
RenderWindow::draw(gridShape);
for(int i=0;i<grid.size();i++){
2015-05-04 12:55:15 +02:00
for(int j=0;j<grid.at(0).size();j++){
2015-05-04 12:55:15 +02:00
int cellX=(gridX+m_spaceBetweenCell)+j*(m_cellSize.x+m_spaceBetweenCell);
int cellY=(gridY+m_spaceBetweenCell)+i*(m_cellSize.y+m_spaceBetweenCell);
int value=grid.at(i).at(j);
2015-05-04 12:55:15 +02:00
this->drawCell(cellX,cellY,value);
}
}
2015-05-04 12:55:15 +02:00
if(gameIsOver)
this->drawGameOver(gridX,gridY);
this->drawATH();
}
2015-05-03 17:18:10 +02:00
void MainWindow::drawCell(int x, int y, int value){
//Init RectangleShape
2015-05-04 12:55:15 +02:00
sf::RectangleShape cell(sf::Vector2f(m_cellSize.x, m_cellSize.y));
//Define color, checking skin
cell.setFillColor(this->getCellColor(value));
//Set position
cell.setPosition(x,y);
//Draw the cell
RenderWindow::draw(cell);
std::stringstream valueStream;
valueStream << value;
std::string valueString(valueStream.str());
2015-05-04 12:55:15 +02:00
int fontSize(m_cellSize.x/2);
int fontSizeFact=15;
if(value>=1024)
fontSize-=fontSizeFact;
int valueSize(valueString.size());
2015-05-04 12:55:15 +02:00
int fontX=x+(m_cellSize.x/2)-((valueSize*(fontSize-20))/2);
int fontY=y+(m_cellSize.y/2)-(fontSize/2)-10;
sf::Text text;
2015-05-04 12:55:15 +02:00
text.setFont(m_font);
text.setStyle(sf::Text::Bold);
text.setCharacterSize(fontSize);
text.setString(valueString);
if(value==2 || value==4)
text.setColor(m_skin.at(3));
else
text.setColor(m_skin.at(4));
text.setPosition(fontX,fontY);
if(value != 0)
RenderWindow::draw(text);
}
2015-05-03 17:18:10 +02:00
sf::Color MainWindow::getCellColor(int value){
//Id of the first cell color skin
2015-05-04 12:55:15 +02:00
int idStart=7;
2015-05-03 17:18:10 +02:00
if(value==0){
return m_skin.at(1);
}
else if(value%2==0){
2015-05-03 17:18:10 +02:00
int result(value);
int id(idStart);
while(result!=2){
result/=2;
id++;
}
return m_skin.at(id);
}
return m_skin.at(idStart+11);
}
2015-05-04 12:55:15 +02:00
void MainWindow::drawGameOver(int gridX, int gridY){
sf::RectangleShape gridShape(sf::Vector2f(m_gridSize.x,m_gridSize.y));
gridShape.setFillColor(m_skin.at(6));
gridShape.setPosition(gridX,gridY);
RenderWindow::draw(gridShape);
}
void MainWindow::drawATH(){
2015-05-04 12:55:15 +02:00
int titleX=m_gridPosition.x;
int titleY=m_gridPosition.y-190;
//==================== Draw title ====================
sf::Text text;
text.setFont(m_font);
text.setStyle(sf::Text::Bold);
text.setCharacterSize(80);
text.setColor(m_skin.at(3));
text.setPosition(titleX,titleY);
text.setString("2048");
RenderWindow::draw(text);
//==================== Draw score ====================
int scoreSizeX=110;
int scoreX=m_gridPosition.x+m_gridSize.x-scoreSizeX;
sf::RectangleShape scoreShape(sf::Vector2f(scoreSizeX,60));
scoreShape.setFillColor(m_skin.at(2));
scoreShape.setPosition(scoreX,titleY+25);
RenderWindow::draw(scoreShape);
//==================== Draw best score ====================
sf::RectangleShape bestScoreShape(sf::Vector2f(scoreSizeX,60));
bestScoreShape.setFillColor(m_skin.at(2));
bestScoreShape.setPosition(scoreX-scoreSizeX-5,titleY+25);
RenderWindow::draw(bestScoreShape);
}