Folge 8: Noa wirft wieder einen Schatten, sobald sie die Laterne nicht hält (beim Hand-Schattenspiel ausgeblendet, sonst doppelter Hase)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Lara 2026-11-06 12:49:51 +00:00
parent 79cd9459dc
commit 120b75a0da
2 changed files with 8 additions and 4 deletions

View file

@ -84,7 +84,8 @@ export const Szene7: React.FC = () => {
f={f} f={f}
kam={kam} kam={kam}
laterne={{inHand: false, licht: 1, x: LATERNE.x, y: LATERNE.y}} laterne={{inHand: false, licht: 1, x: LATERNE.x, y: LATERNE.y}}
noa={{pose: [[0, 'noa_B_hocken'], [z.bild0.start + 4, 'noa_B_hand-hase'], [z.hals.start, 'noa_B_hocken'], [z.igel.start - 2, 'noa_B_hand-igel']], x: NOA_X}} // Noas Körperschatten nur ohne erhobene Hand – sonst gäbe es den Hasen/Igel an der Wand doppelt
noa={{pose: [[0, 'noa_B_hocken'], [z.bild0.start + 4, 'noa_B_hand-hase'], [z.hals.start, 'noa_B_hocken'], [z.igel.start - 2, 'noa_B_hand-igel']], x: NOA_X, schatten: 1 - Math.max(hase, igel)}}
pino={{pose: [[0, 'pino_A4_staunen'], [z.p1.start, 'pino_A3_lachen']], x: LATERNE.x - 230}} pino={{pose: [[0, 'pino_A4_staunen'], [z.p1.start, 'pino_A3_lachen']], x: LATERNE.x - 230}}
lulu={{pose: 'lulu_A3_lachen', stauchY: strecken}} lulu={{pose: 'lulu_A3_lachen', stauchY: strecken}}
wandExtra={ wandExtra={

View file

@ -6,8 +6,8 @@ import {BODEN} from '../baukasten/orte';
import {Abenddunkel, GartenAbend, Laterne, WAND_VOLL, WandSchatten, laterneInNoasHand} from './teile'; import {Abenddunkel, GartenAbend, Laterne, WAND_VOLL, WandSchatten, laterneInNoasHand} from './teile';
// Gemeinsame Bühne für Szene 4–7: die drei an der Hauswand, die Laterne als einzige Lichtquelle. // Gemeinsame Bühne für Szene 4–7: die drei an der Hauswand, die Laterne als einzige Lichtquelle.
// Lulu und Pino werfen ihren Schatten an die Wand (Noa nicht: ihr Bild enthält die Laterne samt Stab, // Alle werfen ihren Schatten an die Wand – Noa nur, wenn sie die Laterne nicht hält (ihr Laternenbild enthält
// deren Schatten wäre falsch – die Lampe ist ja das Licht); er nimmt dieselbe Pose, Drehung und Stauchung an // Laterne samt Stab, deren Schatten wäre falsch: die Lampe ist ja das Licht); er nimmt dieselbe Pose, Drehung und Stauchung an
// (nickt Lulu, nickt ihr Schatten mit). Feste Plätze, damit die Szenen zusammenpassen. // (nickt Lulu, nickt ihr Schatten mit). Feste Plätze, damit die Szenen zusammenpassen.
export const PLATZ = {noa: 700, pino: 880, lulu: 1180, laterneBoden: {x: 560, y: BODEN - 56}}; export const PLATZ = {noa: 700, pino: 880, lulu: 1180, laterneBoden: {x: 560, y: BODEN - 56}};
@ -15,7 +15,7 @@ export const PLATZ = {noa: 700, pino: 880, lulu: 1180, laterneBoden: {x: 560, y:
export type Buehne = { export type Buehne = {
kam: {x: number; y: number; zoom: number}; kam: {x: number; y: number; zoom: number};
laterne: {inHand: boolean; x?: number; y?: number; licht: number; schwung?: number}; laterne: {inHand: boolean; x?: number; y?: number; licht: number; schwung?: number};
noa: {pose: string | Posenfolge; x?: number}; noa: {pose: string | Posenfolge; x?: number; schatten?: number}; // schatten: Deckkraft 0–1 (0 solange sie die Laterne hält)
pino: {pose: string | Posenfolge; x: number; gang?: Gang; drehung?: number; y?: number; k?: number; versatz?: number}; pino: {pose: string | Posenfolge; x: number; gang?: Gang; drehung?: number; y?: number; k?: number; versatz?: number};
lulu: {pose: string | Posenfolge; x?: number; hell?: number; drehung?: number; stauchY?: number; k?: number}; lulu: {pose: string | Posenfolge; x?: number; hell?: number; drehung?: number; stauchY?: number; k?: number};
wandExtra?: React.ReactNode; // z. B. Hand-Schatten (an der Wand, hinter den Figuren) wandExtra?: React.ReactNode; // z. B. Hand-Schatten (an der Wand, hinter den Figuren)
@ -31,6 +31,8 @@ export const Wandszene: React.FC<Buehne> = ({kam, laterne, noa, pino, lulu, wand
const s = hand.s; const s = hand.s;
const kLulu = lulu.k ?? 1.12; // Lulus Schatten: etwas größer als Lulu, Kopf und Hals passen an die Wand const kLulu = lulu.k ?? 1.12; // Lulus Schatten: etwas größer als Lulu, Kopf und Hals passen an die Wand
const kPino = pino.k ?? 1 + 220 / Math.max(80, Math.abs(pino.x - lat.x)); const kPino = pino.k ?? 1 + 220 / Math.max(80, Math.abs(pino.x - lat.x));
const kNoa = 1 + 160 / Math.max(120, Math.abs(noaX - lat.x));
const noaSchatten = laterne.inHand ? 0 : (noa.schatten ?? 1);
const hell = lulu.hell ?? 1; const hell = lulu.hell ?? 1;
const pinoGeht = pino.gang?.geht(f); const pinoGeht = pino.gang?.geht(f);
// Niemand steht ganz still: alle atmen, Lulu wiegt sich leicht – die Schatten machen es mit // Niemand steht ganz still: alle atmen, Lulu wiegt sich leicht – die Schatten machen es mit
@ -44,6 +46,7 @@ export const Wandszene: React.FC<Buehne> = ({kam, laterne, noa, pino, lulu, wand
{/* Schatten an der Wand (hinter den Figuren) */} {/* Schatten an der Wand (hinter den Figuren) */}
<WandSchatten pose={lulu.pose} x={luluX} licht={lat} hoehe={340 * 2.05} k={kLulu} wand={WAND_VOLL} drehung={luluDreh} stauchY={luluStauch} /> <WandSchatten pose={lulu.pose} x={luluX} licht={lat} hoehe={340 * 2.05} k={kLulu} wand={WAND_VOLL} drehung={luluDreh} stauchY={luluStauch} />
<WandSchatten pose={pinoGeht ? 'pino_A6_blick-rechts' : pino.pose} x={pino.x} licht={lat} hoehe={340 * 0.4} k={kPino} wand={WAND_VOLL} drehung={pino.drehung} stauchY={pinoStauch} versatz={pino.versatz} /> <WandSchatten pose={pinoGeht ? 'pino_A6_blick-rechts' : pino.pose} x={pino.x} licht={lat} hoehe={340 * 0.4} k={kPino} wand={WAND_VOLL} drehung={pino.drehung} stauchY={pinoStauch} versatz={pino.versatz} />
{noaSchatten > 0 && <WandSchatten pose={noa.pose} x={noaX} licht={lat} hoehe={340} k={kNoa} wand={WAND_VOLL} stauchY={atmen(f, 2)} deckkraft={0.36 * noaSchatten} />}
{wandExtra} {wandExtra}
<Figur pose={lulu.pose} x={luluX} y={BODEN - 6} drehung={luluDreh} stauchY={luluStauch} filter={hell < 1 ? `brightness(${hell})` : undefined} /> <Figur pose={lulu.pose} x={luluX} y={BODEN - 6} drehung={luluDreh} stauchY={luluStauch} filter={hell < 1 ? `brightness(${hell})` : undefined} />
<Figur pose={noa.pose} x={noaX} y={BODEN} stauchY={atmen(f, 2)} /> <Figur pose={noa.pose} x={noaX} y={BODEN} stauchY={atmen(f, 2)} />