Design Notes
Prototype #001 — the very first one. The goal was: someone sends you a link on LINE, you tap it, you're playing a 3D game in 2 seconds. No app store, no loading.
The pitch is "Fruit Ninja but 3D and the fruits fight back." Three lanes of monsters — Demons, Bunnies, Blobs — each with different sizes, marching toward you. Swipe across them to slash. Combo system scores Perfect (100 pts) or Good (50 pts) based on how close to the center you hit, and there's a multiplier that goes up by 0.1 per streak. Miss and it resets.
Built the slash mechanic first and it felt flat. Like swiping through paper. Added screen shake — 3-pixel camera offset per hit — and it immediately felt violent. The combo scoring happened sort of by accident: I was testing hit detection distances and noticed close-range swipes felt more satisfying, so I split it into zones. It started to feel like a rhythm game without planning to.
Wave 2 kicks in at 60 seconds — enemy speed doubles, more spawn at once. It's a pretty blunt difficulty curve. If I revisit this: procedural audio would be the big one. Each combo tier could play a different pitch, so chaining Perfects creates a rising scale — you'd be composing a melody through combat. Also want to try monsters that require specific swipe directions, like armored ones you can only hit from behind.
Dev Log
Screen shake tuning
Started at 10 pixels — felt like an earthquake. Down to 1 pixel — couldn't tell it was there. Landed on 3px with a 150ms decay. It needs to register physically before your brain catches up. Sounds dramatic for a swipe game but the difference between 0 and 3px is huge.
Touch input on mobile
touchmove events fire at different rates depending on the device, so the slash line would sometimes have gaps. Had to interpolate between touch points. Also found out some Android browsers silently suppress touchmove if you don't call preventDefault on touchstart — swipe just doesn't register, no error, nothing. Looked it up, it's a known browser behavior for scroll hijack prevention. Fixed it but annoying.
Hit detection is distance, not timing
The Perfect/Good zones are actually distance-based — Perfect is 1.5 to 4.0 units from center, Good is 4.0 to 6.5. I originally tried pure timing windows but it felt random on touch screens because finger speed varies so much. Distance is more intuitive: slash closer to the monster's core = better hit. Feels more like skill than luck.
Credits
3D models by @quaternius