project-kyoku/src/application/application.cpp

117 lines
2.8 KiB
C++
Raw Normal View History

2021-04-03 13:14:31 -04:00
#include "application.h"
#include "core/inputtype.h"
#include "mainmenu.h"
#include "gamestate.h"
2021-10-05 14:48:28 -04:00
#include "editorstate.h"
2021-04-04 16:43:12 -04:00
#include "tools/music.h"
#include "classicmode/classicfactory.h"
#include <iostream>
const sf::Time TIME_PER_FRAME = sf::seconds(1.f / 90.f);
2021-04-03 13:14:31 -04:00
Application::Application() :
2021-08-26 13:41:16 -04:00
_game_window({1280, 720}, "Test", sf::Style::Default)
{
2021-08-26 13:41:16 -04:00
_font_holder.load(Fonts::Id::GUI, "SourceCodePro-Regular.ttf");
_game_window.setFramerateLimit(60);
_game_window.setKeyRepeatEnabled(false);
_game_window.setMouseCursorGrabbed(false);
_game_window.setVerticalSyncEnabled(true);
2021-07-27 14:18:37 -04:00
MainMenu::Callbacks callbacks =
{
[&](){ pushState(GUIState::Tag::GAME); },
[&](){ pushState(GUIState::Tag::EDITOR); }
};
2021-10-05 14:48:28 -04:00
EditorState::Callbacks editor_callbacks = {[&](){ popState(); }};
2021-08-03 14:42:58 -04:00
2021-08-26 13:41:16 -04:00
const auto main_menu = std::make_shared<MainMenu>(_game_window, std::move(callbacks), _font_holder);
const auto game_state = std::make_shared<GameState>(_game_window, classic::init(_game_window), GameState::Callbacks());
2021-10-05 14:48:28 -04:00
const auto editor = std::make_shared<EditorState>(_game_window, std::move(editor_callbacks), std::make_unique<Music>(), _font_holder);
2021-08-03 14:42:58 -04:00
_states[GUIState::Tag::MAIN_MENU] = main_menu;
_states[GUIState::Tag::GAME] = game_state;
2021-08-12 15:10:52 -04:00
_states[GUIState::Tag::EDITOR] = editor;
2021-08-03 14:42:58 -04:00
_state_stack.emplace_back(_states.at(GUIState::Tag::MAIN_MENU));
}
2021-04-03 13:14:31 -04:00
void Application::run()
{
2021-04-05 10:17:57 -04:00
_game_window.display();
2021-06-11 12:58:44 -04:00
exec();
2021-04-05 10:17:57 -04:00
}
2021-06-11 12:58:44 -04:00
void Application::exec()
2021-04-05 10:17:57 -04:00
{
2021-04-04 16:43:12 -04:00
sf::Clock timer;
sf::Time time_since_last_update = sf::Time::Zero;
2021-04-05 10:17:57 -04:00
while (_game_window.isOpen())
{
2021-04-04 16:43:12 -04:00
time_since_last_update += timer.restart();
2021-04-15 11:03:35 -04:00
input();
2021-04-15 11:03:35 -04:00
bool isOneFramePassed = time_since_last_update >= TIME_PER_FRAME;
if (isOneFramePassed)
2021-04-04 16:43:12 -04:00
{
time_since_last_update -= TIME_PER_FRAME;
update(time_since_last_update);
2021-04-04 16:43:12 -04:00
draw();
}
2021-04-03 13:14:31 -04:00
}
}
2021-04-05 10:17:57 -04:00
void Application::input()
{
sf::Event event;
while (_game_window.pollEvent(event))
2021-04-03 13:14:31 -04:00
{
switch(event.type)
{
case sf::Event::Closed:
2021-06-11 12:58:44 -04:00
_game_window.close();
break;
2021-06-11 12:58:44 -04:00
default:
2021-08-03 14:42:58 -04:00
_state_stack.back()->input(event);
break;
}
2021-04-05 10:17:57 -04:00
}
}
void Application::update(const sf::Time& dt)
2021-04-05 10:17:57 -04:00
{
_state_stack.back()->update(dt);
2021-04-03 13:14:31 -04:00
}
void Application::draw()
{
_game_window.clear();
2021-08-03 14:42:58 -04:00
for (const auto& state : _state_stack)
state->draw();
_game_window.display();
2021-04-03 13:14:31 -04:00
}
2021-08-03 14:42:58 -04:00
void Application::pushState(GUIState::Tag new_state)
2021-08-03 14:42:58 -04:00
{
_state_stack.back()->leave();
_state_stack.emplace_back(_states.at(new_state));
_state_stack.back()->enter();
}
void Application::popState()
{
_state_stack.back()->leave();
_state_stack.pop_back();
_state_stack.back()->enter();
}