120 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "defs.h"
 | 
						|
#include <SFML/Graphics.hpp>
 | 
						|
#include <SFML/Window.hpp>
 | 
						|
#include <imgui-SFML.h>
 | 
						|
#include <imgui.h>
 | 
						|
 | 
						|
static sf::RenderWindow window{};
 | 
						|
static sf::Clock delta_clock{};
 | 
						|
static sf::Time delta_time{};
 | 
						|
static AppConfig cfg{};
 | 
						|
static sf::View view{};
 | 
						|
 | 
						|
extern void configure(AppConfig &config);
 | 
						|
 | 
						|
void initialize_window() {
 | 
						|
    cfg = AppConfig();
 | 
						|
    configure(cfg);
 | 
						|
    window.create(cfg.mode, cfg.window_title);
 | 
						|
    if (cfg.frame_rate_limit)
 | 
						|
        window.setFramerateLimit(cfg.frame_rate_limit.value_or(0));
 | 
						|
    window.setVerticalSyncEnabled(cfg.vsync);
 | 
						|
    view = window.getDefaultView();
 | 
						|
}
 | 
						|
 | 
						|
void initialize_imgui() {
 | 
						|
    if (!ImGui::SFML::Init(window))
 | 
						|
        exit(-1);
 | 
						|
}
 | 
						|
 | 
						|
extern void handle_input_event(sf::Event const &evt);
 | 
						|
extern void handle_window_event(sf::Event const &evt);
 | 
						|
 | 
						|
void try_handle_input_event(sf::Event const &event) {
 | 
						|
    bool const is_input_event{
 | 
						|
        event.is<sf::Event::JoystickButtonPressed>() || event.is<sf::Event::JoystickButtonReleased>() ||
 | 
						|
        event.is<sf::Event::JoystickMoved>() ||
 | 
						|
        event.is<sf::Event::JoystickConnected>() || event.is<sf::Event::JoystickDisconnected>() ||
 | 
						|
        event.is<sf::Event::KeyPressed>() || event.is<sf::Event::KeyReleased>() ||
 | 
						|
        event.is<sf::Event::TouchBegan>() || event.is<sf::Event::TouchEnded>() ||
 | 
						|
        event.is<sf::Event::TouchMoved>() ||
 | 
						|
        event.is<sf::Event::MouseButtonPressed>() || event.is<sf::Event::MouseButtonReleased>() ||
 | 
						|
        event.is<sf::Event::MouseMoved>() || event.is<sf::Event::MouseMovedRaw>()
 | 
						|
    };
 | 
						|
    if (is_input_event) {
 | 
						|
        handle_input_event(event);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void try_handle_window_event(sf::Event const &event) {
 | 
						|
    bool const is_window_event{
 | 
						|
        event.is<sf::Event::FocusGained>() ||
 | 
						|
        event.is<sf::Event::FocusLost>() ||
 | 
						|
        event.is<sf::Event::Resized>()
 | 
						|
    };
 | 
						|
    if (is_window_event) {
 | 
						|
        handle_window_event(event);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void poll_events() {
 | 
						|
    while (std::optional const event{ window.pollEvent() })
 | 
						|
    {
 | 
						|
        ImGui::SFML::ProcessEvent(window, *event);
 | 
						|
        try_handle_input_event(*event);
 | 
						|
        try_handle_window_event(*event);
 | 
						|
 | 
						|
        if (event->is<sf::Event::Closed>()) { window.close(); }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
extern void setup(void);
 | 
						|
extern void loop(double delta);
 | 
						|
extern void draw_scene(sf::RenderTarget &target, sf::RenderStates const &states);
 | 
						|
extern void draw_main_menu_bar(void);
 | 
						|
extern void draw_gui(void);
 | 
						|
extern void shutdown(void);
 | 
						|
 | 
						|
int main() {
 | 
						|
    initialize_window();
 | 
						|
    initialize_imgui();
 | 
						|
    setup();
 | 
						|
    while (window.isOpen()) {
 | 
						|
        // Event Polling
 | 
						|
        poll_events();
 | 
						|
        // Update
 | 
						|
        delta_time = delta_clock.restart();
 | 
						|
        ImGui::SFML::Update(window, delta_time);
 | 
						|
        loop(delta_time.asSeconds());
 | 
						|
        if(ImGui::BeginMainMenuBar()) {
 | 
						|
            draw_main_menu_bar();
 | 
						|
            ImGui::EndMainMenuBar();
 | 
						|
        }
 | 
						|
        draw_gui();
 | 
						|
        // Render
 | 
						|
        window.clear();
 | 
						|
        draw_scene(window, cfg.default_render_states);
 | 
						|
        ImGui::SFML::Render(window);
 | 
						|
        window.display();
 | 
						|
    }
 | 
						|
    shutdown();
 | 
						|
    ImGui::SFML::Shutdown();
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
AppConfig const &get_application_configuration() {
 | 
						|
    return cfg;
 | 
						|
}
 | 
						|
 | 
						|
sf::Time const &get_delta_time() {
 | 
						|
    return delta_time;
 | 
						|
}
 | 
						|
 | 
						|
sf::RenderWindow const &get_window() {
 | 
						|
    return window;
 | 
						|
}
 | 
						|
 | 
						|
void set_render_view(sf::View const &view) {
 | 
						|
    window.setView(view);
 | 
						|
}
 |