Lavori in corso (non pubblicati): Bertovo al tavolo di mezzo coi rinquarti (Codex), Bini, Yuri, il Gianno e la Brauda in gara, l'Audi «Let it be», sensibilità e riquadro dello swipe, pulsanti su iPhone (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GiECdCPptNRwbVzjzHbohi
This commit is contained in:
+17
-8
@@ -29,7 +29,10 @@ export const LAPS = 3, STEP = 2, ROAD = 9, VERGE = 15, COUNTDOWN = 3, FIXED_STEP
|
||||
export const INTRO = { each: 4, ride: 1.8, from: 110, after: 1 };
|
||||
// Sterzo (rad/s a velocità piena di sterzo), freno, rallentamento senza gas, e quanto si scivola di lato in curva.
|
||||
export const TURN = 3.4, BRAKE = 150, COAST = 45, GRIP = 9, SLIDE = 0.5;
|
||||
export const SWIPE = { dead: 10, reach: 60, gain: 2.6 };
|
||||
// Lo swipe: zona morta e portata in pixel della scena; la sensibilità (0..1, cursore del pannello) va dal guadagno
|
||||
// `soft` al `hard`, e lo sterzo del dito insegue quello voluto a `follow` al secondo (niente scatti). Sul telefono
|
||||
// la prima versione era ingiocabile: si parte poco sensibili.
|
||||
export const SWIPE = { dead: 14, reach: 60, soft: 1.2, hard: 3, follow: 7, sens: 0.3 };
|
||||
export const BOOST = { speed: 1.35, time: 1.2 }, CAN = { time: 1.6, respawn: 6 }, HOLE = { fast: 45, out: 1.1 };
|
||||
const clamp = (v, lo, hi) => Math.max(lo, Math.min(hi, v));
|
||||
const wrapAngle = a => Math.atan2(Math.sin(a), Math.cos(a));
|
||||
@@ -49,7 +52,7 @@ export const RIDERS = [
|
||||
];
|
||||
// I livelli: quanto vanno gli altri, quanto si resta fermi nella paglia, e la guida disegnata in pista.
|
||||
export const LEVELS = {
|
||||
bona: { rivals: 0.78, stun: 0.4, guide: 'zone' },
|
||||
bona: { rivals: 0.74, stun: 0.4, guide: 'zone' },
|
||||
seria: { rivals: 0.84, stun: 0.9, guide: 'coni' },
|
||||
male: { rivals: 0.93, stun: 1.4, guide: null },
|
||||
};
|
||||
@@ -152,16 +155,18 @@ export function newGara(seed = Date.now() >>> 0, def = {}) {
|
||||
if (!riders.some(r => r.id === 'andrea')) throw new Error('Nella gara manca Andrea');
|
||||
for (const r of riders) { r.grid = r.s; r.shown = false; }
|
||||
return { step: 'intro', t: 0, age: 0, seed, level, skill, riders, holding: false, braking: false, keys: { left: false, right: false, gas: new Set(), brake: false },
|
||||
pointer: null, toggle: false, brakeButton: false, drag: 0, buttons: 0, anchor: null, finger: null,
|
||||
power: 0, accumulator: 0, events: [], result: null, order: riders.map(r => r.id), taken: {} };
|
||||
pointer: null, toggle: false, brakeButton: false, drag: 0, buttons: 0, anchor: null, finger: null, sens: SWIPE.sens,
|
||||
power: SWIPE.sens, accumulator: 0, events: [], result: null, order: riders.map(r => r.id), taken: {} };
|
||||
}
|
||||
export const player = c => c.riders.find(r => r.id === 'andrea');
|
||||
export const lapOf = r => clamp(Math.floor(Math.max(0, r.s) / TRACK.length) + 1, 1, LAPS);
|
||||
export const canThrow = c => c.step === 'intro' || c.step === 'start' || c.step === 'race';
|
||||
export const canAdjust = c => c.step === 'race'; // lo sterzo del pannello
|
||||
// Lo sterzo e il freno del pannello, e il cursore della sensibilità (regolabile già prima del via).
|
||||
export const canAdjust = c => c.step !== 'result';
|
||||
export const aimFree = () => true;
|
||||
export const nudge = () => false;
|
||||
export const setPower = () => false;
|
||||
// Il cursore del pannello, nella gara, è la sensibilità dello sterzo col dito.
|
||||
export function setPower(c, value) { c.sens = c.power = clamp(Number(value) || 0, 0, 1); return true; }
|
||||
|
||||
// Il gas ha più fonti, ognuna con la sua: i tasti tenuti giù (Spazio, Invio, ↑), il dito o il mouse premuto sulla
|
||||
// scena (uno solo, col suo pointerId) e il pulsante Gas del pannello, che resta acceso finché non lo si ritocca.
|
||||
@@ -238,12 +243,16 @@ export function key(c, name, down) {
|
||||
export function steerButton(c, dir) { c.buttons = dir; return true; }
|
||||
export function brakeButton(c, down) { c.brakeButton = down; sync(c); return true; }
|
||||
export function steering(c) {
|
||||
c.drag = 0;
|
||||
let want = 0;
|
||||
if (c.pointer !== null && c.anchor && c.finger) {
|
||||
const dx = c.finger[0] - c.anchor[0], dy = c.finger[1] - c.anchor[1];
|
||||
const gain = SWIPE.soft + (SWIPE.hard - SWIPE.soft) * (c.sens ?? SWIPE.sens);
|
||||
// Si ricalcola anche col dito fermo: il motorino intanto cambia direzione.
|
||||
if (Math.hypot(dx, dy) >= SWIPE.dead) c.drag = clamp(wrapAngle(Math.atan2(dy, dx) - player(c).a) * SWIPE.gain, -1, 1);
|
||||
if (Math.hypot(dx, dy) >= SWIPE.dead) want = clamp(wrapAngle(Math.atan2(dy, dx) - player(c).a) * gain, -1, 1);
|
||||
}
|
||||
// Lo sterzo del dito si avvicina a quello voluto un po' per volta (a ogni passo fisso), e si azzera subito alzandolo.
|
||||
c.drag = c.pointer === null ? 0 : c.drag + (want - c.drag) * Math.min(1, SWIPE.follow * FIXED_STEP);
|
||||
if (Math.abs(want - c.drag) < 1e-6) c.drag = want;
|
||||
return clamp((c.keys.right ? 1 : 0) - (c.keys.left ? 1 : 0) + c.buttons + c.drag, -1, 1);
|
||||
}
|
||||
// La distanza davanti, sul giro, da s a un punto della pista (sempre fra 0 e la lunghezza del giro).
|
||||
|
||||
Reference in New Issue
Block a user