From 6bb5fe7837ffad0bcd38699112ab17bd268eed15 Mon Sep 17 00:00:00 2001 From: Sara Date: Sun, 8 Oct 2023 23:07:30 +0200 Subject: [PATCH] tilemaps now have a rigidbody, tile instances refer to their containing tilemap --- src/tilemap.c | 52 +++++++++++++++++++++++++++++++++++++++------------ src/tilemap.h | 29 +++++++++++++++++++++++++++- 2 files changed, 68 insertions(+), 13 deletions(-) diff --git a/src/tilemap.c b/src/tilemap.c index f14b526..03b29d8 100644 --- a/src/tilemap.c +++ b/src/tilemap.c @@ -12,6 +12,8 @@ struct TileInstance { Transform transform; TileDef* tiledef; + + Tilemap* parent_map; }; struct Tilemap { @@ -22,6 +24,8 @@ struct Tilemap { TileInstance* map; size_t map_num; IVector map_size; + + RigidBody* rigidbody; }; Tilemap* tilemap_from_autolayer(cJSON* json) { @@ -69,13 +73,7 @@ Tilemap* tilemap_from_autolayer(cJSON* json) { writer->transform = IdentityTransform; cJSON* px = cJSON_GetObjectItem(tile, "px"); writer->transform.position = vmulff(json_array_to_vector(px), px_to_ws); - // sprite_get_spritesheet(tiledef_get_sprite(writer->tiledef)); - - // LOG_INFO("Loading tile"); - // LOG_INFO("tid = %d", t->valueint); - // LOG_INFO("transform ="); - // LOG_INFO(".position = %f %f", writer->transform.position.x, writer->transform.position.y); - // LOG_INFO(".scale = %f %f", writer->transform.scale.x, writer->transform.scale.y); + writer->parent_map = self; ++writer; } @@ -90,12 +88,42 @@ void tilemap_draw(Tilemap* self, Transform transform) { tile = self->map + i; tiletrans = transform_apply(self->transform, tile->transform); Sprite* sprite = tiledef_get_sprite(tile->tiledef); - // LOG_INFO("sprite: %p", sprite); - // LOG_INFO("trans: %f %f ; %f %f ; %f", - // tiletrans.position.x, tiletrans.position.y, tiletrans.scale.x, tiletrans.scale.y, tiletrans.rotation); - // LOG_INFO("self->transform: %f %f ; %f %f ; %f", - // self->transform.position.x, self->transform.position.y, self->transform.scale.x, self->transform.scale.y, self->transform.rotation); + if(sprite != NULL) sprite_draw(sprite, tiletrans); } } + +size_t tilemap_get_tile_count(Tilemap* self) { + return self->map_num; +} + +TileInstance* tilemap_get_tile(Tilemap* self, size_t at) { + return &self->map[at]; +} + +RigidBody* tile_instance_get_rigidbody(TileInstance* self) { + return self->parent_map->rigidbody; +} + +Transform* tile_instance_get_transform(TileInstance* self) { + return &self->transform; +} + +Shape* tile_instance_get_shape(TileInstance* self) { + return tiledef_get_shape(self->tiledef); +} + +void tile_instance_on_collision(TileInstance* self, Collision collision) {} + +Vector* tile_instance_get_position(TileInstance* self) { + return &self->transform.position; +} + +Vector* tile_instance_get_scale(TileInstance* self) { + return &self->transform.scale; +} + +float* tile_instance_get_rotation(TileInstance* self) { + return &self->transform.rotation; +} diff --git a/src/tilemap.h b/src/tilemap.h index 1956f33..6cb8fa1 100644 --- a/src/tilemap.h +++ b/src/tilemap.h @@ -1,9 +1,12 @@ #ifndef _fencer_tilemap_h #define _fencer_tilemap_h +#include "physics_entity.h" #include "spritesheet.h" #include "tileset.h" +#include "rigidbody.h" #include "level.h" +#include "collision.h" typedef struct TileInstance TileInstance; typedef struct Tilemap Tilemap; @@ -14,6 +17,30 @@ extern void tilemap_destroy(Tilemap* self); extern void tilemap_set_tileset(Tilemap* self, Tileset* set); -extern void tilemap_draw(Tilemap* tilemap, Transform transform); +extern void tilemap_draw(Tilemap* self, Transform transform); + +extern size_t tilemap_get_tile_count(Tilemap* self); +extern TileInstance* tilemap_get_tile(Tilemap* self, size_t at); + +extern RigidBody* tile_instance_get_rigidbody(TileInstance* self); +extern Transform* tile_instance_get_transform(TileInstance* self); +extern Shape* tile_instance_get_shape(TileInstance* self); +extern void tile_instance_on_collision(TileInstance* self, Collision collision); + +extern Vector* tile_instance_get_position(TileInstance* self); +extern Vector* tile_instance_get_scale(TileInstance* self); +extern float* tile_instance_get_rotation(TileInstance* self); + +impl_Transformable_for(TileInstance, + tile_instance_get_transform, + tile_instance_get_position, + tile_instance_get_scale, + tile_instance_get_rotation +) +impl_PhysicsEntity_for(TileInstance, + tile_instance_get_rigidbody, + tile_instance_get_shape, + tile_instance_on_collision +) #endif // !_fencer_tilemap_h