-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGameLoop.cpp
executable file
·106 lines (91 loc) · 4.22 KB
/
GameLoop.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include "GameLoop.hpp"
#include "MainMenuState.hpp"
#include <iostream>
GameLoop::GameLoop(int width, int height, const char *title)
{
m_data->title = title;
if(m_data->isFullScreen)
{
m_data->window.create(sf::VideoMode(static_cast<unsigned int>(width), static_cast<unsigned int>(height)),
title, sf::Style::Fullscreen);
}
else
{
m_data->window.create(sf::VideoMode(static_cast<unsigned int>(width), static_cast<unsigned int>(height)),
title, sf::Style::Default);
}
m_data->window.setFramerateLimit(60);
this->loadTextures();
m_data->machine.pushState(new MainMenuState(this->m_data),false);
this->run();
}
void GameLoop::loadTextures()
{
m_data->graphics.loadTexture("background", "assets/background.png");
//MENU
m_data->graphics.loadFont("Gellosia","assets/UI/Gellosia.ttf");
m_data->graphics.loadTexture("UIEmptyButtoon", "assets/UI/EmptyButton.png");
m_data->graphics.loadTexture("UIExitButton", "assets/UI/ExitButton.png");
m_data->graphics.loadTexture("UILargeEmptyButton", "assets/UI/LargeEmptyButton.png");
m_data->graphics.loadTexture("UIMenuButton", "assets/UI/MenuButton.png");
m_data->graphics.loadTexture("UIPlayButton", "assets/UI/PlayButton.png");
m_data->graphics.loadTexture("UISmallEmptyButton", "assets/UI/SmallEmptyButton.png");
//TILES
m_data->graphics.loadTexture("commercial", "assets/Tile/commercial.png");
m_data->graphics.loadTexture("forest", "assets/Tile/forest.png");
m_data->graphics.loadTexture("grass", "assets/Tile/grass.png");
m_data->graphics.loadTexture("industrial", "assets/Tile/industrial.png");
m_data->graphics.loadTexture("residential", "assets/Tile/residential.png");
m_data->graphics.loadTexture("water", "assets/Tile/waterAnim.png");
//m_data->graphics.loadTexture("empty", "assets/Tile/empty.png");
//m_data->graphics.loadTexture("mine", "assets/Tile/mine.png");
m_data->graphics.loadTexture("road", "assets/Tile/roads.png");
//TILEMAP
m_data->m_TileMap["grass"] = Tile(m_data->graphics.getTexture("grass"),TileType::EMPTY,tileSize,0,6.0f,0);
//m_data->m_TileMap[""] = Tile(m_data->graphics.getTexture("forest"),TileType::FOREST,tileSize,0,6.0f,0);
m_data->m_TileMap["road"] = Tile(m_data->graphics.getTexture("road"),TileType::ROAD,tileSize,0,3.0f,0);
m_data->m_TileMap["forest"] = Tile(m_data->graphics.getTexture("forest"),TileType::FOREST,tileSize,0,6.0f,0);
m_data->m_TileMap["industrial"] = Tile(m_data->graphics.getTexture("industrial"),TileType::INDUSTRIAL,tileSize,3,1.0f,0);
m_data->m_TileMap["residential"] = Tile(m_data->graphics.getTexture("residential"),TileType::RESIDENTIAL,tileSize,0,6.0f,0);
m_data->m_TileMap["commercial"] = Tile(m_data->graphics.getTexture("commercial"),TileType::COMMERCIAL,tileSize,0,6.0f,0);
m_data->m_TileMap["water"] = Tile(m_data->graphics.getTexture("water"),TileType::WATER,tileSize,3,3.0f,0);
}
void GameLoop::run()
{
//?convert to sf::Time
float currentTime = this->m_clock.getElapsedTime().asSeconds();
float newTime;
float sumTime = 0.0f; //accumulator for differences in rendering
float frameTime;
float interpolation;
while(this->m_data->window.isOpen())
{
this->m_data->machine.applyPendingChanges();
newTime = this->m_clock.getElapsedTime().asSeconds();
frameTime = newTime - currentTime;
if(frameTime > 0.25f)
{
frameTime = 0.25f;
}
currentTime = newTime;
sumTime += frameTime;
while(sumTime >= dt)
{
this->m_data->machine.getTopState()->handleInput();
this->m_data->machine.getTopState()->draw(dt);
this->m_data->machine.getTopState()->update(dt);
//this->m_data->window.clear(sf::Color::Black);
//this->m_data->window.display();
sumTime -= dt;
}
//draw in-between frame
interpolation = sumTime / dt;
this->m_data->machine.getTopState()->draw(interpolation);
//this->m_data->window.display();
}
}
GameLoop::~GameLoop()
{
while(this->m_data->machine.getTopState() != nullptr)
this->m_data->machine.popState();//? Test this
}