Factory created object not deleted in time

Hi there.
I’ve got into some strange situation with deleting game objects.
So, they are created by loadLevel script which reads json-file with objects(enemies) coordinates and uses factory to spawn these object on screen. While doing this, script also collects generated GO ids into table.
After some game actions one of the GO instance is deleted with go.delete(true). While debugging I found strange behavior. Timer is set to 0.5sec delay to print one of GO instance coordinates like this

function instance_print(enemy_spawn_positions,factory_name)
	t=t+0.5
	print(tostring(t)..' Instance15 at: '..go.get_position("/instance15"))
end

So, the GO disappears from the screen, and after that I can see these lines in debug logs

DEBUG:SCRIPT: 0.5 Instance15 at: vmath.vector3(660, 580, 0)
DEBUG:SCRIPT: 1 Instance15 at: vmath.vector3(660, 580, 0)
DEBUG:SCRIPT: 1.5 Instance15 at: vmath.vector3(660, 580, 0)
DEBUG:SCRIPT: Instance 15 pos in rocket init: vmath.vector3(660, 580, 0)
DEBUG:SCRIPT: Localized enemy: [/instance15]
DEBUG:SCRIPT: Enemy pos: vmath.vector3(660, 580, 0)
DEBUG:SCRIPT: Rocket pos: vmath.vector3(700, 164, 0)
DEBUG:SCRIPT: 2 Instance15 at: vmath.vector3(660, 580, 0)
DEBUG:SCRIPT: 2.5 Instance15 at: vmath.vector3(660, 580, 0)
DEBUG:SCRIPT: Rocket collided with	hash: [/instance15]
DEBUG:SCRIPT: Rocket collided with group: 	hash: [enemies]
DEBUG:SCRIPT: Instance 15 pos in rocker final: vmath.vector3(660, 580, 0)
DEBUG:SCRIPT: Deleting the enemy
DEBUG:SCRIPT: With health: 0
DEBUG:SCRIPT: Enemy pos in final: vmath.vector3(660, 580, 0)
DEBUG:SCRIPT: Enemy name in final: [/instance15]
ERROR:SCRIPT: assets/levels/loadLevel.script:36: Instance /instance15 not found
stack traceback:
  [C]:-1: in function get_position
  assets/levels/loadLevel.script:36: in function <assets/levels/loadLevel.script:34>

ERROR:SCRIPT: assets/levels/loadLevel.script:36: Instance /instance15 not found
stack traceback:
  [C]:-1: in function get_position
  assets/levels/loadLevel.script:36: in function <assets/levels/loadLevel.script:34>

ERROR:SCRIPT: assets/levels/loadLevel.script:36: Instance /instance15 not found
stack traceback:
  [C]:-1: in function get_position
  assets/levels/loadLevel.script:36: in function <assets/levels/loadLevel.script:34>

ERROR:SCRIPT: assets/levels/loadLevel.script:36: Instance /instance15 not found
stack traceback:
  [C]:-1: in function get_position
  assets/levels/loadLevel.script:36: in function <assets/levels/loadLevel.script:34>

ERROR:SCRIPT: assets/levels/loadLevel.script:36: Instance /instance15 not found
stack traceback:
  [C]:-1: in function get_position
  assets/levels/loadLevel.script:36: in function <assets/levels/loadLevel.script:34>

DEBUG:SCRIPT: 5.5 Instance15 at: vmath.vector3(306, 747.33361816406, 0)
DEBUG:SCRIPT: 6 Instance15 at: vmath.vector3(306, 697.33392333984, 0)
DEBUG:SCRIPT: 6.5 Instance15 at: vmath.vector3(306, 647.33422851562, 0)
DEBUG:SCRIPT: 7 Instance15 at: vmath.vector3(306, 597.33453369141, 0)
DEBUG:SCRIPT: 7.5 Instance15 at: vmath.vector3(306, 547.33483886719, 0)
DEBUG:SCRIPT: 8 Instance15 at: vmath.vector3(306, 497.33499145508, 0)
DEBUG:SCRIPT: 8.5 Instance15 at: vmath.vector3(306, 447.33483886719, 0)
DEBUG:SCRIPT: 9 Instance15 at: vmath.vector3(306, 397.3346862793, 0)
DEBUG:SCRIPT: 9.5 Instance15 at: vmath.vector3(306, 347.33453369141, 0)
DEBUG:SCRIPT: 10 Instance15 at: vmath.vector3(306, 297.33438110352, 0)
DEBUG:SCRIPT: 10.5 Instance15 at: vmath.vector3(306, 247.33427429199, 0)
DEBUG:SCRIPT: 11 Instance15 at: vmath.vector3(306, 197.33435058594, 0)
DEBUG:SCRIPT: 11.5 Instance15 at: vmath.vector3(306, 147.33442687988, 0)
DEBUG:SCRIPT: 12 Instance15 at: vmath.vector3(306, 97.334426879883, 0)
DEBUG:SCRIPT: 12.5 Instance15 at: vmath.vector3(306, 47.334407806396, 0)
ERROR:SCRIPT: assets/levels/loadLevel.script:36: Instance /instance15 not found
stack traceback:
  [C]:-1: in function get_position
  assets/levels/loadLevel.script:36: in function <assets/levels/loadLevel.script:34>

ERROR:SCRIPT: assets/levels/loadLevel.script:36: Instance /instance15 not found
stack traceback:
  [C]:-1: in function get_position
  assets/levels/loadLevel.script:36: in function <assets/levels/loadLevel.script:34>

ERROR:SCRIPT: assets/levels/loadLevel.script:36: Instance /instance15 not found
stack traceback:
  [C]:-1: in function get_position
  assets/levels/loadLevel.script:36: in function <assets/levels/loadLevel.script:34>

ERROR:SCRIPT: assets/levels/loadLevel.script:36: Instance /instance15 not found
stack traceback:
  [C]:-1: in function get_position
  assets/levels/loadLevel.script:36: in function <assets/levels/loadLevel.script:34>

ERROR:SCRIPT: assets/levels/loadLevel.script:36: Instance /instance15 not found
stack traceback:
  [C]:-1: in function get_position
  assets/levels/loadLevel.script:36: in function <assets/levels/loadLevel.script:34>

DEBUG:SCRIPT: 15.5 Instance15 at: vmath.vector3(498, 747.33361816406, 0)
DEBUG:SCRIPT: 16 Instance15 at: vmath.vector3(498, 697.33392333984, 0)
DEBUG:SCRIPT: 16.5 Instance15 at: vmath.vector3(498, 647.33422851562, 0)
DEBUG:SCRIPT: 17 Instance15 at: vmath.vector3(498, 597.33453369141, 0)
DEBUG:SCRIPT: 17.5 Instance15 at: vmath.vector3(498, 547.33483886719, 0)
DEBUG:SCRIPT: 18 Instance15 at: vmath.vector3(498, 497.33499145508, 0)
DEBUG:SCRIPT: 18.5 Instance15 at: vmath.vector3(498, 447.33483886719, 0)
DEBUG:SCRIPT: 19 Instance15 at: vmath.vector3(498, 397.3346862793, 0)
DEBUG:SCRIPT: 19.5 Instance15 at: vmath.vector3(498, 347.33453369141, 0)
DEBUG:SCRIPT: 20 Instance15 at: vmath.vector3(498, 297.33438110352, 0)
DEBUG:SCRIPT: 20.5 Instance15 at: vmath.vector3(498, 247.33427429199, 0)
DEBUG:SCRIPT: 21 Instance15 at: vmath.vector3(498, 197.33435058594, 0)
DEBUG:SCRIPT: 21.5 Instance15 at: vmath.vector3(498, 147.33442687988, 0)
DEBUG:SCRIPT: 22 Instance15 at: vmath.vector3(498, 97.334426879883, 0)
DEBUG:SCRIPT: 22.5 Instance15 at: vmath.vector3(498, 47.334407806396, 0)
ERROR:SCRIPT: assets/levels/loadLevel.script:36: Instance /instance15 not found
stack traceback:

So, for me it seems like after 2-3 delay after GO deletion it appears again in some random coordinates and drops down by 100 pixels every 1 second. BTW I have disabled gravity.
After ghost GO leaves the screen, it’s somehow lost again and spawns in new random coordinates and drops down.

Are there other factories in your game? Defold might be recycling the IDs of deleted enemies to use for other factory-spawned objects.

1 Like

Yes, there are more factories. Actually, some factories are creating enemy bullets flying down the screen. How can I add some specific prefix to GO instances names? So, the instance name will be factory-unique.

I don’t think that’s possible. The proper way to fix this is to remove the enemy ID from the table as soon as it’s deleted. Defold expects you to not keep around references to deleted objects.

What if I use collection with factory? Then instances will have unique ids relative to this collection. I need to iterate through them periodically(finding closest enemy).
Or, if you say need to delete instance id from table - it can’t be done effectively for simple table. I need some sort of indexed array or map type.

You can put the ids as keys in a Lua table.

local lookup = {}
local id = factory.create()
lookup[id] = true

....

go.delete(id)
lookup[id] = nil
1 Like

Yeah, I was thinking about this too. Thank you, community, for all the answers