import React from 'react'; import {Figur, NOA_HOEHE, type Posenfolge} from '../baukasten/figur'; import {FIGUREN} from '../baukasten/posen'; import {punkt} from '../baukasten/helfer'; import {BODEN, Ort} from '../baukasten/orte'; // Bildteile für Folge 8 „Noas Laterne“: Abendgarten mit Hauswand, die gebastelte Laterne, // Schatten an der Wand und Hand-Schatten. Alles in Szenenkoordinaten (1920 × 1080). // Hauswand rechts im Garten (Szene 3) bzw. als ganzer Hintergrund an der Wand (Szene 4–7) export const WAND = {x0: 1060, x1: 1980, oben: 170, unten: BODEN - 30}; export const FENSTER = {x: 1180, y: 280, b: 230, h: 210}; // Abendgarten in der „blauen Stunde“: Nachtgarten aufgehellt, damit es freundlich und nicht unheimlich wirkt export const GartenAbend: React.FC<{wandVoll?: boolean; papaWinkt?: number}> = ({wandVoll = false, papaWinkt = 0}) => { const x0 = wandVoll ? -60 : WAND.x0; const oben = wandVoll ? 70 : WAND.oben; return ( <>
{/* Wand mit Dachkante und Sockel */} {!wandVoll && } {!wandVoll && ( <> {/* erleuchtetes Fenster mit Papa als Umriss */} {/* winkender Arm */} )} {/* Haken für die Laterne (Szene 8) */} ); }; export const HAKEN = {x: FENSTER.x + FENSTER.b + 66, y: FENSTER.y + 62}; export const WAND_VOLL = {...WAND, x0: -60, oben: 70}; // an der Wand (Szene 4–7): höher, damit ganze Schatten draufpassen // Die gebastelte Laterne: gelbes Papier, fünf Glitzersterne, ein Papier-Igel, innen ein Lämpchen. // (x, y) = Mitte; sterne = wie viele schon aufgeklebt sind; igel 0–1; licht 0–1. const STERNE: [number, number][] = [ [-34, -28], [22, -40], [40, 6], [-6, 30], [-44, 18], ]; const Stern: React.FC<{x: number; y: number; r: number; glanz: number}> = ({x, y, r, glanz}) => { const pkt = new Array(10) .fill(0) .map((_, i) => { const w = (Math.PI / 5) * i - Math.PI / 2; const rr = i % 2 ? r * 0.45 : r; return `${x + Math.cos(w) * rr},${y + Math.sin(w) * rr}`; }) .join(' '); return 0.5 ? '#fff6c2' : '#f2c84b'} stroke="#c9952a" strokeWidth={1.5} />; }; export const Laterne: React.FC<{x: number; y: number; s?: number; sterne?: number; igel?: number; licht?: number; schwung?: number; stab?: boolean}> = ({ x, y, s = 1, sterne = 5, igel = 1, licht = 0, schwung = 0, stab = true, }) => (
{licht > 0 && (
)} 0 ? '#fffbe2' : '#fbe79a'} /> 0 ? '#ffd65c' : '#f2cf5c'} /> 0 ? '#f0a531' : '#d9b03e'} /> {stab && } {[-0.62, -0.2, 0.2, 0.62].map((k) => ( ))} {STERNE.slice(0, sterne).map(([sx, sy], i) => ( ))} {igel > 0 && ( {[-14, -8, -2, 4, 10].map((dx) => ( ))} )}
); // Weicher Schatten einer Figur an der Wand. Er steht hinter der Figur, ist um `k` vergrößert und // liegt vom Licht weg verschoben (`versatz`: Anteil des Abstands Licht–Figur); je näher die Figur am Licht, desto größer (k aus `schattenGroesse`). // Weich, rund und bläulich-dunkel, ohne harten Rand (Drehbuch: groß, aber nicht unheimlich). export const schattenGroesse = (abstand: number) => Math.min(3.2, Math.max(1.05, 1 + 260 / Math.max(60, abstand))); export const WandSchatten: React.FC<{ pose: string | Posenfolge; x: number; // Fußpunkt der Figur licht: {x: number; y: number}; hoehe: number; k: number; wand?: {x0: number; x1: number; oben: number; unten: number}; deckkraft?: number; drehung?: number; stauchY?: number; versatz?: number; }> = ({pose, x, licht, hoehe, k, wand = WAND, deckkraft = 0.42, drehung = 0, stauchY = 1, versatz = 0.35}) => (
); // Hand-Schatten an der Wand: Hase (zwei Ohren) und Igel (Faust mit gespreizten Fingern) export const HandSchatten: React.FC<{art: 'hase' | 'igel'; x: number; y: number; s?: number; deckkraft?: number; wackeln?: number}> = ({art, x, y, s = 1, deckkraft = 0.45, wackeln = 0}) => ( {art === 'hase' ? ( ) : ( {[-70, -35, 0, 35, 70].map((dx, i) => ( ))} )} ); // Wo die Laterne in der Pose noa_A_laterne hängt, und wie groß unsere Laterne sein muss, um die orange // Laterne des Bildes ganz abzudecken (gemessen: 131 × 134 Bildpunkte, Mitte bei 73/423 im Bild, Bild bei 339/156) export const laterneInNoasHand = (noaX: number, noaY = BODEN) => ({ ...punkt('noa', noaX, noaY, 339 + 73.5, 156 + 423), s: (1.2 * NOA_HOEHE) / FIGUREN.noa.refHoehe, }); // Abend-Dämmerung über der ganzen Szene, aufgehellt um die Laterne (warmes Licht, Rest bläulich) export const Abenddunkel: React.FC<{licht: {x: number; y: number}; staerke?: number; radius?: number}> = ({licht, staerke = 0.4, radius = 500}) => (
);