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.