Hallo zusammen,
ich habe vor Kurzem ein altes Projekt von mir wiederentdeckt, das ich während meiner Berufsschulzeit angefangen hatte.
Es geht um ein rundenbasiertes Strategiespiel, das sich rund um eine alte Spielzeugserie dreht.
Eines vorweg: Das Spiel wurde vor Jahren mit dem Borland CBuilder 5 oder 6 geschrieben und läuft an sich. Mir geht es hier in diesem Thread um Optimierung / neue Sichtweisen / Ideen. Da ich seit langem schon nichts mehr mit Delphi und C++ am Hut habe sondern eher im SAP Bereich unterwegs bin, stehe ich gerade ein Bisschen hilflos da und wäre für ein paar gute Ratschläge echt dankbar. Ich weiss, dass das hier kein CBuilder Forum ist, habe hier aber immer wieder gute Ideen und Hilfe gefunden - daher mein Beitrag hier.
Wie gesagt, das Spiel funktioniert. Leider ist die Performance katastrophal und der Stil mehr als schlecht. Von vorne:
Das Spiel wird direkt auf Canvas gezeichnet. In einem Buffer baue ich die einzelnen Elemente Zusammen. Erst das Terrain, dann Bäume und Landschaftsdetails, dann Einheiten, dann Overlays wie Healthbar. Zum Schluss das UI drum und die gepufferte Zeichnung direkt aufs Formular (genauer: ein TImage auf dem Formular) zeichnen. Das ist natürlich sehr unperformant. Ich habe von der SDL gehört. Würde die sich hier eignen? Wie funktioniert das dann überhaupt?
Die Einheiten und Bäume sind als PNG Grafiken vorhanden - wegen dem mehrbittigen Alphakanal. Dafür hatte ich damals extra eine (leider auch unperformante) Komponente für PNG Grafiken verwendet. Ist es überhaupt "sinnvoll" mit PNG zu arbeiten? Was gäbe es an Alternativen?
Da das Spiel natürlich nicht nur aus dem eigentlichen Spielbildschirm, sondern auch aus Menüs und derartigem besteht, habe ich damals mehrere Formulare genutzt. Wechselt man z.B. aus dem Hauptmenü in die Kartenauswahl, so schliesst sich das Formular des Hauptmenüs und es öffnet sich ein neues Fenster. Das finde ich unschön. Wie würde man so etwas schöner realisieren, insbesondere im Hinblick auf eine ordentliche Grafikengine?
Im eigentlichen Spiel musste ich logischerweise erkennen, was sich unter dem Mauszeiger befindet und die Möglichkeit des Klickens einbauen. Klickt man an einen Punkt, so durchsucht das Programm ein Array of TSCUnit, ob sich an der geklickten Position eine Einheit befindet. Das Klickevent greife ich dabei von der TImage Komponente ab, die sich über das ganze Formular legt. Ist das eine sinnvolle Vorgehensweise oder wäre es empfehlenswert, einen anderen Weg zu gehen? Events direkt von den Einheiten aus?
Tastatureingaben werden ebenfalls direkt vom OnKeyDown abgefangen. Hat natürlich das Problem, dass man beim Scrollen einen "Hopser" drin hat, je nachdem wie schnell die Anschlagverzögerung eingestellt ist. Wie könnte man das umgehen? Unter Delphi gibt es doch DelphiX, das eine entsprechende DirectInput-Komponente hat. Gibt es so etwas auch für den CBuilder?
Eine Frage, die mir gerade beim Schreiben dieses Beitrags gekommen ist:
Das Spiel findet auf einem Raster statt, bei dem jede Zelle 40x40 Pixel groß ist. Es gibt nun Einheiten, die 40x40 groß sein, andere 80x80 (sprich: Größe 1; Größe 2).
Die Bewegung und Anklickbarkeit einer Einheit der Größe 1 ist trivial: Da sie genau ein Feld belegt muss nur geprüft werden, ob sich auf dem Feld auf welches geklickt wurde eine Einheit befindet und auf dem Zielfeld ebenso.
Bei einer Größe 2 Einheit ist das schwieriger. Während das Anklicken einfach ist, ist das Finden eines freien Ziels schwieriger, da bei meiner Logik immer das obere linke Feld Ziel ist. Siehe Screenshot, das macht es vllt verständlicher.
Wie könnte man das hier eleganter gestalten?
Wie gesagt, über ein paar intelligente Worte wäre ich dankbar. Ich habe vor, das Spiel demnächst neu zu starten und diesmal "sauber" zu programmieren. Auch im Hinblick auf Performance.
Danke schon mal fürs Durchlesen und für die (hoffentlich) zahlreichen Antworten.
MfG
Stefan
Einloggen, um Attachments anzusehen!
_________________
Delphi: XE - OS: Windows 7 Professional x64