Schlagwort-Archive: Punkte

Das erste Update im neuen Jahr zum aktuellen Entwicklungsfortschritt meiner SPACOLA-Neuimplementation. Im Moment habe ich einen guten Lauf und kann fast täglich immer mal wieder ein bisschen an meinem kleinen Spielewerk arbeiten. Das muss genutzt werden, solange es noch anhält, denn so wie ich mich kenne, wird das nämlich die letzte Meldung in der kommenden Zeit sein. Die neueste WIP-Version enthält rund 50 Änderungen. Eigentlich hätten es noch einige mehr sein müssen, denn meine ToDo-Liste quillt inzwischen über, doch letzten Endes muss man irgendwann mal einen Cut machen. Hier also das Ergebnis der letzten Tage in visueller Form:

spacolaeclipse022

Richtig erkannt. Das HUD auf der rechten Seite ist komplett fertig und dort gibt es so einige Informationen abzulesen. Soweit möglich, habe ich alles wie im Original beibehalten. Was rausgeflogen ist, ist die Angabe zur Buchseite, der Galaxie und des Sonnensystems, denn diese Angaben werden künftig nicht mehr nötig sein. Dafür ist eine neue Anzeige hinzugekommen, die dem Spieler den Weg weist. Also genau das, was er vorher aus dem Buch ablesen musste. Entsprechend habe ich mir die Freiheit genommen, die Symbole in der Anzeige etwas anzupassen, um diesen Umstand hervorzuheben.

Eine weitere große Baustelle ist somit endlich abgeschlossen. Ein wichtiger Stützpfeiler des Original-Spielegrundgerüsts ist in langwieriger Handarbeit aufgestellt worden. Man fühlt sich manchmal wie eine Art Restaurateur für antike Uhren oder sowas. Pixel für Pixel muss das Original fein säuberlich zerlegt und untersucht und dann im Remake detailgetreu nachgebildet werden. Am Gameplay hat sich freilich wieder einmal wenig getan, denn darum werde ich mich wahrscheinlich erst kümmern, wenn alle übrigen Grundfunktionen von SPACOLA übertragen sind.

Außerdem hinzugekommen ist ein deutlich umfangreicheres und besseres Logging mit Logdatei, es gibt Statusmeldungen (z.B. für Schilde, Highscore und die diversen Geschwindigkeitslevels), es gibt Punkte für zerstörte Gegner sowie einen richtigen Punktestand. Entsprechend habe ich die Fake-Highscore-Liste durch eine richtige Highscore ersetzt, die nun dynamisch im Spiel generiert und verändert werden kann. Die Introschleife arbeitet nun korrekt und exakt so wie im Original. Zuvor wurde das Intro einfach immer wieder von vorne abgespielt. Es gibt jetzt Events, z.B. Extraleben, neuer Highscore, oder die Shield-Shutdown-Warnung. Zuletzt habe ich den Algorithmus für den Wurmloch-Effekt (Level-Intro), den ich mir damals selbst ausgedacht habe, durch einen mathematisch „korrekteren“ Algorithmus ersetzt, der auch viel einfacher funktioniert (Stichwort: logarithmische Spirale). Thank you internets!

58 Klassendateien, 9 Pakete, über 6100 Nettocodezeilen (SLOC), 574 Funktionen, 146 Bilddateien, 24 Audiodateien, zusammengepackt in ein 4,0 MB Archiv. So langsam nimmt das kleine Spaßprojekt, das ich angefangen habe ohne zu wissen, ob ich morgen überhaupt noch darauf Lust habe, fast schon Ausmaße an, die einen Rückzieher unmöglich machen. Es wäre inzwischen irgendwie zu schade, wenn ich das Projekt nun nicht zuende führen würde. Was als ödes Fenster mit einem Sprite in der Mitte und ein paar Pixelsternen außenrum begonnen hat, hat sich zu etwas entwickelt, was sich schon ein bisschen wie SPACOLA auf dem Atari ST spielt.

Aus der Kategorie „zu doof für Mathematik, aber intelligent genug um sich trotzdem was einfallen zu lassen“: Heute habe ich mir mal wieder ausgiebig meinen alten Quellcode für meine Spacola-Maussteuerung vom August 2010 angesehen und mich daher auch mal wieder ein bisschen mit den mathematischen Grundlagen (Trigonometrie und Vektorarithmetik) auseinandergesetzt. Ein wenig Schmunzeln musste ich über meine unkonventionelle Lösung eines alten Problems, das ich damals hatte.

Man nehme einen Mauszeiger, der irgendwo in einem karthesischen Koordinatensystem liegt. Nun musste ich herausfinden, welchen Winkel der Richtungsvektor Ursprung->Mauszeiger mit der Y-Achse einschließt. Da ich selten mit der Mathematik einer Meinung war, aber dafür umso mehr gewillt, diese Aufgabe von alleine zu lösen, nahm ich mir seinerzeit Papier und Bleistift zur Hand und fing damit an, mir eine Lösung zu überlegen. Und ich fand einen Algorithmus, mit dem ich den Winkel näherungsweise bestimmen konnte.

Aber zunächst zur idealen und simpelsten Lösung:

Man benötigt im Prinzip nur Delta X und Delta Y zwischen den beiden Punkten, also den Ortsvektor. Anschließend teilt man Delta Y durch den Betrag des Vektors und berechnet aus diesem Wert den Arkus-Kosinus. Das Ergebnis muss dann noch mit 360 multipliziert und wieder durch 2 Pi geteilt werden. Schnell und effizient. Ich bin kein Mathegott, aber ein paar Minuten Suchen hat mich auf die richtige Lösung gebracht.

Witzig fand ich dagegen meinen Algorithmus, der folgendermaßen aussieht:

Ich habe beliebig viele Punkte (im Extremfall 360 Stück, in meinem Fall aber nur 40) auf einem Einheitkreis um den Mittelpunkt generiert und von jedem dieser gedachten Punkte den Abstand zur Mauszeigerkoordinate bestimmt. Mein gedanklicher Ansatz war der, dass der Punkt, der den kürzesten Abstand zur Zielkoordinate hat, mehr oder weniger exakt denselben Winkel zur Y-Achse hat. Mit dem Vorteil, dass ich dessen Winkel (da selbst generiert) genau kannte. Anschließend habe ich noch eine merkwürdige Umrechnung vom Bogenmaß ins Gradmaß durchgeführt. Das Ergebnis war zufriedenstellend.

Für letzteres Codebeispiel schlagt mich bitte nicht. Ich wusste damals schon, dass das nur ein Provisorium ist. Ich weiß noch nicht einmal mehr wofür „targetCnt“ steht.

Zugegeben, meine Lösung ist extrem unperformant und relativ ungenau, aber nichts stärkt das Ego mehr als die Gewissheit, ein Problem selbst und ohne Hilfe bewältigt zu haben, wenn man es sich vorher nicht zugetraut hätte. Wie dem auch sei, heute habe ich meinen provisorischen Algorithmus abgelöst und durch die exakte Berechnung ersetzt.