Quick answer: Pygame LayeredUpdates group flickering with equal-layer sprites? Tie-breaking is by insertion order, which is volatile during add/remove. Use unique layer values.
Two overlapping enemies share layer 5; their draw order swaps frame-to-frame as the group reorders internally.
Unique Layers
Assign layer based on a property that uniquely orders the sprites — e.g. y + offset for top-down games (lower on screen = drawn on top).
change_layer Per Frame
for s in group:
group.change_layer(s, s.rect.bottom)Re-layer each frame for dynamic sorting. Cheap; resolves ties deterministically.
Avoid Insertion Order Reliance
Insertion order changes when sprites die / spawn. Z-order based on it is fragile. Always derive from a stable property.
LayeredDirty for Perf
Pygame.sprite.LayeredDirty repaints only changed regions — faster for partial-update games. Same z-order behavior.
Verifying
Sprites draw in a stable order each frame. Overlapping enemies have predictable z-order based on the chosen property.
“LayeredUpdates ties break by insertion. Use a unique key per sprite.”
Make sprite class compute its layer from world position automatically — one less thing to forget when adding new entity types.