changed the way objects are notified of destruction, simplified game.c preset

pull/14/head
Sara 2023-07-16 00:31:13 +02:00
parent 14a81b0f2a
commit 33c1a5e9d2
6 changed files with 23 additions and 14 deletions

View File

@ -3,7 +3,6 @@
object_t object_default() {
return (object_t){
.active = 1,
.enabled = 1,
.physics = physics_default(),
.evt_draw = &object_draw_sprite,
.evt_update = NULL,

View File

@ -11,8 +11,8 @@ typedef void(*draw_fn)(struct object_t*);
struct object_t {
sprite_t sprite;
int active; // 1 if this object is in use and should not be overriden.
int enabled; // 1 if this object's events should be triggered.
int active; // 1 if this object's events should be triggered by the game world update.
int wants_to_be_deleted;
physics_t physics; // the collider to use for this object's physics interaction.
uintptr_t timer; // free to use for whatever
@ -26,7 +26,7 @@ object_t object_default();
void object_draw_sprite(object_t* object);
static inline
int object_is_valid(const object_t* object) {
return object != NULL && object->active != 0;
return object != NULL && object->wants_to_be_deleted == 0;
}
#endif /* _object_h */

View File

@ -24,7 +24,7 @@ void object_broadcast_collision(object_t* this, object_t* other) {
}
}
short can_collide(const object_t* this) {
return object_is_valid(this) && this->enabled;
return object_is_valid(this);
}
static inline

View File

@ -104,7 +104,6 @@ extern sprite_t make_sprite(const char* file, float x, float y);
extern sprite_t sprite_from_spritesheet(spritesheet_t* sheet, int index);
extern text_style_t make_text_style(const char* font, SDL_Color color, int dpi, float size);
extern SDL_Rect get_srcrect_from(spritesheet_t* sheet, int index);
extern void set_active_view(const view_t* view);
#define no_sprite (sprite_t){NULL, 0.0, 0.0, {0.0, 0.0}, 0.0, 0.0, 0.0, 0, {0, 0, 0, 0}}

View File

@ -47,23 +47,36 @@ size_t _find_free_object() {
}
void world_clear() {
// free all allocated objects
for(int i = 0; i < _world_objects.num; ++i) {
_world_objects.objects[i]->active = 0;
_world_objects.objects[i]->enabled = 0;
object_t* object = _world_objects.objects[i];
if(object != NULL) {
free(object);
}
}
// free world array
free(_world_objects.objects);
// reset world objects struct
_world_objects.objects = NULL;
_world_objects.num = 0;
}
object_t* make_object() {
// acquire pointer to empty slot
size_t index = _find_free_object();
// allocate new object
if(_world_objects.objects[index] == NULL) {
_world_objects.objects[index] = malloc(sizeof(object_t));
}
// initialize object to default
object_t* o = _world_objects.objects[index];
*o = object_default();
return o;
}
object_t* instantiate_object(const object_t *original) {
// create new object with default settings
object_t* obj = make_object();
*obj = *original;
obj->active = 1;

View File

@ -4,8 +4,6 @@
#include "corelib/render.h"
#include "corelib/assets.h"
#include "corelib/layers.h"
#include "SDL2/SDL_mouse.h"
#include "SDL2/SDL_scancode.h"
void start_game() {
// called when the game is done initializing the backend and ready to start