From 6df816e778a7067eeb36f423aa507d74e89ecb26 Mon Sep 17 00:00:00 2001 From: Sara Date: Sun, 8 Oct 2023 23:07:04 +0200 Subject: [PATCH] added sprite entity trait --- src/sprite_entity.c | 8 ++++++++ src/sprite_entity.h | 29 +++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 src/sprite_entity.c create mode 100644 src/sprite_entity.h diff --git a/src/sprite_entity.c b/src/sprite_entity.c new file mode 100644 index 0000000..4b3a0a9 --- /dev/null +++ b/src/sprite_entity.c @@ -0,0 +1,8 @@ +#include "sprite_entity.h" +#include "sprite.h" + +void sprite_entity_draw(SpriteEntity self) { + Sprite* sprite = self.tc->get_sprite(self.data); + Transform* transform = self.transformable->get_transform(self.data); + sprite_draw(sprite, *transform); +} diff --git a/src/sprite_entity.h b/src/sprite_entity.h new file mode 100644 index 0000000..3869c10 --- /dev/null +++ b/src/sprite_entity.h @@ -0,0 +1,29 @@ +#ifndef _fencer_sprite_entity_h +#define _fencer_sprite_entity_h + +#include "typeclass_helpers.h" +#include "sprite.h" + +typedef struct { + Sprite* (*const get_sprite)(void*); +} ISpriteEntity; + +typedef struct { + void* data; + ISpriteEntity const* tc; + ITransformable const* transformable; +} SpriteEntity; + +extern void sprite_entity_draw(SpriteEntity self); + +#define impl_SpriteEntity_for(T, get_sprite_f)\ +static inline SpriteEntity T##_as_SpriteEntity(T* x) {\ + TC_FN_TYPECHECK(Sprite*, get_sprite_f, T*);\ + static ISpriteEntity const tc = {\ + .get_sprite = (Sprite*(*const)(void*)) get_sprite_f,\ + };\ + Transformable t = T##_as_Transformable(x);\ + return (SpriteEntity){.tc = &tc, .transformable = t.tc, .data = x};\ +} + +#endif // !_fencer_sprite_entity_h