/
superwizard
/
openhmm
Обзор
Документация
Войти
/
superwizard
/
openhmm
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
sdl_renderer.cpp
117 строк
3 KB
Denis Burlaka
Initial project setup
20 июл 2026, 22:19
Верифицирован
20 июл 2026, 22:19
a818c95
Код
Авторство
О чём код?
#include "sdl_renderer.hpp" #include "hero.hpp" #include <cstdlib> #include <cstdio> static void check(bool ok, const char *msg) { if (!ok) { std::fprintf(stderr, "SDL error: %s\n", msg); std::exit(1); } } SdlRenderer::SdlRenderer(int width, int height) : window(nullptr), renderer(nullptr), knightSprite{}, goblinSprite{}, scale(8), animFrame(0), animTick(0), quit(false) { check(SDL_Init(SDL_INIT_VIDEO) >= 0, SDL_GetError()); check(IMG_Init(IMG_INIT_PNG) == IMG_INIT_PNG, IMG_GetError()); window = SDL_CreateWindow("OpenHMM", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, 0); check(window != nullptr, SDL_GetError()); renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); check(renderer != nullptr, SDL_GetError()); knightSprite = loadSprite("assets/walk_man.png", 64, 64, 4); goblinSprite = loadSprite("assets/walk_goblin.png", 64, 64, 4); } SdlRenderer::~SdlRenderer() { if (knightSprite.texture) SDL_DestroyTexture(knightSprite.texture); if (goblinSprite.texture) SDL_DestroyTexture(goblinSprite.texture); if (renderer) SDL_DestroyRenderer(renderer); if (window) SDL_DestroyWindow(window); IMG_Quit(); SDL_Quit(); } SdlRenderer::Sprite SdlRenderer::loadSprite(const char *path, int frameW, int frameH, int frames) { SDL_Surface *surf = IMG_Load(path); if (!surf) { std::fprintf(stderr, "IMG_Load(%s): %s\n", path, IMG_GetError()); std::exit(1); } SDL_Texture *tex = SDL_CreateTextureFromSurface(renderer, surf); SDL_FreeSurface(surf); if (!tex) { std::fprintf(stderr, "SDL_CreateTextureFromSurface: %s\n", SDL_GetError()); std::exit(1); } return {tex, frameW, frameH, frames}; } void SdlRenderer::drawSprite(const Sprite &sprite, int frame, int worldX, int worldY) { SDL_Rect src = { frame * sprite.fw, 0, sprite.fw, sprite.fh }; SDL_Rect dst = { worldX * scale - sprite.fw / 2, worldY * scale - sprite.fh / 2, sprite.fw, sprite.fh }; SDL_RenderCopy(renderer, sprite.texture, &src, &dst); } void SdlRenderer::clear() { SDL_SetRenderDrawColor(renderer, 30, 30, 40, 255); SDL_RenderClear(renderer); } void SdlRenderer::drawHero(const Hero &hero) { if (!hero.isAlive()) return; bool isKnight = hero.getName() == "Knight"; int frame = hero.getState() == State::Moving ? animFrame : 0; drawSprite(isKnight ? knightSprite : goblinSprite, frame, hero.getX(), hero.getY()); } void SdlRenderer::present() { SDL_RenderPresent(renderer); } bool SdlRenderer::handleEvents() { SDL_Event event; while (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) quit = true; else if (event.type == SDL_MOUSEBUTTONDOWN && onClick) { int wx = event.button.x / scale; int wy = event.button.y / scale; onClick(wx, wy); } } return !quit; } void SdlRenderer::setOnClick(std::function<void(int, int)> fn) { onClick = std::move(fn); }