Autor Beitrag
Horschdware
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: Do 25.11.10 15:44 
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
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Do 25.11.10 17:25 
Hallo Horschware,

ich kann dir eine Delphi-Lösung empfehlen: Andorra 2D. Ich habe selbst schon viel damit gemacht und kann dir diese Engine daher nur empfehlen. Sie ist zwar etwas alt, dennoch aber einfach und übersichtlich gehalten, für 2D Spiele ideal.

user profile iconHorschdware hat folgendes geschrieben Zum zitierten Posting springen:
Ist es überhaupt "sinnvoll" mit PNG zu arbeiten?

Ich verwende Bitmaps, aber nur aus Kompatibilitätsgründen.

user profile iconHorschdware hat folgendes geschrieben Zum zitierten Posting springen:
Wie würde man so etwas schöner realisieren, insbesondere im Hinblick auf eine ordentliche Grafikengine?

Dafür gibt es ein Tutorial

user profile iconHorschdware hat folgendes geschrieben Zum zitierten Posting springen:
Events direkt von den Einheiten aus?

Mit Andorra gibt es Sprites. Es gibt da auch eine Methode, das Sprite unter der Maus zu erfassen, aber ich finde das gerade nicht...

user profile iconHorschdware hat folgendes geschrieben Zum zitierten Posting springen:
Auch im Hinblick auf Performance.

Verwende für Andorra 2D die Timer-Methode ;)

Ich kann dir nicht sagen, wie das für den CBuilder aussieht, kenne mich zu wenig mit C++ aus. Allerdings ist Delphi für ein solches Spiel eigentlich gut geeignet. Da baust du dann noch eine gute Spieleklasse drum, packst das auf die Form und fertig. Später kannst du das Spiel (bei guter Doku) immer noch in C++ schreiben.

Viele Grüße
Regan
smt
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 45



BeitragVerfasst: Do 25.11.10 18:31 
Ich persönlich finde auch diese Gameengine sehr gut. afterwarp.net/

VG Sascha