Add collision box with parent child relationship

This commit is contained in:
2025-05-26 22:36:38 +02:00
parent 5134bf74b2
commit ea539bdf99

View File

@@ -15,6 +15,11 @@
static constexpr int WINDOW_WIDTH = 400; static constexpr int WINDOW_WIDTH = 400;
static constexpr int WINDOW_HEIGHT = 240; static constexpr int WINDOW_HEIGHT = 240;
struct WorldPosition {
int x;
int y;
};
struct Position { struct Position {
int x; int x;
int y; int y;
@@ -71,19 +76,41 @@ int main() {
struct Fruit {}; struct Fruit {};
struct Basket {}; struct Basket {};
struct CollisionBox {};
world.system<Game>("IncrementTicks") world.system<Game>("IncrementTicks")
.term_at(0) .term_at(0)
.singleton() .singleton()
.each([](Game &game_ticks) { game_ticks.ticks += 1; }); .each([](Game &game_ticks) { game_ticks.ticks += 1; });
world.entity("Basket") auto basket = world.entity("Basket")
.set<Position>( .add<WorldPosition>()
Position{.x = WINDOW_WIDTH / 2 - 32, .y = WINDOW_HEIGHT - 32}) .set<Position>(Position{.x = WINDOW_WIDTH / 2 - 32,
.set<Sprite>(Sprite{.texture = &texture_assets->basket, .y = WINDOW_HEIGHT - 32})
.texture_atlas_index = 0}) .set<Sprite>(Sprite{.texture = &texture_assets->basket,
.texture_atlas_index = 0})
.set<Size>(Size{.w = 64, .h = 32})
.add<Basket>();
world.entity("CollisionBox")
.child_of(basket)
.add<WorldPosition>()
.set<Position>(Position{.x = 0, .y = 0})
.set<Size>(Size{.w = 64, .h = 32}) .set<Size>(Size{.w = 64, .h = 32})
.add<Basket>(); .add<CollisionBox>();
world
.system<SdlHandles const, WorldPosition const, Size const, CollisionBox>(
"DrawBoxes")
.term_at(0)
.singleton()
.each([](SdlHandles const &sdl_handles, WorldPosition const &pos,
Size const &size, CollisionBox) {
SDL_FRect rect{static_cast<float>(pos.x), static_cast<float>(pos.y),
static_cast<float>(size.w), static_cast<float>(size.h)};
SDL_SetRenderDrawColor(sdl_handles.renderer, 0, 0, 255, 255);
SDL_RenderRect(sdl_handles.renderer, &rect);
});
world.system<Game const, TextureAssets const>("SpawnFruits") world.system<Game const, TextureAssets const>("SpawnFruits")
.term_at(0) .term_at(0)
@@ -93,21 +120,48 @@ int main() {
.each([](flecs::iter &it, size_t index, Game const &game, .each([](flecs::iter &it, size_t index, Game const &game,
TextureAssets const &texture_assets) { TextureAssets const &texture_assets) {
if ((game.ticks % 100) == 0) { if ((game.ticks % 100) == 0) {
auto fruit =
it.world()
.entity()
.add<WorldPosition>()
.set<Position>(
Position{.x = static_cast<int>(game.ticks % WINDOW_WIDTH),
.y = -16})
.set<Velocity>(Velocity{.x = 0, .y = 1})
.set<Sprite>(
Sprite{.texture = &texture_assets.fruits,
.texture_atlas_index =
static_cast<uint16_t>(game.ticks % 228)})
.set<Size>(Size{.w = 32, .h = 32});
it.world() it.world()
.entity() .entity("CollisionBox")
.set<Position>(Position{ .child_of(fruit)
.x = static_cast<int>(game.ticks % WINDOW_WIDTH), .y = -16}) .add<WorldPosition>()
.set<Velocity>(Velocity{.x = 0, .y = 1}) .set<Position>(Position{.x = 0, .y = 0})
.set<Sprite>(Sprite{.texture = &texture_assets.fruits, .set<Size>(Size{.w = 32, .h = 32})
.texture_atlas_index = .add<CollisionBox>();
static_cast<uint16_t>(game.ticks % 228)}) }
.set<Size>(Size{.w = 32, .h = 32}); });
world.system<WorldPosition, Position const>("PropagatePosition")
.kind(flecs::PostUpdate)
.each([](flecs::entity e, WorldPosition &world_pos,
Position const &local_pos) {
if (e.parent() == flecs::entity::null()) {
world_pos.x = local_pos.x;
world_pos.y = local_pos.y;
} else {
auto parent_world_pos = e.parent().get<WorldPosition>();
world_pos.x = parent_world_pos->x + local_pos.x;
world_pos.y = parent_world_pos->y + local_pos.y;
} }
}); });
world world
.system<SdlHandles const, Position const, Size const, Sprite const>( .system<SdlHandles const, Position const, Size const, Sprite const>(
"RenderSprites") "RenderSprites")
.kind(flecs::PreUpdate)
.term_at(0) .term_at(0)
.singleton() .singleton()
.each([](SdlHandles const &sdl_handles, Position const &pos, .each([](SdlHandles const &sdl_handles, Position const &pos,