diff --git a/include/DSGM_object.h b/include/DSGM_object.h index a4efa89..ae9602f 100644 --- a/include/DSGM_object.h +++ b/include/DSGM_object.h @@ -4,6 +4,11 @@ #define DSGM_DEFAULT_BITSHIFT 8 +#define DSGM_ValidateObjectInstance(objectInstance); if(objectInstance == DSGM_invalidObjectInstance) {\ + DSGM_invalidObjectInstance = NULL;\ + continue;\ +} + struct DSGM_objectInstance; typedef void (*DSGM_Event)(struct DSGM_objectInstance *me); @@ -67,6 +72,7 @@ typedef struct { #include "DSGM_room.h" extern void *me; +DSGM_ObjectInstance *DSGM_invalidObjectInstance; void DSGM_SetupObjectGroups(DSGM_Room *room, u8 screen, int objectGroupCount); void DSGM_SetupObjectInstances(DSGM_ObjectGroup *group, DSGM_Object *object, u8 screen, int objectInstanceCount, ...); diff --git a/lib/libdsgm.a b/lib/libdsgm.a index 2dea4c3..1dca0da 100644 Binary files a/lib/libdsgm.a and b/lib/libdsgm.a differ diff --git a/source/DSGM_object.c b/source/DSGM_object.c index 30d860a..1e34b8d 100644 --- a/source/DSGM_object.c +++ b/source/DSGM_object.c @@ -1,6 +1,7 @@ #include "DSGM.h" void *me = NULL; +DSGM_ObjectInstance *DSGM_invalidObjectInstance = NULL; void DSGM_SetupObjectGroups(DSGM_Room *room, u8 screen, int objectGroupCount) { room->objectGroupCount[screen] = objectGroupCount; @@ -211,14 +212,6 @@ DSGM_ObjectInstance *DSGM_CreateObjectInstanceFull(DSGM_Room *room, DSGM_ObjectI } void DSGM_DeleteObjectInstanceFull(DSGM_Room *room, DSGM_ObjectInstance **meP, DSGM_ObjectInstance *objectInstance) { - printf("full\n"); - swiWaitForVBlank(); - - if(objectInstance->object->destroy) { - printf("destr i[ here\n"); - swiWaitForVBlank(); - } - DSGM_ObjectInstanceRelation relation = { 0, 0 }; if(meP && *meP) relation = DSGM_GetObjectInstanceRelationFull(room, *meP); @@ -239,37 +232,19 @@ void DSGM_DeleteObjectInstanceFull(DSGM_Room *room, DSGM_ObjectInstance **meP, D int ID = DSGM_GetObjectInstanceIDFull(room, objectInstance); DSGM_Debug("Deleting object instance with ID %d\n", ID); - printf("got ID\n"); - swiWaitForVBlank(); - - if(objectInstance->object->destroy) { - printf("destr part 1\n"); - swiWaitForVBlank(); - - objectInstance->object->destroy(objectInstance); - } - - printf("destr\n"); - swiWaitForVBlank(); + if(objectInstance->object->destroy) objectInstance->object->destroy(objectInstance); DSGM_DeinitObjectInstanceRotScale(objectInstance); - printf("rotscaled\n"); - swiWaitForVBlank(); + DSGM_invalidObjectInstance = objectInstance; if(ID < group->objectInstanceCount - 1) { DSGM_Debug("Shifting %d object instances for deletion\n", (group->objectInstanceCount - ID - 1)); memcpy(&group->objectInstances[ID], &group->objectInstances[ID + 1], (group->objectInstanceCount - ID - 1) * sizeof(DSGM_ObjectInstance)); } - printf("shifted\n"); - swiWaitForVBlank(); - group->objectInstances = realloc(group->objectInstances, --group->objectInstanceCount * sizeof(DSGM_ObjectInstance)); - printf("re\n"); - swiWaitForVBlank(); - if(spriteNumbersChange) { int i; for(i = 0; i < 128; i++) { diff --git a/source/DSGM_room.c b/source/DSGM_room.c index 35ef232..578bfef 100644 --- a/source/DSGM_room.c +++ b/source/DSGM_room.c @@ -131,11 +131,13 @@ void DSGM_LoopRoom(DSGM_Room *room) { if(objectInstance->object->loop) objectInstance->object->loop(objectInstance); DSGM_ValidateRoom(); + DSGM_ValidateObjectInstance(objectInstance); if(screen == DSGM_BOTTOM && objectInstance->object->touch) { if(DSGM_newpress.Stylus && DSGM_StylusOverObjectInstanceFull(room, objectInstance)) { objectInstance->object->touch(objectInstance); DSGM_ValidateRoom(); + DSGM_ValidateObjectInstance(objectInstance); } } @@ -147,6 +149,7 @@ void DSGM_LoopRoom(DSGM_Room *room) { if(DSGM_ObjectInstanceCollision(objectInstance, &colliderGroup->objectInstances[collider])) { objectInstance->object->collisionEvents[collisionEvent].function(objectInstance, &colliderGroup->objectInstances[collider]); DSGM_ValidateRoom(); + DSGM_ValidateObjectInstance(objectInstance); } } }