Pin-Spin-Spiel
Schieße Nadeln in eine rotierende Scheibe, ohne andere Nadeln zu treffen — 10 Level mit steigender Geschwindigkeit
Was ist das Pin-Spin-Spiel?
Pin Spin ist ein lockeres Browserspiel aus der gleichen Familie wie die Mobil-Hits AA und Pin Out. In der Bildschirmmitte rotiert eine weiße Scheibe mit konstanter Geschwindigkeit. Du schießt von unten Nadel für Nadel ab, und jede Nadel muss in der Scheibe stecken bleiben, ohne eine bereits steckende Nadel zu treffen. Jedes Level gibt dir eine feste Anzahl Nadeln; setze sie alle, um ins nächste Level zu kommen. Eine einzige Kollision beendet die Runde sofort. Die Regeln sind in Sekunden erklärt, aber die Schwierigkeitskurve macht daraus schnell eine harte Prüfung von Timing und Selbstbeherrschung. Das Tool läuft komplett im Browser, ohne Anmeldung und ohne Download — am Desktop mit der Maus klicken, am Smartphone den Bildschirm antippen.
So geht's
Ablauf
- Beim Öffnen der Seite startet das Spiel automatisch in Level 1, die Scheibe dreht sich bereits
- Klicke in den Spielbereich (oder drücke Leertaste / Eingabetaste), um eine Nadel abzuschießen
- Die Nadel fliegt zur Mitte und steckt sich in die Scheibe — sie darf keine bereits steckende Nadel treffen
- Setze alle Nadeln des Levels sauber, um ins nächste Level zu wechseln
- Jede Kollision beendet die Runde — wähle „Level wiederholen“ oder „Neu starten“, um weiterzuspielen (Hinweis: Leertaste / Eingabetaste auf dem Game-Over-Bildschirm löst „Neu starten“ aus und schickt dich zurück zu Level 1, nicht „Level wiederholen“ — nutze den Button, wenn du dasselbe Level wiederholen willst)
Tipps zum Bestehen
- Die Scheibe rotiert mit konstanter Geschwindigkeit — Rhythmus zählt mehr als schnelles Klicken; ziel auf die Mittellinie der Lücke.
- Schieße direkt nachdem eine Nachbarnadel vorbeigezogen ist; die Nadel braucht ca. 120 ms Flugzeit, also etwas vorhalten.
- Bis zu 3 Schüsse werden gepuffert und nacheinander abgefeuert; Klicks darüber hinaus werden verworfen, nicht eingereiht — Spam-Klicken bringt also nichts.
- Spätere Level haben sehr enge Lücken und drehen viel schneller; einen riskanten Schuss auszulassen ist besser als eine gierige Kollision.
Schwierigkeit pro Level
- Level 1-3: viele Nadeln, breite Lücken — gut, um in den Rhythmus zu kommen.
- Level 4-7: schon mehr Nadeln auf der Scheibe, du musst die Rotation antizipieren.
- Level 8-10: die Scheibe ist fast voll, jeder Schuss muss präzise getimt sein.
Anwendungsfälle
Technisches Prinzip
Die Hauptschleife wird von requestAnimationFrame angetrieben. Pro Frame wird eine interne rotation um einen festen speed-Wert (Grad pro Frame) erhöht, anschließend wird über alle steckenden Nadeln iteriert und ihr transform auf rotate(baseAngle + rotation) gesetzt. Da transform eine Compositor-Layer-Eigenschaft ist, übergibt der Browser die Drehung an den GPU-Compositor-Thread, ohne Layout oder Paint auszulösen. Selbst das letzte Level mit allen 15 rotierenden Nadeln bleibt so stabil bei 60 fps. Die Kollisionserkennung verwendet einen Ansatz „Winkeldifferenz zu Sehnenlänge“. Jede steckende Nadel wird durch ihren baseAngle im Koordinatensystem der Scheibe dargestellt (ein fester Versatz zur Scheibe, der von der Rotation unbeeinflusst bleibt). Wenn eine abgeschossene Nadel die Mitte erreicht, beträgt ihr Winkel in Weltkoordinaten TARGET_ANGLE = 0, was im Scheibenkoordinatensystem normalizeAngle(0 - rotation) entspricht. Der neue baseAngle wird dann mit jedem vorhandenen baseAngle verglichen: die Winkeldifferenz Δθ wird in die Sehnenlänge 2R·sin(Δθ/2) zwischen den Mittelpunkten der Nadelspitzen-Punkte umgerechnet (R = 111px vom Mittelpunkt jedes Spitzenpunkts zum Scheibenzentrum). Liegt sie unter dem 24px-Schwellwert, gilt der Schuss als Kollision und die Runde endet. Das Schießen wird von einer kleinen State Machine reguliert. shootLocked markiert eine Nadel als „in der Luft“ und verhindert, dass sowohl das transitionend-Event als auch der 180-ms-setTimeout-Fallback denselben Schuss zweimal abrechnen. Die CSS-Transition dauert 120ms; das setTimeout über 180ms ist ein Sicherheitsnetz für den seltenen Fall, dass transitionend nicht ausgelöst wird (etwa wenn das DOM verändert wird, bevor die Transition abgeschlossen ist). pendingShots puffert Klick-Anfragen, die während eines laufenden Fluges eintreffen, mit einem Limit von 3 — Klicks darüber hinaus werden verworfen (nicht eingereiht), so bleibt das Schnellschuss-Gefühl erhalten und es laufen nicht mehrere Nadeln gleichzeitig auf das Zentrum zu. Sowohl Misserfolg als auch Bestehen setzen gameOver auf true: die Hauptschleife läuft weiter, aktualisiert aber rotation nicht mehr und friert die Szene ein. Für die Anzeige hält das Spiel eine feste Designgröße von 420×720 ein. Der äußere Wrapper berechnet aus dem Viewport einen Skalierungsfaktor und wendet ihn per transform: scale an. Die aktuelle Implementierung deckelt die Skalierung bei 1, sodass kleine Viewports proportional verkleinert werden, während Desktop-Viewports die Originalgröße behalten — sie werden nicht vergrößert. So arbeitet die Kollisionserkennung immer im Designkoordinatensystem mit einem einzigen Satz Pixel-Schwellwerten, und das Urteil ist auf jedem Bildschirm identisch.
- Hauptschleife: requestAnimationFrame, pro Frame rotation += speed, alle Nadeln erhalten transform: rotate(baseAngle + rotation).
- GPU-Beschleunigung: Drehung über transform statt left/top, der Compositor des Browsers übernimmt — kein Layout, keine Neuzeichnung.
- Trefferprüfung: 0° in Weltkoordinaten wird per normalizeAngle(0 - rotation) zurück in Scheibenkoordinaten projiziert; die Sehnenlänge 2R·sin(Δθ/2) wird mit einem 24px-Schwellwert verglichen.
- State Machine: shootLocked verhindert doppelte Abrechnung, pendingShots ist auf 3 begrenzt, Überlauf wird verworfen (nicht eingereiht), gameOver friert die Rotation ein.
- Schuss-Abschluss: 120ms CSS-Flug, transitionend als Hauptweg + 180ms-setTimeout als Sicherheitsnetz für den seltenen Fall, dass transitionend nicht feuert.
- Skalierung: festes 420×720-Designsystem; der Wrapper wendet transform: scale je nach Viewport-Größe an, gedeckelt bei 1, sodass Desktops die Originalgröße behalten statt sich zu vergrößern.
- Speicherung: nur das beste geschaffte Level wird in localStorage gespeichert. Es wird nichts hochgeladen, kein Account, keine Bestenliste.
Beispiele
Geschwindigkeit und Nadelzahlen über die 10 Level
Level Start Schüsse Speed (deg/frame)
1 2 8 1.35
2 3 9 1.50
3 3 10 1.65
4 4 11 1.80
5 4 12 2.00
6 5 13 2.20
7 5 14 2.45
8 6 15 2.70
9 7 15 3.00
10 8 15 3.35Eine typische Runde: Scheitern in Level 5
Level 5: 4 Startnadeln, 12 zu schießen.
Schüsse 1-7: sitzen sauber, noch 5 übrig.
Schuss 8: zu früh abgefeuert, bevor die vorherige Nadel saß.
Urteil: neuer baseAngle ist 8° von Schuss 6 entfernt, unter DOT_HIT_DISTANCE.
Ergebnis: Kollision, Runde endet mit „Spiel vorbei!“.
Klicke auf „Level wiederholen“, um Level 5 neu zu starten.Zusammenfassung einer kompletten Runde
Spielzeit: ca. 2 Min 40 Sek
Gesamtschüsse: 117
Niederlagen: 3
Bestes Level: 10
Meldung: „Alle Level geschafft!“; Button zeigt „Nochmal spielen“.
Das beste Level wird in localStorage geschrieben und bleibt nach Seiten-Reload erhalten.Häufige Fragen
Ich habe in eine leere Stelle geklickt — warum habe ich trotzdem verloren?
Die Nadel ist nicht augenblicklich da. Vom Klick bis zum tatsächlichen Kontakt mit der Scheibe vergehen rund 120 ms, und in dieser Zeit dreht sich die Scheibe weiter. War die Lücke beim Klick groß genug, drehte sich aber während des Fluges eine andere Nadel auf die Ziellinie, landet die neue Nadel direkt auf ihr. Die einfache Lösung: erst schießen, wenn eine Lücke gerade die Linie überquert hat, damit die Drehung Platz hat.
Kann ich den Bildschirm gedrückt halten, um Dauerfeuer zu bekommen?
Du kannst schnell klicken, aber die Schussrate ist gedrosselt: kein Schuss verlässt das Rohr, solange der vorherige noch fliegt. Bis zu 3 Klicks während des Fluges werden gepuffert und der Reihe nach abgefeuert; alles darüber wird verworfen, nicht eingereiht. In späteren Leveln ist es besser, das Tempo bewusst zu drosseln und jede Nadel landen zu lassen, statt zu hämmern.
Wie steigt die Schwierigkeit an?
Jedes Level hat eigene Werte für Drehgeschwindigkeit, Startnadeln und nötige Schüsse. Die Geschwindigkeit wächst von 1,35 deg/frame in Level 1 auf 3,35 deg/frame in Level 10 — ungefähr das 2,5-Fache, also nicht ganz das Dreifache. Die Startnadeln steigen von 2 auf 8, die übrigen Lücken werden also enger. In den späten Leveln zählt Geduld mehr als reine Schnelligkeit.
Beginnt man nach einem Misserfolg von vorn oder im selben Level?
Beides ist möglich, aber der Auslöser ist entscheidend. Der Button „Level wiederholen“ startet das Level neu, in dem du gescheitert bist, mit denselben Nadelzahlen und derselben Geschwindigkeit; der Button „Neu starten“ — ebenso wie Leertaste / Eingabetaste auf dem Game-Over-Bildschirm — bringt dich zurück zu Level 1. Es gibt keine Tastenkürzel für „Level wiederholen“; wer reflexartig Leertaste drückt, landet wieder auf Level 1. Dein bestes geschafftes Level bleibt immer in localStorage erhalten.
Warum wirkt der Spielbereich so schmal?
Die Designgröße beträgt 420×720 und entspricht einem Smartphone im Hochformat. Auf dem Handy wird daraus natürlich Vollbild; auf dem Desktop skaliert der Wrapper proportional, aber die Skalierung ist bei 1 gedeckelt, sodass ein großes Desktop-Fenster das Spiel nicht über 420×720 hinaus vergrößert. Die Spiellogik ändert sich mit der Fenstergröße nicht.
Werden Daten an einen Server gesendet?
Nein. Das gesamte Spiel läuft lokal im Browser. Gespeichert wird einzig eine Zahl — dein bestes geschafftes Level — in localStorage. Site-Daten löschen oder Browser wechseln und sie ist weg. Es gibt keine Bestenliste und keine Score- oder Eingabe-Erfassung auf unserer Seite.
Worauf sollte ich auf dem Smartphone achten?
Aktiviere den Vollbildmodus deines Browsers, damit die Wisch-nach-unten-Geste keine Seiten-Aktualisierung auslöst. Querformat funktioniert, das ursprüngliche Hochformat fühlt sich aber natürlicher an. Falls auf schwächeren Geräten gelegentlich Frames fallen, schließe andere Tabs oder schwere Animationen — das Spiel selbst aktualisiert pro Frame nur ein paar transform-Berechnungen, die Last auf dem Gerät bleibt minimal.