From b2eb646979b9cdcef4f9edfbcc2e2309b1f57a18 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Mon, 5 Aug 2024 08:52:04 -0400 Subject: [PATCH] very basic thing --- .gitignore | 3 + .gitmodules | 3 + Makefile | 14 ++++ entt | 1 + img/player.png | Bin 0 -> 3959 bytes main.cpp | 184 +++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 205 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 Makefile create mode 160000 entt create mode 100644 img/player.png create mode 100644 main.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b8e5a39 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.sw* +*.o +game diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..3f53ce8 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "entt"] + path = entt + url = https://github.com/skypjack/entt diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f0ad0d1 --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ +CXXFLAGS := -std=c++23 -O0 -g3 -ggdb \ + -Ientt/single_include +LDFLAGS := -lSDL2 -lSDL2_image + +OBJS := $(subst .cpp,.o,$(wildcard *.cpp)) + +all: game + +clean: + rm -f game $(OBJS) + +game: $(OBJS) + $(CXX) $(CXXFLAGS) $^ -o $@ $(LDFLAGS) + diff --git a/entt b/entt new file mode 160000 index 0000000..93f7d51 --- /dev/null +++ b/entt @@ -0,0 +1 @@ +Subproject commit 93f7d516f21e5f63422df983c02827ab1c8e050e diff --git a/img/player.png b/img/player.png new file mode 100644 index 0000000000000000000000000000000000000000..810c15264ebd79e93da9848143526bbc78519992 GIT binary patch literal 3959 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 RDe3?K002ovPDHLkV1hn +#include +#include +#include +#include + +#include +#include +#include + +static constexpr auto WINDOW_WIDTH = 640; +static constexpr auto WINDOW_HEIGHT = 480; + +static SDL_Window *window = nullptr; +static SDL_Renderer *renderer = nullptr; + +static int sdl2Initialize(); +static SDL_Texture *sdl2LoadTexture(const char *path); + +struct Player { + char unused = 0; +}; + +struct Vec2 { + float x, y; + + auto& operator+=(const Vec2& o) noexcept { + x += o.x; + y += o.y; + return *this; + } +}; + +struct Point : public Vec2 {}; +struct Velocity : public Vec2 {}; + +class Texture +{ +public: + Texture(const char *path) { + tex = sdl2LoadTexture(path); + } + + ~Texture() { + if (tex != nullptr) + SDL_DestroyTexture(tex); + } + + void operator()(SDL_Renderer *rend, Point p) const noexcept { + const int x = static_cast(p.x); + const int y = static_cast(p.y); + SDL_Rect rect {x, y, 0, 0}; + + /* TODO err check */ + SDL_QueryTexture(tex, nullptr, nullptr, &rect.w, &rect.h); + SDL_RenderCopy(rend, tex, nullptr, &rect); + } + +private: + SDL_Texture *tex; +}; + +int main() +{ + if (auto err = sdl2Initialize(); err) + return err; + + entt::registry registry; + + const auto ent = registry.create(); + registry.emplace(ent); + registry.emplace(ent, 0.f, WINDOW_HEIGHT - 100.f); + registry.emplace(ent, 0.f, 0.f); + registry.emplace(ent, "img/player.png"); + + SDL_Event e; + bool quit = false; + while (!quit) { + const auto nextFrame = std::chrono::high_resolution_clock::now() + + std::chrono::microseconds(1'000'000 / 60); + + SDL_RenderClear(renderer); + registry.view().each( + [](Texture& tex, Point& p) { tex(renderer, p); }); + SDL_RenderPresent(renderer); + + registry.view().each( + [](Velocity& v, Point& p) { p += v; }); + + while (SDL_PollEvent(&e)) { + if (e.type == SDL_QUIT) { + quit = true; + } else if (e.type == SDL_KEYDOWN) { + auto view = registry.view(); + + if (e.key.repeat) { + // do nothing + } else if (e.key.keysym.sym == SDLK_d) { + view.each([](Player& p, Velocity& v) { v.x += 1.5f; }); + } else if (e.key.keysym.sym == SDLK_a) { + view.each([](Player& p, Velocity& v) { v.x -= 1.5f; }); + } + } else if (e.type == SDL_KEYUP) { + auto view = registry.view(); + + if (e.key.repeat) { + // do nothing + } else if (e.key.keysym.sym == SDLK_d) { + view.each([](Player& p, Velocity& v) { v.x -= 1.5f; }); + } else if (e.key.keysym.sym == SDLK_a) { + view.each([](Player& p, Velocity& v) { v.x += 1.5f; }); + } + } + } + + std::this_thread::sleep_until(nextFrame); + } + + SDL_DestroyWindow(window); + SDL_Quit(); +} + +int sdl2Initialize() +{ + if (auto err = SDL_Init(SDL_INIT_VIDEO); err < 0) { + std::cerr << "SDL error: " << SDL_GetError() << std::endl; + return EXIT_FAILURE; + } else { + atexit(SDL_Quit); + } + + if (!(IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG)) { + std::cerr << "IMG error: " << IMG_GetError() << std::endl; + return EXIT_FAILURE; + } else { + atexit(IMG_Quit); + } + + window = SDL_CreateWindow("game", + SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + WINDOW_WIDTH, WINDOW_HEIGHT, + SDL_WINDOW_SHOWN); + + if (window == nullptr) { + std::cerr << "SDL error: " << SDL_GetError() << std::endl; + return EXIT_FAILURE; + } else { + atexit([] { SDL_DestroyWindow(window); }); + } + + renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + + if (renderer == nullptr) { + std::cerr << "SDL error: " << SDL_GetError() << std::endl; + return EXIT_FAILURE; + } else { + atexit([] { SDL_DestroyRenderer(renderer); }); + } + + return 0; +} + +SDL_Texture *sdl2LoadTexture(const char *path) +{ + SDL_Texture *tex = nullptr; + + auto surface = IMG_Load(path); + if (surface == nullptr) { + std::cerr << "Unable to load image " << path << '!' << std::endl; + std::cerr << "SDL error: " << IMG_GetError() << std::endl; + } else { + tex = SDL_CreateTextureFromSurface(renderer, surface); + + if (tex == nullptr) { + std::cerr << "Unable to create texture for " << path << '!' << std::endl; + std::cerr << "SDL error: " << SDL_GetError() << std::endl; + } else { + SDL_FreeSurface(surface); + } + } + + return tex; +} +