youtube/remotion/src/szenen/DrachenschnurTest.tsx
Lara bc807312a1 Drachen für „Lulu und der Drachen“: roter Papierdrachen mit Schwanz und drei Schleifen
- baukasten/drachen.tsx: <Drachen> als SVG (Raute mit Holzkreuz, leichter
  Stift-Rand), Schwanz mit wandernder Welle, weht mit `schwanz` zur Seite,
  liegt im Gras flach (`liegt`) und knickt an der Graskante um (`boden`);
  Schleifen gelb, grün, blau leuchten einzeln (`leuchten`, zum Zählen)
- drachenHalt(): Knotenpunkt für die Drachenschnur, dreht mit
- Flugbahnen: pendeln, steigen (auch aus dem Gras), trudeln (zwei Runden ins
  Gras), plumps (Windstoß hebt ihn kurz an); LIEGE_HOEHE für den liegenden
  Drachen
- DrachenschnurTest zeigt die ganze Folge (14 s) mit Noa und Schnur

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 11:08:53 +01:00

43 lines
1.9 KiB
TypeScript

import React from 'react';
import {AbsoluteFill, interpolate, useCurrentFrame} from 'remotion';
import {Figur, NOA_HOEHE} from '../baukasten/figur';
import {Drachen, type DrachenLage, LIEGE_HOEHE, drachenHalt, pendeln, plumps, steigen, trudeln} from '../baukasten/drachen';
import {Drachenschnur, spulenPunkt} from '../baukasten/drachenschnur';
// Prüfszene Drachen (14 s): Noa hält die Spule; der Drachen liegt im Gras, plumpst,
// steigt, tanzt, trudelt zurück. Oben links ein zweiter Drachen zum Zählen der Schleifen.
const BODEN = 900;
const klemm = {extrapolateLeft: 'clamp', extrapolateRight: 'clamp'} as const;
export const DrachenschnurTest: React.FC = () => {
const f = useCurrentFrame();
const noa = {x: 420, y: BODEN, hoehe: NOA_HOEHE};
const himmel = {x: 1150, y: 230};
let lage: DrachenLage;
if (f < 100) lage = plumps(f, 30, 60, 980, BODEN);
else if (f < 300) lage = steigen(f, 100, 120, {x: 980, y: BODEN - LIEGE_HOEHE}, himmel, 90);
else {
const ab = pendeln(300, himmel);
lage = trudeln(f, 300, 80, ab, BODEN);
}
// Wind von links: Schwanz weht nach rechts, am Boden kaum
const schwanz = interpolate(lage.y, [300, BODEN - 120], [30, 5], klemm);
// Zählen: Schleifen leuchten nacheinander auf
const zaehl = (i: number) => interpolate(f % 120, [i * 30 + 10, i * 30 + 18, i * 30 + 34, i * 30 + 44], [0, 1, 1, 0], klemm);
return (
<AbsoluteFill style={{background: '#f4ead8'}}>
<div style={{position: 'absolute', left: 0, top: BODEN - 10, width: 1920, height: 200, background: '#a9c27a'}} />
<Drachen x={260} y={260} s={1.3} leuchten={[zaehl(0), zaehl(1), zaehl(2)]} schwanz={8} flattern={8} />
<Figur pose="noa_A_drachenschnur" {...noa} />
<Drachen {...lage} schwanz={schwanz} flattern={lage.liegt ? 0 : 14} boden={BODEN} />
<Drachenschnur
von={spulenPunkt(noa.x, noa.y, noa.hoehe)}
nach={drachenHalt(lage.x, lage.y, 1, lage.drehung)}
durchhang={lage.y > BODEN - 200 ? 0.12 : 0.05}
/>
</AbsoluteFill>
);
};