The problem

You can leave an app half-finished — a missing screen stays out of sight and nobody notices. You cannot do that with a game: unless the frame loop, collision, difficulty curve, score, death, restart and menu all work, there is nothing to play at all. That is why I picked a game to test the verb "to finish".

The second question was more technical: without an off-the-shelf game engine, can you build a smooth game loop using only React Native's own drawing and animation tools?

The solution

No engine: every ball and the player are ordinary views whose position is updated each frame. The loop runs on requestAnimationFrame and gets two things right — it scales movement by elapsed time (on a slow device the game does not slow down, the steps simply get bigger) and caps that scale, so when the app returns from the background the balls do not teleport through walls.

Collision is measured by the centre distance of a circle kept deliberately smaller than the drawn box: from the player's point of view, the feeling of "that was close" matters more than whether the maths says you were clear. The same measurement does a second job — every ball that passes within a certain distance raises the score and fills the slow-motion meter. In other words, the game's reward system rewards nearly getting hit rather than staying away.

Difficulty rises along four separate axes rather than one multiplier: the level thresholds (linear at first, then an accelerating curve), ball speed, new ball types that unlock as levels progress (a hunter that follows you, one that splits in two, a fast one) and the steadily shrinking arena. All four can be tuned separately, because the difference between "the game got harder" and "the game became tediously impossible" lies in the ratio between these settings.

Technology

Expo / React NativerequestAnimationFrame LoopAnimated APIPanResponderEngine-Free Rendering

A detail worth highlighting

The control scheme is a small but decisive decision: wherever you put your finger, the character does not teleport there — it moves by the difference your finger travels from the moment you touch. That way your finger never covers the character, and in a narrow arena blocking your own view means death. The same movement is also clamped to the arena's current (shrunken) bounds.

To be honest, the project's weakest point shows up here too: the simulation triggers a re-render every frame, and the high score is not stored permanently — closing the app resets the record. Rather than filing these away as "to do", I would rather write them here; knowing a project's limits is more useful than claiming a perfection that is not there.

Screens

Dodge Arena's menu screen — the glowing Dodge Arena logo, the player character, the Play button, the option to put your own photo on the character, and boxes explaining which collectibles are good and which are bad
The menu — good and bad collectibles are listed clearly from the start.
Dodge Arena's game over screen — the Game Over title, the score counting up, a new-record badge, play again and menu buttons, and a line at the bottom with the level reached and the best score
Game over — the score counts up, with the level and record below.

Let's talk about a similar problem

Carrying a half-finished product to the end, or standing something up from scratch — whichever it is, write to me and let's talk.