mirror of
https://github.com/CTurt/dsgmLib.git
synced 2025-06-19 15:15:31 -04:00
Improved stability when deleting object instances
and removed the debug code that I left in
This commit is contained in:
parent
09354152d9
commit
ff76ca88b4
@ -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, ...);
|
||||||
|
BIN
lib/libdsgm.a
BIN
lib/libdsgm.a
Binary file not shown.
@ -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++) {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user