Biliardo: immagini e suoni insieme. Durante la steccata aspetta la fisica, non il disegno: la biglia parte quando la stecca la tocca, col suo suono, e si disegnano sempre le posizioni vere (segnalato da Codex: urti che sembravano senza contatto e suoni in anticipo di 180 ms)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018ks2K99uqCZjAxvy7Rdj1R
This commit is contained in:
@@ -25,25 +25,21 @@ test('il panno generato coincide con VIEW, senza buchi fra i ritagli', () => {
|
||||
assert.ok(Math.abs(area - 640 * 360) < 1e-8);
|
||||
});
|
||||
|
||||
test('la steccata trattiene solo il disegno: velocità immediata e traiettoria invariata', () => {
|
||||
test('la steccata: la fisica parte quando la stecca tocca la biglia, e il disegno mostra sempre le posizioni vere', () => {
|
||||
const c = newBiliardo(42), start = { ...c.balls.player };
|
||||
const expected = simulate(c, 'player', c.angle, c.power);
|
||||
shoot(c);
|
||||
assert.ok(Math.hypot(c.balls.player.vx, c.balls.player.vy) > 0);
|
||||
update(c, SHOT_DELAY / 2);
|
||||
assert.notEqual(c.balls.player.x, start.x, 'la fisica è già partita');
|
||||
assert.equal(visualFrame(c).balls.player.x, start.x, 'il disegno aspetta la punta della stecca');
|
||||
assert.equal(c.balls.player.x, start.x, 'la stecca non è ancora arrivata');
|
||||
assert.ok(!c.events.some(e => e.kind === 'biliardo-cue'), 'niente suono del colpo prima del contatto');
|
||||
update(c, SHOT_DELAY);
|
||||
assert.ok(c.events.some(e => e.kind === 'biliardo-cue'), 'il suono del colpo arriva col contatto');
|
||||
assert.ok(c.balls.player.x !== start.x || c.balls.player.y !== start.y, 'la biglia è partita');
|
||||
const before = structuredClone(c);
|
||||
const shown = visualFrame(c);
|
||||
assert.ok(shown.balls.player.x > start.x);
|
||||
assert.ok(shown.balls.player.x < c.balls.player.x);
|
||||
assert.equal(visualFrame(c).balls, c.balls, 'il disegno usa le posizioni vere, senza ritardo (Codex: urti e suoni sfasati)');
|
||||
assert.deepEqual(c, before, 'leggere il fotogramma non scrive nello stato');
|
||||
for (let i = 0; i < 10000 && c.step === 'rolling'; i++) update(c, FIXED_STEP);
|
||||
assert.deepEqual(judge(c.shot), expected);
|
||||
assert.ok(c.visual.frames.length < 110, 'la cronologia non cresce per tutta la partita');
|
||||
while (c.step === 'settle') update(c, FIXED_STEP);
|
||||
assert.equal(visualFrame(c).balls, c.balls, 'al nuovo turno torna la posizione corrente');
|
||||
});
|
||||
|
||||
test('caduta progressiva dei birilli, senza alterare guida, punteggio o rialzata', () => {
|
||||
@@ -62,7 +58,6 @@ test('caduta progressiva dei birilli, senza alterare guida, punteggio o rialzata
|
||||
assert.equal(pinFall(p, p.visualDownAt), 0);
|
||||
assert.ok(pinFall(p, p.visualDownAt + 0.12) > 0 && pinFall(p, p.visualDownAt + 0.12) < 1);
|
||||
assert.equal(pinFall(p, p.visualDownAt + 0.3), 1);
|
||||
assert.equal(visualFrame(c).pins.some(p => p.down), false, 'anche la caduta segue il tempo delle biglie visibili');
|
||||
for (let i = 0; i < 10000 && c.step === 'rolling'; i++) update(c, FIXED_STEP);
|
||||
assert.deepEqual(judge(c.shot), expected);
|
||||
while (c.step === 'settle') update(c, FIXED_STEP);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { newBiliardo, update, press, release, cancel, setPower, shoot, judge, value, reach, speedFor, predict, castle, aimAt, aimScreen, nudge, canThrow, collide, simulate, LEN, WID, R, VIEW, SWING, powerAt, FIXED_STEP, CUSHION } from '../src/engine/biliardo.js';
|
||||
import { newBiliardo, update, press, release, cancel, setPower, shoot, judge, value, reach, speedFor, predict, castle, aimAt, aimScreen, nudge, canThrow, collide, simulate, LEN, WID, R, VIEW, SWING, powerAt, FIXED_STEP, CUSHION, WINDUP } from '../src/engine/biliardo.js';
|
||||
import { story } from '../src/story/story.js';
|
||||
import { Game } from '../src/engine/game.js';
|
||||
import { settle } from './helpers.mjs';
|
||||
@@ -191,6 +191,7 @@ test('la mira è bloccata durante la carica, il tocco breve ripristina la forza
|
||||
press(c); update(c, 0.2); cancel(c);
|
||||
assert.equal(c.power, power);
|
||||
press(c); update(c, 0.2); release(c);
|
||||
update(c, WINDUP + 1 / 240); // la stecca arriva alla biglia
|
||||
near(Math.atan2(c.balls.player.vy, c.balls.player.vx), fixed);
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user