diff options
author | jaroWMR <jarorutjes07@gmail.com> | 2024-10-23 19:57:44 +0200 |
---|---|---|
committer | jaroWMR <jarorutjes07@gmail.com> | 2024-10-23 19:57:44 +0200 |
commit | edbb6c892299e3b7f93638abcc9e55b2cfce2358 (patch) | |
tree | d9c306af19636f5c757397ec1c1a157a93c12f0c /src/crepe/SdlContext.cpp | |
parent | 1b96c6e3c57b9d1dc5fb02cbd24b625d7f7f5b05 (diff) | |
parent | eaa05e7a981b0f581f5393882e4753d9294a3dba (diff) |
merge with niels/rendering
Diffstat (limited to 'src/crepe/SdlContext.cpp')
-rw-r--r-- | src/crepe/SdlContext.cpp | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/src/crepe/SdlContext.cpp b/src/crepe/SdlContext.cpp new file mode 100644 index 0000000..cc5148c --- /dev/null +++ b/src/crepe/SdlContext.cpp @@ -0,0 +1,149 @@ + + +#include "SdlContext.h" + +#include "api/Sprite.h" +#include "api/Texture.h" +#include "api/Transform.h" +#include "util/log.h" +#include <SDL2/SDL.h> +#include <SDL2/SDL_image.h> +#include <SDL2/SDL_render.h> +#include <SDL2/SDL_surface.h> +#include <SDL2/SDL_video.h> +#include <cmath> +#include <cstddef> +#include <iostream> + +using namespace crepe; + +SdlContext & SdlContext::get_instance() { + static SdlContext instance; + return instance; +} + +void SdlContext::handle_events(bool & running) { + SDL_Event event; + while (SDL_PollEvent(&event)) { + if (event.type == SDL_QUIT) { + running = false; + } + } +} + +SdlContext::~SdlContext() { + dbg_trace(); + + if (m_game_renderer != nullptr) SDL_DestroyRenderer(m_game_renderer); + + if (m_game_window != nullptr) { + SDL_DestroyWindow(m_game_window); + } + + IMG_Quit(); + SDL_Quit(); +} + +void SdlContext::clear_screen() { SDL_RenderClear(this->m_game_renderer); } + +SdlContext::SdlContext() { + dbg_trace(); + + if (SDL_Init(SDL_INIT_VIDEO) < 0) { + std::cerr << "SDL could not initialize! SDL_Error: " << SDL_GetError() + << std::endl; + return; + } + + m_game_window = SDL_CreateWindow( + "Crepe Game Engine", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, + 1920, 1080, SDL_WINDOW_HIDDEN); + if (!m_game_window) { + std::cerr << "Window could not be created! SDL_Error: " + << SDL_GetError() << std::endl; + } + + m_game_renderer + = SDL_CreateRenderer(m_game_window, -1, SDL_RENDERER_ACCELERATED); + if (!m_game_renderer) { + std::cerr << "Renderer could not be created! SDL_Error: " + << SDL_GetError() << std::endl; + SDL_DestroyWindow(m_game_window); + return; + } + + int img_flags = IMG_INIT_PNG; + if (!(IMG_Init(img_flags) & img_flags)) { + std::cout << "SDL_image could not initialize! SDL_image Error: " + << IMG_GetError() << std::endl; + } +} +void SdlContext::present_screen() { SDL_RenderPresent(this->m_game_renderer); } + +void SdlContext::draw(const api::Sprite & sprite, + const api::Transform & transform) { + + static SDL_RendererFlip render_flip + = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flip_x) + | (SDL_FLIP_VERTICAL * sprite.flip.flip_y)); + + int w, h; + SDL_QueryTexture(sprite.sprite_image->m_texture, NULL, NULL, &w, &h); + // needs maybe camera for position + SDL_Rect dstrect = { + .x = static_cast<int>(transform.position.x), + .y = static_cast<int>(transform.position.y), + .w = static_cast<int>(w * transform.scale), + .h = static_cast<int>(h * transform.scale), + }; + + double degrees = transform.rotation * 180 / M_PI; + SDL_RenderCopyEx(this->m_game_renderer, sprite.sprite_image->m_texture, + NULL, &dstrect, degrees, NULL, render_flip); +} + +/* +SDL_Texture * SdlContext::setTextureFromPath(const char * path, SDL_Rect & clip, + const int row, const int col) { + dbg_trace(); + + SDL_Surface * tmp = IMG_Load(path); + if (!tmp) { + std::cerr << "Error surface " << IMG_GetError << std::endl; + } + + clip. + w = tmp->w / col; + clip.h = tmp->h / row; + + SDL_Texture * CreatedTexture + = SDL_CreateTextureFromSurface(m_game_renderer, tmp); + + if (!CreatedTexture) { + std::cerr << "Error could not create texture " << IMG_GetError + << std::endl; + } + SDL_FreeSurface(tmp); + + return CreatedTexture; +} +*/ + +SDL_Texture * SdlContext::texture_from_path(const char * path) { + dbg_trace(); + + SDL_Surface * tmp = IMG_Load(path); + if (!tmp) { + std::cerr << "Error surface " << IMG_GetError << std::endl; + } + SDL_Texture * created_texture + = SDL_CreateTextureFromSurface(m_game_renderer, tmp); + + if (!created_texture) { + std::cerr << "Error could not create texture " << IMG_GetError + << std::endl; + } + SDL_FreeSurface(tmp); + + return created_texture; +} |