A 3D first-person shooting game built like a USPSA (practical-shooting) stage, made with Bevy 0.18 (Rust). The range and targets are built from primitive meshes (no art assets) and every sound — the start buzzer, gunshots, steel pings, the music bed — is synthesized at startup. No art or audio assets.
- MAKE READY (button or
Space), then wait for the random-delay buzzer. - Move and shoot the downrange targets:
- Paper (tan, A/C/D zones) — needs two hits; aim centre for the A zone.
- Steel (gray plates) — knock each one down with a hit.
- No-shoots (white) — don't hit these; each hit is a penalty.
- The timer stops when every target is engaged, or press STOP (
Space). - You're scored on hit factor; NEXT STAGE (
N) builds a fresh stage.
- Mobile: left thumb = move, drag the right side of the screen = look, FIRE button = shoot, RELOAD button = reload. The crosshair is where you'll hit.
- Desktop:
WASD= move, mouse = look, left-click = fire,R= reload.
You carry a 10-round magazine — you can't clear a stage on one mag, so reload when you run low. A reload takes ~1.8s and that time counts against your stage clock (just like real USPSA). An empty chamber dry-fires (click) instead of shooting.
| Hit | Points |
|---|---|
| A zone | 5 |
| C zone | 3 |
| D zone | 1 |
| Steel down | 5 |
| Miss / standing steel | −10 |
| No-shoot hit | −10 |
Each paper scores its best two hits. Hit factor = max(0, points) / time.
cargo run --release./build_apk.sh # builds target/bevy-uspsa.apk
adb install -r target/bevy-uspsa.apkRequires the Rust aarch64-linux-android target, cargo-apk, and an Android
SDK + NDK + JDK (see build_apk.sh). The launcher icon is generated by
make_icon.py.
game.rs— theMatchresource: random downrange layout, the start-buzzer / timer phase machine, ray-cast shooting from the camera into A/C/D zones, and hit-factor scoring.audio.rs— procedurally synthesized WAV clips (buzzer, gunshot, steel ping, paper thwack, penalty, stage-clear) plus a driving blues-rock loop.lib.rs— Bevy ECS app: a 3D scene (camera, lighting, range, primitive-mesh targets), first-person move/look with touch joysticks + WASD/mouse, raycast fire, and a 2D HUD overlay camera for the crosshair, controls, and results.