2025-01-05 01:30:18 +00:00
|
|
|
#include "sdl.hpp"
|
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
SdlWindow::SdlWindow(const char* title, int width, int height)
|
|
|
|
: m_window(nullptr),
|
|
|
|
m_renderer(nullptr),
|
|
|
|
m_isRunning(false),
|
|
|
|
m_isFullscreen(false),
|
|
|
|
m_width(width),
|
2025-01-05 02:27:36 +00:00
|
|
|
m_height(height),
|
|
|
|
m_glContect(nullptr)
|
2025-01-05 01:30:18 +00:00
|
|
|
{
|
2025-01-05 02:27:36 +00:00
|
|
|
// 1. Set attributes
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
|
2025-01-05 01:30:18 +00:00
|
|
|
|
|
|
|
// 2. Create the window
|
|
|
|
m_window = SDL_CreateWindow(
|
|
|
|
title,
|
|
|
|
SDL_WINDOWPOS_CENTERED,
|
|
|
|
SDL_WINDOWPOS_CENTERED,
|
|
|
|
width,
|
|
|
|
height,
|
2025-01-05 02:27:36 +00:00
|
|
|
SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE
|
2025-01-05 01:30:18 +00:00
|
|
|
);
|
|
|
|
if (!m_window) {
|
|
|
|
std::cerr << "Failed to create window: " << SDL_GetError() << std::endl;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// 3. Create the renderer
|
|
|
|
m_renderer = SDL_CreateRenderer(m_window, -1, SDL_RENDERER_ACCELERATED);
|
|
|
|
if (!m_renderer) {
|
|
|
|
std::cerr << "Failed to create renderer: " << SDL_GetError() << std::endl;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// 4. If everything succeeded, mark the application as running
|
|
|
|
m_isRunning = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
SdlWindow::~SdlWindow() {
|
|
|
|
// Cleanup
|
|
|
|
if (m_renderer) {
|
|
|
|
SDL_DestroyRenderer(m_renderer);
|
|
|
|
m_renderer = nullptr;
|
|
|
|
}
|
|
|
|
if (m_window) {
|
|
|
|
SDL_DestroyWindow(m_window);
|
|
|
|
m_window = nullptr;
|
|
|
|
}
|
|
|
|
SDL_Quit();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SdlWindow::run() {
|
|
|
|
while (m_isRunning) {
|
|
|
|
processEvents();
|
|
|
|
update();
|
|
|
|
render();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SdlWindow::processEvents() {
|
|
|
|
SDL_Event event;
|
|
|
|
while (SDL_PollEvent(&event)) {
|
|
|
|
if (event.type == SDL_QUIT) {
|
|
|
|
m_isRunning = false;
|
|
|
|
}
|
|
|
|
// Handle other events (keyboard, mouse, etc.) here if needed
|
|
|
|
else if (event.type == SDL_KEYDOWN) {
|
|
|
|
// Check if the key pressed is Enter/Return
|
|
|
|
if (event.key.keysym.sym == SDLK_RETURN) {
|
|
|
|
std::cout << "input detected" << std::endl;
|
|
|
|
}
|
|
|
|
if (event.key.keysym.sym == SDLK_SPACE) {
|
|
|
|
std::cout << "Full screen togled!" << std::endl;
|
|
|
|
setFullscreen(!m_isFullscreen);
|
|
|
|
}
|
|
|
|
if (event.key.keysym.sym == SDLK_ESCAPE) {
|
|
|
|
std::cout << "Bye!" << std::endl;
|
|
|
|
m_isRunning = false; //exit application
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SdlWindow::update() {
|
|
|
|
// Update game/application logic here
|
|
|
|
}
|
|
|
|
|
|
|
|
void SdlWindow::render() {
|
|
|
|
// Set background color to red
|
|
|
|
SDL_SetRenderDrawColor(m_renderer, 0, 0, 0, 255);
|
|
|
|
SDL_RenderClear(m_renderer);
|
|
|
|
|
|
|
|
// You can draw shapes, textures, etc. here
|
|
|
|
|
|
|
|
SDL_RenderPresent(m_renderer);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SdlWindow::change_res(int newWidth, int newHeight)
|
|
|
|
{
|
|
|
|
// Just call SDL_SetWindowSize
|
|
|
|
if (m_window) {
|
|
|
|
SDL_SetWindowSize(m_window, newWidth, newHeight);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SdlWindow::setFullscreen(bool fullscreen) {
|
|
|
|
if (m_window) {
|
|
|
|
m_isFullscreen = fullscreen;
|
|
|
|
if (m_isFullscreen) {
|
|
|
|
SDL_SetWindowFullscreen(m_window, SDL_WINDOW_FULLSCREEN_DESKTOP);
|
|
|
|
} else {
|
|
|
|
SDL_SetWindowFullscreen(m_window, 0); // return to windowed
|
|
|
|
change_res(m_width, m_height);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|