Quick answer: Use event.y directly. macOS natural scroll is intentional. Use event.flipped if you need cross-platform invariance.

Mac user scrolls down; in-app camera zooms out. Windows user same gesture zooms in. macOS natural scroll is inverted at OS level.

The Fix

for event in events:
    if event.type == pygame.MOUSEWHEEL:
        # Default: respect OS direction
        camera_zoom += event.y * 0.1

        # Or normalize to consistent direction
        normalized = (-1 if event.flipped else 1) * event.y

Default approach respects user setting. Normalized fights OS for app-internal consistency; pick based on UX policy.

Verifying

macOS user with natural scroll: gesture matches expectations. Windows user: matches Windows convention.

“Use event.y. OS handles direction.”

Related Issues

For event loop lag, see event lag. For multiprocessing pickle, see multiprocessing.

event.y. OS direction.