Improved stability when deleting object instances

and removed the debug code that I left in
This commit is contained in:
CTurt 2014-10-04 08:52:29 +01:00
parent 09354152d9
commit ff76ca88b4
4 changed files with 12 additions and 28 deletions

View File

@ -4,6 +4,11 @@
#define DSGM_DEFAULT_BITSHIFT 8 #define DSGM_DEFAULT_BITSHIFT 8
#define DSGM_ValidateObjectInstance(objectInstance); if(objectInstance == DSGM_invalidObjectInstance) {\
DSGM_invalidObjectInstance = NULL;\
continue;\
}
struct DSGM_objectInstance; struct DSGM_objectInstance;
typedef void (*DSGM_Event)(struct DSGM_objectInstance *me); typedef void (*DSGM_Event)(struct DSGM_objectInstance *me);
@ -67,6 +72,7 @@ typedef struct {
#include "DSGM_room.h" #include "DSGM_room.h"
extern void *me; extern void *me;
DSGM_ObjectInstance *DSGM_invalidObjectInstance;
void DSGM_SetupObjectGroups(DSGM_Room *room, u8 screen, int objectGroupCount); void DSGM_SetupObjectGroups(DSGM_Room *room, u8 screen, int objectGroupCount);
void DSGM_SetupObjectInstances(DSGM_ObjectGroup *group, DSGM_Object *object, u8 screen, int objectInstanceCount, ...); void DSGM_SetupObjectInstances(DSGM_ObjectGroup *group, DSGM_Object *object, u8 screen, int objectInstanceCount, ...);

Binary file not shown.

View File

@ -1,6 +1,7 @@
#include "DSGM.h" #include "DSGM.h"
void *me = NULL; void *me = NULL;
DSGM_ObjectInstance *DSGM_invalidObjectInstance = NULL;
void DSGM_SetupObjectGroups(DSGM_Room *room, u8 screen, int objectGroupCount) { void DSGM_SetupObjectGroups(DSGM_Room *room, u8 screen, int objectGroupCount) {
room->objectGroupCount[screen] = 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) { 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 }; DSGM_ObjectInstanceRelation relation = { 0, 0 };
if(meP && *meP) relation = DSGM_GetObjectInstanceRelationFull(room, *meP); 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); int ID = DSGM_GetObjectInstanceIDFull(room, objectInstance);
DSGM_Debug("Deleting object instance with ID %d\n", ID); DSGM_Debug("Deleting object instance with ID %d\n", ID);
printf("got ID\n"); if(objectInstance->object->destroy) objectInstance->object->destroy(objectInstance);
swiWaitForVBlank();
if(objectInstance->object->destroy) {
printf("destr part 1\n");
swiWaitForVBlank();
objectInstance->object->destroy(objectInstance);
}
printf("destr\n");
swiWaitForVBlank();
DSGM_DeinitObjectInstanceRotScale(objectInstance); DSGM_DeinitObjectInstanceRotScale(objectInstance);
printf("rotscaled\n"); DSGM_invalidObjectInstance = objectInstance;
swiWaitForVBlank();
if(ID < group->objectInstanceCount - 1) { if(ID < group->objectInstanceCount - 1) {
DSGM_Debug("Shifting %d object instances for deletion\n", (group->objectInstanceCount - ID - 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)); 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)); group->objectInstances = realloc(group->objectInstances, --group->objectInstanceCount * sizeof(DSGM_ObjectInstance));
printf("re\n");
swiWaitForVBlank();
if(spriteNumbersChange) { if(spriteNumbersChange) {
int i; int i;
for(i = 0; i < 128; i++) { for(i = 0; i < 128; i++) {

View File

@ -131,11 +131,13 @@ void DSGM_LoopRoom(DSGM_Room *room) {
if(objectInstance->object->loop) objectInstance->object->loop(objectInstance); if(objectInstance->object->loop) objectInstance->object->loop(objectInstance);
DSGM_ValidateRoom(); DSGM_ValidateRoom();
DSGM_ValidateObjectInstance(objectInstance);
if(screen == DSGM_BOTTOM && objectInstance->object->touch) { if(screen == DSGM_BOTTOM && objectInstance->object->touch) {
if(DSGM_newpress.Stylus && DSGM_StylusOverObjectInstanceFull(room, objectInstance)) { if(DSGM_newpress.Stylus && DSGM_StylusOverObjectInstanceFull(room, objectInstance)) {
objectInstance->object->touch(objectInstance); objectInstance->object->touch(objectInstance);
DSGM_ValidateRoom(); DSGM_ValidateRoom();
DSGM_ValidateObjectInstance(objectInstance);
} }
} }
@ -147,6 +149,7 @@ void DSGM_LoopRoom(DSGM_Room *room) {
if(DSGM_ObjectInstanceCollision(objectInstance, &colliderGroup->objectInstances[collider])) { if(DSGM_ObjectInstanceCollision(objectInstance, &colliderGroup->objectInstances[collider])) {
objectInstance->object->collisionEvents[collisionEvent].function(objectInstance, &colliderGroup->objectInstances[collider]); objectInstance->object->collisionEvents[collisionEvent].function(objectInstance, &colliderGroup->objectInstances[collider]);
DSGM_ValidateRoom(); DSGM_ValidateRoom();
DSGM_ValidateObjectInstance(objectInstance);
} }
} }
} }