Invasoren und Schafschiesser sehen aus wie Konstruktionszeichnungen, aber darunter läuft eine vollständige Flipper-Simulation: rund 750 Zeilen Vanilla-JavaScript pro Tisch, ohne Physik-Engine, ohne Framework, ohne Build-Schritt. Dieser Artikel zeigt, wie sie funktioniert – und warum sie mit 960 Schritten pro Sekunde rechnet.
Warum 960 Hz?
Die Kugel hat einen Radius von 12,5 Einheiten und darf bis zu 2 800 Einheiten pro Sekunde schnell werden. Bei einem Bildschirm mit 60 Hz legt sie pro Bild rund 47 Einheiten zurück – fast zwei Kugeldurchmesser. Ein dünner Pfosten oder die Spitze eines Flippers kann dabei einfach übersprungen werden, der klassische Tunneling-Fehler.
Deshalb ist die Physik vom Zeichnen entkoppelt. Jeder Frame füllt einen Zeitakku, und daraus werden feste Schritte von 1/960 s abgearbeitet. Pro Schritt bewegt sich die Kugel höchstens knapp 3 Einheiten, deutlich weniger als ihr Radius. Das Ergebnis ist unabhängig davon, ob der Monitor mit 60, 120 oder 144 Hz läuft.
var acc = 0, STEP = 1 / 960;
function frame(now) {
var dt = Math.min(0.05, (now - last) / 1000); last = now;
acc += dt;
while (acc >= STEP) { step(STEP); acc -= STEP; }
draw();
requestAnimationFrame(frame);
}
Die Kugel: Hangabtrieb statt Schwerkraft
Ein Flipper ist um etwa 6,5 Grad geneigt. Auf die Kugel wirkt daher nicht die volle Erdbeschleunigung, sondern nur der Hangabtrieb entlang der Spielfläche – im Modell 1 150 Einheiten/s². Dazu kommt eine leichte Rolldämpfung und eine Geschwindigkeitsgrenze. Liegt die Kugel fast still, bekommt sie einen winzigen Zufallsimpuls, damit sie auf keiner Kante für immer balanciert.
Wände, Pfosten, Bumper
Jede Linie der Zeichnung ist ein Segment, jeder Pfosten ein Kreis. Pro Schritt wird für jedes Element der nächstgelegene Punkt zur Kugel bestimmt. Ist der Abstand kleiner als der Radius, wird die Kugel entlang der Normalen herausgeschoben und die Normalkomponente ihrer Geschwindigkeit mit einem Stoßfaktor gespiegelt – 0,42 für Wände. Schleudern und Pop-Bumper geben zusätzlich einen aktiven Impuls von 560 bis 620 Einheiten/s: Das ist die Spule, die im echten Automaten zuschlägt.
Der Flipper als konische Kapsel
Der Flipper ist eine Kapsel: eine Achse vom Drehpunkt zur Spitze, deren Radius von r₀ auf r₁ abnimmt. Die Kollision funktioniert wie bei einer Wand, mit einem entscheidenden Unterschied: Der Flipper bewegt sich. Am Kontaktpunkt hat seine Oberfläche die Geschwindigkeit ω × r – je weiter außen die Kugel getroffen wird, desto schneller. Gerechnet wird deshalb mit der Relativgeschwindigkeit zwischen Kugel und Oberfläche.
function collideFlipper(b, f) {
var tx = f.x + f.len * Math.cos(f.a), ty = f.y + f.len * Math.sin(f.a);
var q = closest(f.x, f.y, tx, ty, b.x, b.y); // nächster Punkt auf der Achse
var rr = f.r0 + (f.r1 - f.r0) * q[2]; // Radius an dieser Stelle
var dx = b.x - q[0], dy = b.y - q[1], dist = Math.hypot(dx, dy), lim = R + rr;
if (dist >= lim || dist === 0) return;
var nx = dx / dist, ny = dy / dist;
b.x += nx * (lim - dist); b.y += ny * (lim - dist); // Kugel herausschieben
var cx = q[0] + nx * rr - f.x, cy = q[1] + ny * rr - f.y;
var sx = -f.w * cy, sy = f.w * cx; // Oberflächengeschwindigkeit ω × r
var rvx = b.vx - sx, rvy = b.vy - sy, vn = rvx * nx + rvy * ny;
if (vn < 0) { // nur bei Annäherung
var e = Math.abs(f.w) > 1 ? 0.55 : 0.25; // schlagend federnd, ruhend dämpfend
b.vx -= (1 + e) * vn * nx; b.vy -= (1 + e) * vn * ny;
}
}
Zwei Details machen das Spielgefühl aus. Erstens der Stoßfaktor: Schlägt der Flipper, federt er mit 0,55; ruht er, dämpft er mit 0,25. Nur so lässt sich die Kugel auffangen und am Flipper halten – die wichtigste Technik für gezielte Schüsse. Zweitens die Reibung: Sie ist absichtlich minimal. Zu viel davon, und die Kugel klebt am Drehpunkt fest; das war tatsächlich ein Fehler einer frühen Version, den Spieler sofort bemerkt haben.
Die gefangene Kugel
Die Clone-Kammer in Invasoren enthält eine zweite Kugel, die nur entlang ihres Kanals rollen kann. Trifft die Spielkugel sie, wird der Impuls entlang der Stoßnormalen aufgeteilt – aber nur der Anteil in Kanalrichtung bewegt die gefangene Kugel. Das ist ein eindimensionaler Stoß mit Zwangsbedingung, und er erzeugt das typische Verhalten: Ein gerader Treffer schickt die Clone-Kugel bis nach oben, ein schräger kaum.
Rütteln und TILT
Rütteln gibt der Kugel einen kleinen Stoß nach oben und zur Seite und füllt eine Tilt-Anzeige, die langsam wieder abklingt. Wer zu oft rüttelt, bekommt TILT: Flipper aus, Bonus verloren – wie am echten Automaten.
Was nicht simuliert wird
Die Kugel dreht sich nicht, es gibt keinen Spin und keine Rampen in der dritten Dimension. Flipper, Schleudern und Bumper schlagen sofort, ohne Spulenverzögerung. Für die Tische von 1979 und 1980 reicht das – dort ist die Mechanik im Wesentlichen zweidimensional.