tilemaps now have a rigidbody, tile instances refer to their containing tilemap

This commit is contained in:
Sara 2023-10-08 23:07:30 +02:00
parent 6df816e778
commit 6bb5fe7837
2 changed files with 68 additions and 13 deletions

View file

@ -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;
}

View file

@ -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