Quick answer: Always transform from the original surface, every frame. Never feed a rotated surface back into rotozoom — artifacts compound.

A spinning pickup uses rotozoom to rotate its sprite each frame. After a few seconds the sprite is a blurry mush — each rotation degraded the previous result.

The Bug

# WRONG: compounds degradation
self.image = pygame.transform.rotozoom(self.image, 5, 1.0)

Rotating an already-rotated surface re-samples blurred pixels into more blur. Errors accumulate.

The Fix

class Pickup(pygame.sprite.Sprite):
    def __init__(self):
        self.original = pygame.image.load("pickup.png").convert_alpha()
        self.angle = 0

    def update(self):
        self.angle = (self.angle + 5) % 360
        self.image = pygame.transform.rotozoom(self.original, self.angle, 1.0)
        self.rect = self.image.get_rect(center=self.rect.center)

Keep original untouched. Every frame, rotate from it by the absolute angle. One transform from clean source — no compounding.

Re-Center the Rect

Rotation changes the surface size. Re-derive the rect with get_rect(center=...) so the sprite spins in place rather than drifting.

Cache for Fixed Angles

If you only use a few angles (e.g. 8-direction sprite), pre-rotate once into a dict and look up — zero per-frame transform cost.

Verifying

Spinning pickup stays crisp indefinitely. No accumulating blur. Sprite rotates around its center.

“Transform from the pristine original every frame. Never iterate transforms on top of transforms.”

Same rule for scale, flip, and any lossy surface op — one transform from the source, never a chain.