Your pixel-art game cannot have smooth zoom. Here is the compromise we shipped.
No. 02
Pinch-to-zoom ran straight into a physical constraint rather than a taste question — crisp pixels and fluid scaling are, at the naive level, mutually exclusive. The fix was to stop treating it as one decision.
The bug report was two sentences. The screen went black while pinch-zooming on a real phone, and then, once that was fixed: could the zoom feel fluid instead of locked into some positions?
The first half was a bug. The second half was not, and it took a while to work out why.
Why sharpness and smoothness fight
The game draws at a low internal resolution and lets the device scale that canvas up to its real pixel count. That is the standard way to make pixel art look like pixel art on a screen with four times too many pixels, and it has one hard condition attached: it is only crisp at whole-number scale factors.
At 2×, every art pixel becomes exactly four screen pixels. Clean edges, no ambiguity.
At 1.5×, an art pixel has to cover one and a half screen pixels, and there is no such thing as half a pixel. The renderer has to share — some art pixels get two screen pixels, some get one — and the result is soft, uneven, and it shimmers as you move, because which pixels get doubled changes from frame to frame.
So the two things being asked for genuinely conflict. Continuous zoom means arbitrary scale factors. Arbitrary scale factors mean fractional ones. Fractional ones mean soft, crawling art.
Not assuming which way to break the tie
There were two honest options and no correct one, so it went back as a question rather than a decision:
- Continuous, always. The zoom feels perfect and the art is very slightly soft at most zoom levels, all the time.
- Smooth while your fingers are moving, then snap crisp when you let go. Fluid during the gesture; resolves to a whole-number step the instant you lift.
The second one was chosen, and that is what shipped. While the gesture is live, the view scales fluidly in real time. The moment you lift your fingers, it settles onto the nearest crisp step.
It is worth being clear that this is a compromise and not a trick. There is a fraction of a second where the art is soft. It happens to be the fraction of a second where your fingers are covering the screen and everything is moving, which is exactly when you are least able to notice.
Two details worth the extra effort
The snap picks the nearest step by ratio, not by difference. Zoom is multiplicative — going from 1× to 2× is the same kind of change as going from 2× to 4×. So the fair midpoint between 1× and 2× is not 1.5×, it is their geometric mean, about 1.41×. Snapping on plain arithmetic distance makes the step feel biased toward the lower end, and it feels wrong in a way that is very hard to name if you do not know what you are looking for.
Pinching past the end of the range rubber-bands. Rather than hitting a dead wall at maximum zoom, the view keeps responding with increasing resistance and springs back when you let go, the way a scroll view does at the top of a list. A hard stop reads as a bug. Resistance reads as a boundary.
What the whole thing is actually about
The instinct when someone says "this should feel smoother" is to make it smoother. Here that would have meant quietly accepting permanently soft art in a game whose entire visual identity is crisp pixels, to fix a complaint about a gesture that lasts under a second.
The constraint was real and could not be removed. What could change was when the player pays for it — and moving that cost into the half-second where nobody is looking turned out to be worth more than solving the problem would have been.