0
0
mirror of https://github.com/Nimac0/SDL_Minigame synced 2026-01-12 12:33:43 +00:00

Compare commits

...

3 Commits

44 changed files with 176 additions and 161 deletions

4
.gitmodules vendored
View File

@ -1,19 +1,15 @@
[submodule "SDL"] [submodule "SDL"]
path = extern/SDL path = extern/SDL
url = https://github.com/libsdl-org/SDL.git url = https://github.com/libsdl-org/SDL.git
branch = release-2.28.x
[submodule "SDL_image"] [submodule "SDL_image"]
path = extern/SDL_image path = extern/SDL_image
url = https://github.com/libsdl-org/SDL_image.git url = https://github.com/libsdl-org/SDL_image.git
branch = release-2.8.x
[submodule "extern/SDL_mixer"] [submodule "extern/SDL_mixer"]
path = extern/SDL_mixer path = extern/SDL_mixer
url = https://github.com/libsdl-org/SDL_mixer.git url = https://github.com/libsdl-org/SDL_mixer.git
branch = release-2.8.x
[submodule "extern/SDL_ttf"] [submodule "extern/SDL_ttf"]
path = extern/SDL_ttf path = extern/SDL_ttf
url = https://github.com/libsdl-org/SDL_ttf.git url = https://github.com/libsdl-org/SDL_ttf.git
branch = release-2.22.x
[submodule "extern/tmxlite"] [submodule "extern/tmxlite"]
path = extern/tmxlite path = extern/tmxlite
url = https://github.com/fallahn/tmxlite.git url = https://github.com/fallahn/tmxlite.git

View File

@ -31,11 +31,10 @@ add_library(${PROJECT_NAME} ${SOURCES})
target_include_directories(${PROJECT_NAME} PUBLIC ${ENGINE_INCLUDE_DIR}) target_include_directories(${PROJECT_NAME} PUBLIC ${ENGINE_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} PUBLIC # should be private when all SDL functionality has a wrapper target_link_libraries(${PROJECT_NAME} PUBLIC # should be private when all SDL functionality has a wrapper
SDL2::SDL2main SDL3::SDL3-static
SDL2::SDL2-static SDL3_image::SDL3_image-static
SDL2_image::SDL2_image-static SDL3_mixer::SDL3_mixer-static
SDL2_mixer::SDL2_mixer-static SDL3_ttf::SDL3_ttf-static
SDL2_ttf::SDL2_ttf-static
tmxlite tmxlite
) )

View File

@ -2,12 +2,12 @@
"folders": "folders":
[ [
{ {
"path": "." "path": ".",
} }
], ],
"settings": "settings":
{ {
"tab_size": 4 "tab_size": 4,
}, },
"build_systems": [ "build_systems": [
{ {
@ -23,7 +23,7 @@
"name": "Release", "name": "Release",
"shell_cmd": "cmake -DCMAKE_BUILD_TYPE=Release build && cmake --build build", "shell_cmd": "cmake -DCMAKE_BUILD_TYPE=Release build && cmake --build build",
}, },
] ],
}, },
{ {
"name": "Generate CMake", "name": "Generate CMake",
@ -43,7 +43,10 @@
"name": "Generate documentation", "name": "Generate documentation",
"shell_cmd": "docker run --rm -v \"$project_path:/source\" -v \"$project_path/docs:/output\" -v \"$project_path/docs/Doxyfile:/Doxyfile\" vego_engine-docker", "shell_cmd": "docker run --rm -v \"$project_path:/source\" -v \"$project_path/docs:/output\" -v \"$project_path/docs/Doxyfile:/Doxyfile\" vego_engine-docker",
}, },
] ],
} }
] ],
"debugger_configurations":
[
],
} }

2
extern/SDL vendored

@ -1 +1 @@
Subproject commit 05eb08053d48fea9052ad02b3d619244aeb868d3 Subproject commit e027b85cc457556071cbb2f3f1bcf8803c1bc001

2
extern/SDL_image vendored

@ -1 +1 @@
Subproject commit abcf63aa71b4e3ac32120fa9870a6500ddcdcc89 Subproject commit b1c8ec7d75e3d8398940c9e04a8b82886ae6163d

2
extern/SDL_mixer vendored

@ -1 +1 @@
Subproject commit 5bcd40ad962dc72a3c051084ce128d78f7656566 Subproject commit 5e2a70519294bc6ec44f1870b019ecd4760fde7d

2
extern/SDL_ttf vendored

@ -1 +1 @@
Subproject commit 4a318f8dfaa1bb6f10e0c5e54052e25d3c7f3440 Subproject commit 4a8bda9197cc4d6fafd188bc9df6c7e8749a43a2

View File

@ -1,6 +1,6 @@
#pragma once #pragma once
#include <SDL_render.h> #include <SDL3/SDL_render.h>
#include <SDL_mixer.h> #include <SDL3_mixer/SDL_mixer.h>
#include <map> #include <map>
#include <string> #include <string>
#include <functional> #include <functional>
@ -24,7 +24,7 @@ public:
AssetManager(Manager* manager); AssetManager(Manager* manager);
~AssetManager(); ~AssetManager();
void createProjectile(Vector2D pos, Vector2D velocity, int scale, int range, int speed, const char* texturePath, Entity* owner); void createProjectile(Vector2D pos, Vector2D velocity, int scale, int range, float speed, const char* texturePath, Entity* owner);
void createPowerup(Vector2D pos, std::function<void (Entity*)> pickupFunc, std::string texturePath); void createPowerup(Vector2D pos, std::function<void (Entity*)> pickupFunc, std::string texturePath);
Vector2D calculateSpawnPosition(); Vector2D calculateSpawnPosition();

View File

@ -1,6 +1,6 @@
#pragma once #pragma once
#include <SDL.h> #include <SDL3/SDL.h>
#include "Component.h" #include "Component.h"
#include "Vector2D.h" #include "Vector2D.h"
@ -22,7 +22,7 @@ public:
ColliderComponent(const char* tag, float hitboxScale); ColliderComponent(const char* tag, float hitboxScale);
void init() override; void init() override;
void update() override; void update(uint_fast16_t diffTime) override;
void removeCollision(); void removeCollision();
void handleCollision(Vector2D& characterPos, SDL_Rect& characterCollider, SDL_Rect& componentCollider); void handleCollision(Vector2D& characterPos, SDL_Rect& characterCollider, SDL_Rect& componentCollider);

View File

@ -7,7 +7,7 @@
#include "ColliderComponent.h" #include "ColliderComponent.h"
#include "Constants.h" #include "Constants.h"
#include "Entity.h" #include "Entity.h"
#include "SDL_rect.h" #include <SDL3/SDL_rect.h>
#include "SpriteComponent.h" #include "SpriteComponent.h"
#include "Vector2D.h" #include "Vector2D.h"
#include "Manager.h" #include "Manager.h"

View File

@ -1,5 +1,6 @@
#pragma once #pragma once
#include <stdint.h>
class Entity; class Entity;
class Component class Component
@ -8,7 +9,7 @@ public:
Entity* entity; Entity* entity;
virtual void init() {} virtual void init() {}
virtual void update() {} virtual void update(uint_fast16_t diffTime) {}
virtual ~Component() = default; virtual ~Component() = default;
}; };

View File

@ -59,7 +59,7 @@ public:
explicit Entity(Manager& mManager) : explicit Entity(Manager& mManager) :
manager(mManager) { }; manager(mManager) { };
void update() const; //!< Call each frame to update all components void update(uint_fast16_t diffTime) const; //!< Call each frame to update all components
bool isActive() const { return this->active; } //!< \sa destroy() bool isActive() const { return this->active; } //!< \sa destroy()
//! Mark for destruction for Manager::refresh() and disables collision //! Mark for destruction for Manager::refresh() and disables collision

View File

@ -8,7 +8,7 @@ public:
virtual ~Game() {} virtual ~Game() {}
virtual void init() = 0; virtual void init() = 0;
virtual void update() = 0; virtual void update(uint_fast16_t diffTime) = 0;
GameInternal* gameInternal; //!< \deprecated GameInternal* gameInternal; //!< \deprecated
}; };

View File

@ -1,8 +1,9 @@
#pragma once #pragma once
#include <SDL.h> #include <SDL3/SDL.h>
#include <SDL_image.h> #include <SDL3_image/SDL_image.h>
#include <SDL_mixer.h> #include <SDL3_mixer/SDL_mixer.h>
#include <cstdint>
#include <functional> #include <functional>
#include <vector> #include <vector>
@ -26,10 +27,10 @@ public:
GameInternal(); GameInternal();
~GameInternal(); ~GameInternal();
void init(const char* title, int xpos, int ypos, int width, int height, bool fullscreen); SDL_AppResult init(const char* title, int xpos, int ypos, int width, int height, bool fullscreen);
void handleEvents(); void handleEvents();
void update(); void update(Uint64 frameTime);
void render(); void render();
void clean(); void clean();
bool isRunning() const; bool isRunning() const;
@ -63,4 +64,6 @@ private:
int counter = 0; int counter = 0;
bool running = true; bool running = true;
SDL_Window* window; SDL_Window* window;
Uint64 lastFrameTime = 0;
}; };

View File

@ -1,5 +1,5 @@
#pragma once #pragma once
#include <SDL.h> #include <SDL3/SDL.h>
#include <map> #include <map>
#include "Component.h" #include "Component.h"
@ -94,12 +94,12 @@ public:
~InputComponent(); ~InputComponent();
void init() override; void init() override;
void update() override; void update(uint_fast16_t diffTime) override;
bool isKeyDown(Key key); bool isKeyDown(Key key);
private: private:
const Uint8* m_keyStates; const bool* m_keyStates;
SDL_Scancode mapKeyToSDL(Key key); SDL_Scancode mapKeyToSDL(Key key);
std::map<Key, SDL_Scancode> m_keyMappings; std::map<Key, SDL_Scancode> m_keyMappings;
void InitKeyMappings(); void InitKeyMappings();

View File

@ -24,7 +24,7 @@ class Manager
public: public:
Manager(GameInternal* game) : game(game) {}; Manager(GameInternal* game) : game(game) {};
void update(); //!< \sa Entity::update() void update(uint_fast16_t diffTime); //!< \sa Entity::update()
//! Disables all functionality of entities marked for destruction //! Disables all functionality of entities marked for destruction
//! \sa Entity::destroy() //! \sa Entity::destroy()
void refresh(); void refresh();

View File

@ -34,7 +34,7 @@ private:
struct TileSetData { struct TileSetData {
std::string texturePath{}; std::string texturePath{};
tmx::Vector2i textureSize; tmx::Vector2f textureSize;
uint32_t tileCount{}; uint32_t tileCount{};
tmx::Vector2u tileCount2D; tmx::Vector2u tileCount2D;
uint32_t firstGID{}; uint32_t firstGID{};

View File

@ -9,7 +9,7 @@ public:
PowerupComponent(std::function<void (Entity*)> func); PowerupComponent(std::function<void (Entity*)> func);
~PowerupComponent() {}; ~PowerupComponent() {};
void update() override; void update(uint_fast16_t diffTime) override;
private: private:
std::function<void (Entity*)> pickupFunc; std::function<void (Entity*)> pickupFunc;

View File

@ -16,14 +16,14 @@ public:
~ProjectileComponent() {} ~ProjectileComponent() {}
void init() override; void init() override;
void update() override; void update(uint_fast16_t diffTime) override;
private: private:
TransformComponent* transformComponent; TransformComponent* transformComponent;
int range = 0; int range = 0;
int speed = 0; float speed = 0;
int distance = 0; float distance = 0;
Entity* owner = nullptr; Entity* owner = nullptr;

View File

@ -1,6 +1,6 @@
#pragma once #pragma once
#include <SDL_mixer.h> #include <SDL3_mixer/SDL_mixer.h>
#include <map> #include <map>
#include <vector> #include <vector>

View File

@ -1,7 +1,7 @@
#pragma once #pragma once
#include <map> #include <map>
#include <SDL_render.h> #include <SDL3/SDL_render.h>
#include <memory> #include <memory>
#include <string> #include <string>
@ -22,7 +22,7 @@ public:
private: private:
TransformComponent* transform; TransformComponent* transform;
SDL_Texture* texture; SDL_Texture* texture;
SDL_Rect srcRect, destRect; SDL_FRect srcRect, destRect;
const char* texturePath; const char* texturePath;
@ -48,7 +48,7 @@ public:
void setTexture(const char* path); void setTexture(const char* path);
void init() override; void init() override;
void update() override; void update(uint_fast16_t diffTime) override;
void draw() override; void draw() override;
void playAnimation(std::string type); void playAnimation(std::string type);
void setDirection(Direction direction); void setDirection(Direction direction);

View File

@ -16,7 +16,7 @@ public:
~StatEffectsComponent() {}; ~StatEffectsComponent() {};
void init() override; void init() override;
void update() override; void update(uint_fast16_t diffTime) override;
void modifyStatDur(Stats stat, int duration, int value); void modifyStatDur(Stats stat, int duration, int value);

View File

@ -1,7 +1,8 @@
#pragma once #pragma once
#include "ECS.h" #include "ECS.h"
#include <SDL_render.h> #include "SDL3/SDL_surface.h"
#include <SDL3/SDL_render.h>
#include <map> #include <map>
#include <memory> #include <memory>
#include <string> #include <string>
@ -21,7 +22,10 @@ class TextureManager
SDL_Texture* loadTexture(const char* fileName); SDL_Texture* loadTexture(const char* fileName);
static std::vector<SDL_Rect> splitSpriteSheet(SDL_Texture* spriteSheet, int width, int height, int spritesOnSheet); static std::vector<SDL_Rect> splitSpriteSheet(SDL_Texture* spriteSheet, int width, int height, int spritesOnSheet);
static void draw(SDL_Renderer* renderer, SDL_Texture* texture, SDL_Rect src, SDL_Rect dest, bool flipped = false); static void draw(SDL_Renderer* renderer, SDL_Texture* texture, SDL_FRect src, SDL_FRect dest, bool flipped = false);
void setScaleMode(SDL_ScaleMode scaleMode) { this->scaleMode = scaleMode; }
private: private:
SDL_ScaleMode scaleMode = SDL_SCALEMODE_NEAREST;
Manager* manager; Manager* manager;
}; };

View File

@ -1,6 +1,6 @@
#pragma once #pragma once
#include <SDL.h> #include <SDL3/SDL.h>
#include <string> #include <string>
#include <map> #include <map>

View File

@ -25,11 +25,11 @@ public:
void init() override; void init() override;
/*! TODO: document usage of collision handler */ /*! TODO: document usage of collision handler */
void update() override; void update(uint_fast16_t diffTime) override;
void setPositionAfterCollision(Vector2D& positionChange); void setPositionAfterCollision(Vector2D& positionChange);
void modifySpeed(int8_t modifier); void modifySpeed(int8_t modifier);
private: private:
int speed = 3; int speed = 180;
int speedMod = 0; int speedMod = 0;
}; };

View File

@ -1,7 +1,7 @@
#pragma once #pragma once
#include <SDL.h> #include <SDL3/SDL.h>
#include <SDL_rect.h> #include <SDL3/SDL_rect.h>
class Vector2D class Vector2D
{ {

View File

@ -46,7 +46,7 @@ Mix_Music* AssetManager::getMusic(std::string id)
return music.at(id); return music.at(id);
} }
void AssetManager::createProjectile(Vector2D pos, Vector2D velocity, int scale, int range, int speed, const char* texturePath, Entity* owner) { void AssetManager::createProjectile(Vector2D pos, Vector2D velocity, int scale, int range, float speed, const char* texturePath, Entity* owner) {
auto& projectile(man->addEntity()); auto& projectile(man->addEntity());
projectile.addComponent<TransformComponent>(pos.x, pos.y, 32, 32, scale); //32x32 is standard size for objects projectile.addComponent<TransformComponent>(pos.x, pos.y, 32, 32, scale); //32x32 is standard size for objects
@ -86,7 +86,7 @@ Vector2D AssetManager::calculateSpawnPosition()
conflict = false; conflict = false;
for (auto cc : this->man->getGame()->collisionHandler->getColliders({ Entity::GroupLabel::MAPTILES })) for (auto cc : this->man->getGame()->collisionHandler->getColliders({ Entity::GroupLabel::MAPTILES }))
{ {
if (SDL_HasIntersection(&spawnRect, &cc->collider) && strcmp(cc->tag, "projectile")) if (SDL_HasRectIntersection(&spawnRect, &cc->collider) && strcmp(cc->tag, "projectile"))
{ {
conflict = true; conflict = true;
break; break;

View File

@ -31,10 +31,10 @@ void ColliderComponent::init()
} }
transform = &entity->getComponent<TransformComponent>(); transform = &entity->getComponent<TransformComponent>();
this->update(); this->update(0);
} }
void ColliderComponent::update() void ColliderComponent::update(uint_fast16_t diffTime)
{ {
collider.x = transform->position.x - (transform->width - transform->width * transform->scale * this->hitboxScale) / 2; collider.x = transform->position.x - (transform->width - transform->width * transform->scale * this->hitboxScale) / 2;
collider.y = transform->position.y - (transform->width - transform->width * transform->scale * this->hitboxScale) / 2; collider.y = transform->position.y - (transform->width - transform->width * transform->scale * this->hitboxScale) / 2;

View File

@ -6,7 +6,7 @@
#include "Manager.h" #include "Manager.h"
#include "Vector2D.h" #include "Vector2D.h"
#include <SDL_rect.h> #include <SDL3/SDL_rect.h>
#include <bitset> #include <bitset>
#include <cstdio> #include <cstdio>
#include <memory> #include <memory>
@ -26,7 +26,7 @@ IntersectionBitSet CollisionHandler::getIntersection(Entity* entityA, Entity* en
colliderB.x += posModB.x; colliderB.x += posModB.x;
colliderB.y += posModB.y; colliderB.y += posModB.y;
if (!SDL_HasIntersection( if (!SDL_HasRectIntersection(
&colliderA, &colliderA,
&colliderB)) &colliderB))
return std::bitset<DIRECTION_C>(); return std::bitset<DIRECTION_C>();
@ -152,7 +152,7 @@ Entity* CollisionHandler::getAnyIntersection<Entity*>(
if (!entity->hasComponent<ColliderComponent>()) return nullptr; if (!entity->hasComponent<ColliderComponent>()) return nullptr;
for (auto& collider : getColliders(groupLabels, excludedEntities)) { for (auto& collider : getColliders(groupLabels, excludedEntities)) {
SDL_Rect rect = entity->getComponent<ColliderComponent>().collider + posMod; SDL_Rect rect = entity->getComponent<ColliderComponent>().collider + posMod;
if (SDL_HasIntersection(&rect, &collider->collider)) { if (SDL_HasRectIntersection(&rect, &collider->collider)) {
return collider->entity; return collider->entity;
} }
} }
@ -175,7 +175,7 @@ bool CollisionHandler::getAnyIntersection<bool>(
if (!entity->hasComponent<ColliderComponent>()) return false; if (!entity->hasComponent<ColliderComponent>()) return false;
for (auto& collider : getColliders(groupLabels, excludedEntities)) { for (auto& collider : getColliders(groupLabels, excludedEntities)) {
SDL_Rect rect = entity->getComponent<ColliderComponent>().collider + posMod; SDL_Rect rect = entity->getComponent<ColliderComponent>().collider + posMod;
if (SDL_HasIntersection(&rect, &collider->collider)) { if (SDL_HasRectIntersection(&rect, &collider->collider)) {
return true; return true;
} }
} }

View File

@ -4,9 +4,9 @@
#include "Component.h" #include "Component.h"
#include <cstddef> #include <cstddef>
void Entity::update() const void Entity::update(uint_fast16_t diffTime) const
{ {
for (auto const& c : components) c->update(); for (auto const& c : components) c->update(diffTime);
} }
bool Entity::hasGroup(Group mGroup) bool Entity::hasGroup(Group mGroup)

View File

@ -1,23 +1,20 @@
#include "GameInternal.h" #include "GameInternal.h"
#include <SDL_error.h>
#include "CollisionHandler.h" #include "CollisionHandler.h"
#include "AssetManager.h" #include "AssetManager.h"
#include "RenderManager.h" #include "RenderManager.h"
#include "SDL_mixer.h" #include <SDL3_mixer/SDL_mixer.h>
#include "SDL3/SDL_init.h"
#include "SoundManager.h" #include "SoundManager.h"
#include "TileComponent.h"
#include "Direction.h"
#include "Entity.h" #include "Entity.h"
#include "HealthComponent.h" #include "HealthComponent.h"
#include "Map.h" #include "Map.h"
#include "TextureManager.h" #include "TextureManager.h"
#include "StatEffectsComponent.h"
#include "Constants.h"
#include "Game.h" #include "Game.h"
#include "GameFactory.h" #include "GameFactory.h"
#include <VEGO.h>
GameInternal::GameInternal() : GameInternal::GameInternal() :
manager(this), manager(this),
renderManager(), renderManager(),
@ -30,7 +27,7 @@ GameInternal::GameInternal() :
GameInternal::~GameInternal() = default; GameInternal::~GameInternal() = default;
void GameInternal::init(const char* title, int xpos, int ypos, int width, int height, bool fullscreen) SDL_AppResult GameInternal::init(const char* title, int xpos, int ypos, int width, int height, bool fullscreen)
{ {
GameInternal::assets = new AssetManager(&manager); GameInternal::assets = new AssetManager(&manager);
GameInternal::textureManager = new TextureManager(&manager); GameInternal::textureManager = new TextureManager(&manager);
@ -43,24 +40,24 @@ void GameInternal::init(const char* title, int xpos, int ypos, int width, int he
flags = SDL_WINDOW_FULLSCREEN; flags = SDL_WINDOW_FULLSCREEN;
} }
if (SDL_Init(SDL_INIT_EVERYTHING) != 0) if (!SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO))
{ {
std::cout << "ERROR. Subsystem couldnt be initialized! " << SDL_GetError() << std::endl; std::cout << "ERROR. Subsystem couldnt be initialized! " << SDL_GetError() << std::endl;
SDL_ClearError(); SDL_ClearError();
return; return SDL_APP_FAILURE;
} }
if (Mix_Init(MIX_INIT_MP3) != MIX_INIT_MP3) { if (Mix_Init(MIX_INIT_MP3) != MIX_INIT_MP3) {
std::cout << "ERROR. Subsystem couldnt be initialized!" << std::endl; std::cout << "ERROR. Subsystem couldnt be initialized!" << std::endl;
return; return SDL_APP_FAILURE;
} }
window = SDL_CreateWindow(title, xpos, ypos, width, height, flags); window = SDL_CreateWindow(title, width, height, flags);
if (!window) if (!window)
{ {
std::cout << "ERROR: Window couldnt be created! " << SDL_GetError() << std::endl; std::cout << "ERROR: Window couldnt be created! " << SDL_GetError() << std::endl;
SDL_ClearError(); SDL_ClearError();
return; return SDL_APP_FAILURE;
} }
// bad // bad
@ -72,20 +69,20 @@ void GameInternal::init(const char* title, int xpos, int ypos, int width, int he
SDL_SetWindowIcon(window, icon); SDL_SetWindowIcon(window, icon);
renderer = SDL_CreateRenderer(window, -1, 0); renderer = SDL_CreateRenderer(window, NULL);
if (!renderer) if (!renderer)
{ {
std::cout << "ERROR: Renderer couldnt be created! " << SDL_GetError() << std::endl; std::cout << "ERROR: Renderer couldnt be created! " << SDL_GetError() << std::endl;
SDL_ClearError(); SDL_ClearError();
return; return SDL_APP_FAILURE;
} }
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048) < 0) if (!Mix_OpenAudio(0, NULL))
{ {
std::cout << "ERROR: Mixer couldnt be initialized! " << SDL_GetError() << std::endl; std::cout << "ERROR: Mixer couldnt be initialized! " << SDL_GetError() << std::endl;
SDL_ClearError(); SDL_ClearError();
return; return SDL_APP_FAILURE;
} }
Mix_Volume(-1, MIX_MAX_VOLUME); Mix_Volume(-1, MIX_MAX_VOLUME);
@ -100,6 +97,8 @@ void GameInternal::init(const char* title, int xpos, int ypos, int width, int he
this->gameInstance = GameFactory::instance().create(this); this->gameInstance = GameFactory::instance().create(this);
this->gameInstance->init(); this->gameInstance->init();
return SDL_APP_CONTINUE;
} }
void GameInternal::handleEvents() void GameInternal::handleEvents()
@ -108,7 +107,7 @@ void GameInternal::handleEvents()
switch (event.type) switch (event.type)
{ {
case SDL_QUIT: this->setRunning(false); case SDL_EVENT_QUIT: this->setRunning(false);
break; break;
default: default:
@ -116,12 +115,16 @@ void GameInternal::handleEvents()
} }
} }
void GameInternal::update() void GameInternal::update(Uint64 frameTime)
{ {
manager.refresh(); manager.refresh();
manager.update();
this->gameInstance->update(); // TODO: this might have to be split up into two update functions, before and after manager... uint_fast16_t diffTime = frameTime - this->lastFrameTime;
manager.update(diffTime);
this->gameInstance->update(diffTime); // TODO: this might have to be split up into two update functions, before and after manager...
this->lastFrameTime = frameTime;
} }
void GameInternal::render() void GameInternal::render()

View File

@ -10,7 +10,7 @@ InputComponent::~InputComponent() = default;
void InputComponent::init(){} void InputComponent::init(){}
void InputComponent::update() void InputComponent::update(uint_fast16_t diffTime)
{ {
SDL_PumpEvents(); SDL_PumpEvents();
} }

View File

@ -27,9 +27,9 @@ void Manager::refresh()
std::end(entities)); std::end(entities));
} }
void Manager::update() void Manager::update(uint_fast16_t diffTime)
{ {
for (auto& e : entities) e->update(); for (auto& e : entities) e->update(diffTime);
} }
void Manager::addToGroup(Entity* mEntity, Group mGroup) void Manager::addToGroup(Entity* mEntity, Group mGroup)

View File

@ -9,8 +9,8 @@
#include <ranges> #include <ranges>
#include <vector> #include <vector>
#include <SDL_error.h> #include <SDL3/SDL_error.h>
#include <SDL_render.h> #include <SDL3/SDL_render.h>
#include <tmxlite/Layer.hpp> #include <tmxlite/Layer.hpp>
#include <tmxlite/Map.hpp> #include <tmxlite/Map.hpp>
@ -102,16 +102,14 @@ void Map::loadTileLayer(const tmx::TileLayer& layer)
| std::views::transform([&](uint16_t i) { | std::views::transform([&](uint16_t i) {
const char* texturePath = this->mapData.texturePaths->at(i).c_str(); const char* texturePath = this->mapData.texturePaths->at(i).c_str();
tmx::Vector2i textureSize; tmx::Vector2f textureSize;
SDL_QueryTexture( SDL_GetTextureSize(
VEGO_Game().textureManager->loadTexture(texturePath), VEGO_Game().textureManager->loadTexture(texturePath),
nullptr,
nullptr,
&(textureSize.x), &(textureSize.x),
&(textureSize.y) &(textureSize.y)
); );
tmx::Vector2u tileCount2D = { textureSize.x / this->mapData.mapTileSize->x, textureSize.y / this->mapData.mapTileSize->y }; tmx::Vector2u tileCount2D = { static_cast<unsigned int>(textureSize.x / this->mapData.mapTileSize->x), static_cast<unsigned int>(textureSize.y / this->mapData.mapTileSize->y) };
uint32_t tileCount = this->mapData.tileSets->at(i).getTileCount(); uint32_t tileCount = this->mapData.tileSets->at(i).getTileCount();
uint32_t firstGID = this->mapData.tileSets->at(i).getFirstGID(); uint32_t firstGID = this->mapData.tileSets->at(i).getFirstGID();

View File

@ -12,7 +12,7 @@ PowerupComponent::PowerupComponent(std::function<void (Entity*)> func)
this->pickupFunc = func; this->pickupFunc = func;
} }
void PowerupComponent::update() void PowerupComponent::update(uint_fast16_t diffTime)
{ {
Entity* player; Entity* player;
if ((player = this->entity->getManager().getGame()->collisionHandler->getAnyIntersection<Entity*>( if ((player = this->entity->getManager().getGame()->collisionHandler->getAnyIntersection<Entity*>(

View File

@ -17,9 +17,9 @@ void ProjectileComponent::init()
SoundManager::playSound(this->entity->getManager().getGame(), "throw_egg", true, PLAY_ONCE, MAX_VOLUME, -1); SoundManager::playSound(this->entity->getManager().getGame(), "throw_egg", true, PLAY_ONCE, MAX_VOLUME, -1);
} }
void ProjectileComponent::update() void ProjectileComponent::update(uint_fast16_t diffTime)
{ {
distance += speed; distance += speed * diffTime * (1.f/1000);
IntersectionBitSet boundsIntersection = this->entity->getManager().getGame()->collisionHandler->getIntersectionWithBounds(entity); IntersectionBitSet boundsIntersection = this->entity->getManager().getGame()->collisionHandler->getIntersectionWithBounds(entity);

View File

@ -1,9 +1,10 @@
#include "SoundManager.h" #include "SoundManager.h"
#include <stdexcept>
#include <string> #include <string>
#include <iostream> #include <iostream>
#include <SDL3_mixer/SDL_mixer.h>
#include "GameInternal.h" #include "GameInternal.h"
#include "AssetManager.h" #include "AssetManager.h"
@ -65,12 +66,12 @@ void SoundManager::playSound(GameInternal* game, std::string sound, bool canOver
if(Mix_VolumeChunk(game->assets->getSound(sound), volume) == -1) if(Mix_VolumeChunk(game->assets->getSound(sound), volume) == -1)
{ {
std::cerr << "Error adjusting volume: " << Mix_GetError() << std::endl; std::cerr << "Error adjusting volume: " /*<< Mix_GetError()*/ << std::endl;
} }
if (Mix_PlayChannel(channel, game->assets->getSound(sound), loops) == -1) if (Mix_PlayChannel(channel, game->assets->getSound(sound), loops) == -1)
{ {
std::cerr << "Error playing sound '" << sound << "': " << Mix_GetError() << std::endl; std::cerr << "Error playing sound '" << sound << "': " /*<< Mix_GetError()*/ << std::endl;
} }
} }
@ -87,12 +88,12 @@ void SoundManager::playMusic(GameInternal* game, std::string music, int loops, i
if(Mix_VolumeMusic(volume) == -1) if(Mix_VolumeMusic(volume) == -1)
{ {
std::cerr << "Error adjusting volume: " << Mix_GetError() << std::endl; std::cerr << "Error adjusting volume: " /*<< Mix_GetError()*/ << std::endl;
} }
if (Mix_PlayMusic(game->assets->getMusic(music), loops) == -1) if (Mix_PlayMusic(game->assets->getMusic(music), loops) == -1)
{ {
std::cerr << "Error playing music '" << music << "': " << Mix_GetError() << std::endl; std::cerr << "Error playing music '" << music << "': " /*<< Mix_GetError()*/ << std::endl;
} }
} }

View File

@ -1,6 +1,6 @@
#include "SpriteComponent.h" #include "SpriteComponent.h"
#include <SDL_timer.h> #include <SDL3/SDL_timer.h>
#include <cstring> #include <cstring>
#include <memory> #include <memory>
@ -59,14 +59,14 @@ void SpriteComponent::init()
this->srcRect.x = this->textureXOffset * this->srcRect.w; this->srcRect.x = this->textureXOffset * this->srcRect.w;
this->srcRect.y = this->textureYOffset * this->srcRect.h;; this->srcRect.y = this->textureYOffset * this->srcRect.h;;
this->update(); this->update(0);
} }
void SpriteComponent::update() void SpriteComponent::update(uint_fast16_t diffTime)
{ {
// This code is not compatible for animated tiles // This code is not compatible for animated tiles
if (animated) { if (animated) {
srcRect.x = srcRect.w * static_cast<int>((SDL_GetTicks() / speed) % frames); srcRect.x = srcRect.w * static_cast<int>((SDL_GetTicks() / speed) % frames); // TODO: should not call SDL_GetTicks() but use diffTime
srcRect.y = animationIndex * transform->height; srcRect.y = animationIndex * transform->height;
} }

View File

@ -8,16 +8,16 @@
void StatEffectsComponent::init() void StatEffectsComponent::init()
{} {}
void StatEffectsComponent::update() void StatEffectsComponent::update(uint_fast16_t diffTime)
{ {
for (int i = 0; i < MAX_STATS; i++) for (int i = 0; i < MAX_STATS; i++)
{ {
if (this->buffs.at(i) == 0) continue; if (this->buffs.at(i) <= 0) continue;
if (this->buffs.at(i) - 1 == 0) if (this->buffs.at(i) - diffTime <= 0)
{ {
this->resetStatValue((Stats)i); this->resetStatValue((Stats)i);
} }
this->buffs.at(i) -= 1; this->buffs.at(i) -= diffTime;
} }
} }
@ -32,7 +32,7 @@ void StatEffectsComponent::modifyStatValue(Stats stat, int modifier) //modifier
switch (stat) switch (stat)
{ {
case Stats::MOVEMENT_SPEED: case Stats::MOVEMENT_SPEED:
this->entity->getComponent<TransformComponent>().modifySpeed(modifier); this->entity->getComponent<TransformComponent>().modifySpeed(modifier * 60);
break; break;
case Stats::ATTACK_SPEED: case Stats::ATTACK_SPEED:
// this->entity->getComponent<KeyboardController>().modifyAtkSpeed(modifier); // this->entity->getComponent<KeyboardController>().modifyAtkSpeed(modifier);

View File

@ -1,6 +1,5 @@
#include "TextureManager.h" #include "TextureManager.h"
#include <memory>
#include <stdexcept> #include <stdexcept>
#include <string> #include <string>
@ -14,13 +13,14 @@ SDL_Texture* TextureManager::loadTexture(const char* fileName)
} }
auto texture = IMG_LoadTexture(this->manager->getGame()->renderer, fileName); auto texture = IMG_LoadTexture(this->manager->getGame()->renderer, fileName);
if (texture == NULL) throw std::runtime_error(std::string("Couldn't load texture '") + fileName + "'"); if (texture == NULL) throw std::runtime_error(std::string("Couldn't load texture '") + fileName + "'");
SDL_SetTextureScaleMode(texture, this->scaleMode); // linear scaling results in blurry images
this->texture_cache.emplace(std::string(fileName), texture); this->texture_cache.emplace(std::string(fileName), texture);
printf("Loaded texture at '%s'\n", fileName); printf("Loaded texture at '%s'\n", fileName);
return texture; return texture;
} }
void TextureManager::draw(SDL_Renderer* renderer, SDL_Texture* texture, SDL_Rect src, SDL_Rect dest, bool flipped) void TextureManager::draw(SDL_Renderer* renderer, SDL_Texture* texture, SDL_FRect src, SDL_FRect dest, bool flipped)
{ {
SDL_RendererFlip flip = flipped ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE; SDL_FlipMode flip = flipped ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE;
SDL_RenderCopyEx(renderer, texture, &src, &dest, 0, NULL, flip); SDL_RenderTextureRotated(renderer, texture, &src, &dest, 0, NULL, flip);
} }

View File

@ -50,12 +50,12 @@ void TransformComponent::init()
direction.zero(); direction.zero();
} }
void TransformComponent::update() void TransformComponent::update(uint_fast16_t diffTime)
{ {
float multiplier = direction.x != 0 && direction.y != 0 ? 0.707 : 1; // normalizes vector; only works if directions are in increments of 45° float multiplier = direction.x != 0 && direction.y != 0 ? 0.707 : 1; // normalizes vector; only works if directions are in increments of 45°
Vector2D positionChange( Vector2D positionChange(
direction.x * this->getSpeed() * multiplier, direction.x * this->getSpeed() * multiplier * diffTime * (1.f/1000),
direction.y * this->getSpeed() * multiplier direction.y * this->getSpeed() * multiplier * diffTime * (1.f/1000)
); );
if (this->entity->hasGroup((size_t)Entity::GroupLabel::PLAYERS)){ if (this->entity->hasGroup((size_t)Entity::GroupLabel::PLAYERS)){

View File

@ -1,5 +1,5 @@
#include "Vector2D.h" #include "Vector2D.h"
#include "SDL_rect.h" #include <SDL3/SDL_rect.h>
Vector2D::Vector2D() Vector2D::Vector2D()
{ {

48
src/_Init.cpp Normal file
View File

@ -0,0 +1,48 @@
#include "SDL3/SDL_init.h"
#include <cstdint>
#define SDL_MAIN_USE_CALLBACKS
#include <SDL3/SDL_main.h>
#include <iostream>
#include <ctime>
#include "VEGO.h"
#include "Entity.h"
#include "GameInternal.h"
#include "Constants.h"
GameInternal* vego::game = nullptr;
SDL_AppResult SDL_AppInit(void **appstate, int argc, char **argv) {
srand(time(NULL));
bool playing = true;
*appstate = vego::game = new GameInternal();
return vego::game->init("No_Name_Chicken_Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_SIZE_WIDTH, SCREEN_SIZE_HEIGHT, false);
}
SDL_AppResult SDL_AppIterate(void *appstate) {
if (!vego::game->isRunning()) {
return SDL_APP_SUCCESS;
}
vego::game->handleEvents(); // bad
Uint64 frameStart = SDL_GetTicks();
vego::game->update(frameStart);
vego::game->render();
int frameTime = SDL_GetTicks() - frameStart;
return SDL_APP_CONTINUE;
}
SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) {
return SDL_APP_CONTINUE;
}
void SDL_AppQuit(void *appstate, SDL_AppResult result) {
vego::game->clean();
}

View File

@ -1,41 +0,0 @@
#include <iostream>
#include <ctime>
#include "VEGO.h"
#include "Entity.h"
#include "GameInternal.h"
#include "Constants.h"
GameInternal* vego::game = nullptr;
int main(int argc, char* argv[])
{
srand(time(NULL));
bool playing = true;
const int frameDelay = 1000 / FPS;
Uint32 frameStart;
int frameTime;
vego::game = new GameInternal();
vego::game->init("No_Name_Chicken_Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_SIZE_WIDTH, SCREEN_SIZE_HEIGHT, false);
while (vego::game->isRunning()) {
frameStart = SDL_GetTicks();
vego::game->handleEvents();
vego::game->update();
vego::game->render();
frameTime = SDL_GetTicks() - frameStart;
if (frameDelay > frameTime) {
SDL_Delay(frameDelay - frameTime);
}
}
vego::game->clean();
return 0;
}