Aesthetics: 3x render res, flatter lens, 4-frame walk cycles, tiered gore
- RES 2 -> 3: phone screens now DOWNSCALE the canvas (crisp pixels) instead of upscaling it (soft). Umpire-tap coords un-hardcoded from RES=2. - Flatter lens: camZ 36 -> 42 with camF scaled per orientation (406/580) so the PLAYER stays the same size — far-court zombies render ~25% bigger and finally read as individuals from the baseline. - Smoother animation: 4-frame walk cycles for both classic shamblers and the runner's sprint (new sheets, same style anchor; z_a1-4, z_b1-4, z_f1-4). Same cycle frequency — frames subdivide the stride. Render falls back to 2 frames per variant until its sheet loads. - Tiered gore (GORE_MUL): the more advanced the zombie, the more absurd the mess — classics 1x (base bumped 24 -> 30 particles), runner 1.8x, shield 2.5x, racket boss 3x, brute 4x (120 particles, a scatter of stains, an instant size-3 mound). Verified: fresh origin, canvas 1440px, umpire triple-tap works at RES 3, all 4 anim frames cycle at the old stride rate, brute kill = 120 parts / 2 stains / size-3 pile, far-court lineup screenshot clearly readable, portrait layout numbers correct (810x1440, camF 580), tennis 11/12, no console errors. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
e75b3888de
commit
e948e8b36e
19 files changed
+28
-15
No files matched your search
@@ -6,7 +6,7 @@
|
||||
import { TUNE, COURT, UMP_H } from './config.js';
|
||||
import { P, O, ball, score, G, setupPoint } from './state.js';
|
||||
import { update, keyPressed, solveShot, inServeBox, inCourt, forceZombies, splatPoint } from './gameplay.js';
|
||||
import { fitViewport, render, proj } from './render.js';
|
||||
import { fitViewport, render, proj, RES } from './render.js';
|
||||
import { voice } from './audio.js';
|
||||
import { zombies, spawnZombie, piles, gore, parts, pellets, extras, explode } from './zombies.js';
|
||||
import { cv } from './dom.js';
|
||||
@@ -40,8 +40,8 @@ addEventListener('keydown', maybeRestart);
|
||||
let umpTaps = [];
|
||||
cv.addEventListener('pointerdown', e => {
|
||||
const r = cv.getBoundingClientRect();
|
||||
const x = (e.clientX - r.left) / r.width * (cv.width / 2); // logical coords (RES = 2)
|
||||
const y = (e.clientY - r.top) / r.height * (cv.height / 2);
|
||||
const x = (e.clientX - r.left) / r.width * (cv.width / RES); // logical coords
|
||||
const y = (e.clientY - r.top) / r.height * (cv.height / RES);
|
||||
if (x >= 6 && x <= 138 && y >= 6 && y <= 36) { G.logShow = !G.logShow; return; } // scoreboard tap = miss-log overlay
|
||||
const u = proj(7.1, 0, COURT.netZ);
|
||||
if (Math.abs(x - u.x) > 16 || y > u.y + 6 || y < u.y - UMP_H * u.s - 8) return;
|
||||
|
||||
Reference in new issue
Block a user