Adventure mit C++ programmieren - Wie ist der Ablauf?

Der Anlaufpunkt für alle, die selbst ein Adventure programmieren wollen.
Antworten
Benutzeravatar
cr0k3
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 27
Registriert: 06.01.2006, 03:05

Adventure mit C++ programmieren - Wie ist der Ablauf?

Beitrag von cr0k3 »

Hallo,

ich kenne mich einigermaßen mit den Programmiersprachen Java, C und C++ aus, habe allerdings immer nur kleinere Beispiel-Programme programmiert und nie ein größeres Projekt realisiert. Dies möchte ich jetzt tun, um meine Kenntnisse in C++ zu vertiefen (eventuell benötige ich das für meinen späteren Job). Da kommt mir so ein Adventure gerade recht, da es zugleich auch Spaß macht! Die Güte des Adventures spielt dabei für mich weniger eine Rolle als das Vertiefen der Programmiersprache C++ anhand eines spannenden Projekts.

Nun meine Fragen: Wie ist der Ablauf bei der direkten Programmierung eines Adventures? Was wird zuerst programmiert? Was muss ich noch zusätzlich lernen (z. B. Grafikprogrammierung)? Wie geht man am besten Schritt für Schritt vor?

Ich habe schon die Suche bemüht und einige Beiträge zum Thema Adventure-Programmierung gefunden. Allerdings geht es darin meist um die Wahl der Programmiersprache, was mich nicht interessiert - es soll C++ sein. Weiterhin wird meist empfohlen, eine Engine wie AGS, Visionaire, Wintermute usw. zu benutzen, was mich auch nicht interessiert - es geht mir ja darum, C++ zu vertiefen! Es gab zwar hin und wieder einen kleinen Hinweis auf den Ablauf bei der Programmierung, doch aufgrund der Diskussionen drumherum wurde das nie weiter verfolgt.

Daher bitte ich euch, wenn sich jemand damit auskennt, mir ein wenig auf die Sprünge zu helfen, damit ich nicht völlig im Dunkeln tappe. Besonders schön wären Tipps von Leuten, die selbst schon eine Engine programmiert haben.

Vielen Dank für all eure Antworten! Das Forum hier ist echt super!

Schöne Grüße,
cr0k3
Benutzeravatar
john_doe
Logik-Lord
Logik-Lord
Beiträge: 1302
Registriert: 06.05.2001, 20:58

Beitrag von john_doe »

Zuerst solltest du dir natürlich überlegen, was deine Engine alles können soll, bevor du irgendwas programmierst.

1. Welche Grafik-Schnittstelle soll verwendet werden? (D3D/OpenGL für 2D/3D, SDL für 2D usw.). Dazu gehört auch, in welcher Farbtiefe das Spiel nachher laufen soll, und welche Dateiformate unterstützt werden sollen (z.B. PNG, JPG usw.).

2. Wie flexibel soll das Interface sein? (Etwas) einfacher ist es für den Anfang, wenn immer eine Interface-Art (also z.B. die Scumm-Verben oder eine Baphomets Fluch-Steuerung) verwendet wird.

3. Auch wichtig: Welche Art von Pathfinding (also mit der die Figuren herausfinden, wo sie laufen dürfen und welchen Weg sie von A nach B gehen sollen) soll verwendet werden?
Es gibt A* (was z.B. AGS verwendet) und Verfahren, die mit Polygonen arbeiten (Erklärung z.B. http://graphics.cs.ucdavis.edu/~okreylo ... nding.html).

4. Dann natürlich noch, wie die Spiele-Logik realisiert werden soll. Das kann über eine Scriptsprache (wie z.B. Lua, Python, Squirrel, Io) realisiert werden, oder über andere Strukturen (z.B. in Ini-/Xml-Dateien), in denen die Aktionen gespeichert werden (z.B. wie es Visionaire oder AGS im "scriptlosen" Modus machen).
Falls du eine Scriptsprache verwenden willst, würde ich Lua und Squirrel empfehlen, da sie im Vergleich zu den andern beiden recht einfach in eigene Programme einzubinden sind.

5. Dann noch Überlegungen wie z.B. wie die Resourcen des Spiels gespeichert werden, ob sie "offen" im Verzeichnis liegen (für den Anfang ok) oder später in Archivdateien (z.B. Zip) gepspeichert werden.

6. Natürlich noch wissen sollte man, ob die Engine nur für Windows sein soll oder auch unter Linux usw. laufen soll.

Ich würde mir mal die verschiedenen Bibliotheken ansehen, die zur Auswahl stehen, und mich mit denen Vertraut machen und kleinere Testprogramme machen (z.B. erstmal SDL kennen lernen).

Hier noch ein paar Links für den Anfang:

Lua: http://www.lua.org/
Squirrel: http://squirrel-lang.org/
Python: http://www.python.org/
Io: http://www.iolanguage.com/

SDL: http://www.libsdl.org/index.php

A*: http://www.policyalmanac.org/games/aSta ... al_de.html
Save the Cheerleader, save the World!
Benutzeravatar
max_power
Zombiepirat
Zombiepirat
Beiträge: 10065
Registriert: 16.04.2002, 20:30
Wohnort: Uppsala
Kontaktdaten:

Beitrag von max_power »

Während du dich in die genannten technischen Grundlagen einarbeitest, kannst du dir auch überlegen, wie du die Spielstruktur realisieren willst, also wie z.B. ein Raum gespeichert werden soll und wie er sich in das Spiel integriert.
Ich mache mir ab und zu Gedanken, wie ein Klassenmodell eines Adventures aussehen könnte, so etwas in der Art meine ich. Dann weißt du, wenn du richtig loslegen willst, welche Struktur das Ganze am Ende bekommen soll. Dazu könntest du dann in den entsprechenden Klassen die Funktionen zur grafischen Anzeige implementieren.
Wenn du dich vorher mit einfacheren Beispielen in die nötigen Techniken eingearbeitet hast, kannst du den alten Code dafür wieder verwenden – zumindest prinzipiell.
„Es müsste immer Musik da sein, bei allem was du machst. Und wenn's so richtig Scheiße ist, dann ist wenigstens noch die Musik da. Und an der Stelle, wo's am allerschönsten ist, da müsste die Platte springen und du hörst immer nur diesen einen Moment.“ (Floyd, Absolute Giganten)
Benutzeravatar
cr0k3
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 27
Registriert: 06.01.2006, 03:05

Beitrag von cr0k3 »

Vielen Dank erstmal für eure beiden Antworten!

Ich habe jetzt noch weitergehende Fragen: mal angenommen, ich habe mich für alle Features meiner zu programmierenden Engine entschieden und auch ein Klassenmodell meines Adventures erstellt. Womit beginne ich dann beim Programmieren?

Meine Vorstellung wäre so: ich versuche erstmal einen leeren Raum darzustellen, baue dann einen Charakter ein, der sich im Raum bewegen kann, füge Hindernisse in den Raum ein, um die er sich herum bewegen muss, brauche dafür natürlich Pathfinding, füge noch Hotspots ein, die ein Ereignis auslösen, wenn man mit der Maus drüberfährt usw.

Ist die Vorgehensweise ok oder liege ich da komplett falsch? Wie würdet ihr das ganze angehen?

Die nächste Frage wäre: wie sieht's mit den nächsten Räumen aus? Da muss man doch der Engine irgendwie mitteilen, welche Räume nacheinander an die Reihe kommen. Das war bestimmt gemeint mit dem Verweis auf ini- oder xml-Dateien. Aber wie geht man da am besten vor?

Wahrscheinlich seht ihr schon, dass ich da kaum Erfahrung habe. Ich habe zwar gelernt wie man kleinere Probleme mit C++ löst, aber dieses ganze Zusammenspiel ist mir (noch) total fremd!

Ich wäre sehr froh, wenn mir da jemand auf die Spünge helfen könnte! Herzlichen Dank!
Rondo
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 44
Registriert: 06.06.2006, 15:28

Beitrag von Rondo »

Ich würde dir als erstes Versuchen einfach einen Raum darzustellen. Den am besten schon als Klasse. So ungefähr (kenne die C++ syntax nicht genau). Der Vorteil ist du kannst neue Räume einfach erschaffen. Die Befehle stimmen nicht genau du musst selbst nachhschauen wie sie in c++ aussehen.

public class Raum (){

private img Bild;
private String beschr;

public Raum(String paraBildposition, String parabeschr){
bild = getBild(paraBildposition);
beschr = parabeschr;
}

public void Raumanzeigen(Graphic object g){
g.zeigeBild(Bild);
}

}
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Der Hauptpunkt: Du musst Dir Strukturen überlegen, in denen die einzelnen Bestandteile gespeichert werden, und Routinen, um diese zu verwalten.

Fang klein an, am Besten mit dem main-loop der engine.
Pseudocode:

Code: Alles auswählen

grafik und I-O initialisieren
strukturen initialisieren
startraum und startcharakter einlesen
loop {
  darstellung aktualisieren
  eingabe abfragen
  reagieren
}
Mit dem ersten Raum fängst Du genauso ganz klein an, eine simple Textdatei oder ein vergleichbares Format (XML) tuns am Anfang völlig.
z.B.

Code: Alles auswählen

// Raum 1
d:\...\hintergrund.gif
10,130,310,230
Damit legst Du das Hintergrundbild und ein begehbares Rechteck fest.
Genauso verfährst Du mit dem Charakter: lies eine Textdatei ein, die den Startraum, die Startkoordinaten und den Pfad zum Sprite enthält.

Jetzt bringst Du die Engine dazu, den ersten Raum darzustellen, den Charakter anzeigen zu lassen und ihn nach einem Mausklick zu bewegen.

Wenn das hinhaut, baust Du die Engine und die Definitionsfiles sowie die Methoden, die diese lesen, immer weiter aus.

Bau nicht zu viel auf einmal ein, immer Schritt für Schritt.
Use gopher repellent on funny little man
hansa_export
Süßwasserpirat
Süßwasserpirat
Beiträge: 314
Registriert: 17.02.2005, 15:46

Beitrag von hansa_export »

Mal eine Frage nebenbei, wer hat sich denn schonmal dran gesetzt und einen eigene Engine geschrieben?

mfg hansa :)
Zuletzt geändert von hansa_export am 27.09.2006, 18:32, insgesamt 1-mal geändert.
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Na, Martin Lassahn und Lebostein, oder?
Von Ersterem hört man gar nichts mehr, und Lebostein schaut auch nur recht selten hier herein.
Use gopher repellent on funny little man
BLINX123
Tastatursteuerer
Tastatursteuerer
Beiträge: 675
Registriert: 11.09.2005, 15:47

Beitrag von BLINX123 »

Ich hab auch schon mal ne Adventure Engine in Qbasic geschrieben. Hab ich allerdings abbrechen müssen. Lief instabil und die Speicherauslastung hat nicht funktioniert. Da ich das Problem allerdings durch externe Librarys lösen könnte mache ich vielleicht bald wieder weiter.
Benutzeravatar
max_power
Zombiepirat
Zombiepirat
Beiträge: 10065
Registriert: 16.04.2002, 20:30
Wohnort: Uppsala
Kontaktdaten:

Beitrag von max_power »

cr0k3 hat geschrieben:Ist die Vorgehensweise ok oder liege ich da komplett falsch? Wie würdet ihr das ganze angehen?
Ich denke nicht, dass du komplett falsch liegen kannst. Es sind bestimmt verschiedene Herangehensweisen möglich. Ich habe noch nie eine Engine programmiert, sondern mir nur Gedanken darüber gemacht.
Beginnen würde ich mit der grafischen Darstellung eines Raums, da ich das für einen der einfachsten Punkte halte. Dann würde ich Objekte einfügen und Interaktionsmöglichkeiten einbauen. Die Figur würde ich erst später einsetzen, da es für mich zu den schwierigeren Dingen gehört.
„Es müsste immer Musik da sein, bei allem was du machst. Und wenn's so richtig Scheiße ist, dann ist wenigstens noch die Musik da. Und an der Stelle, wo's am allerschönsten ist, da müsste die Platte springen und du hörst immer nur diesen einen Moment.“ (Floyd, Absolute Giganten)
Benutzeravatar
cr0k3
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 27
Registriert: 06.01.2006, 03:05

Beitrag von cr0k3 »

Ja, dann sag ich doch erstmal: Dankeschön für all eure Antworten! Das hilft mir schon mal sehr weiter! Ich denke, am Anfang ist es immer schwer und je mehr Erfahrung man sammelt, desto einleuchtender wird das Ganze!

Ich beschäftige mich zur Zeit mit SDL und finde es ziemlich cool! Ich mache langsam kleine Fortschritte und bin optimistisch, dass ich weiter vorankomme mit meiner Engine. Es wird natürlich sehr, sehr lange dauern, aber das macht überhaupt nix! Mir geht es ja hauptsächlich um die Programmierung mit C++...

Wenn jemand noch weitere Tipps hat, immer her damit! Zu viel wissen kann man gar nicht...

Schöne Grüße,
cr0k3
Benutzeravatar
max_power
Zombiepirat
Zombiepirat
Beiträge: 10065
Registriert: 16.04.2002, 20:30
Wohnort: Uppsala
Kontaktdaten:

Beitrag von max_power »

Kannst ja mal von Zeit zu Zeit schreiben, was dir so widerfahren ist.
„Es müsste immer Musik da sein, bei allem was du machst. Und wenn's so richtig Scheiße ist, dann ist wenigstens noch die Musik da. Und an der Stelle, wo's am allerschönsten ist, da müsste die Platte springen und du hörst immer nur diesen einen Moment.“ (Floyd, Absolute Giganten)
Benutzeravatar
cr0k3
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 27
Registriert: 06.01.2006, 03:05

Beitrag von cr0k3 »

Mach ich!
Antworten