Der beste Weg zum Spieleprogrammieren



  • Ich bin so langsam am verzweifeln, da ich nicht mehr weiß was ich lernen soll 😞 .
    Ich hab mir Tutorials durchgelesen und kleine Programme geschrieben, in denen ich mein 'C++-Wissen' gebündelt habe.
    Beispielsweise kann ich jetzt gut(meiner meinung nach 😉 ) mit Variablen umgehen(liegt aber eventuell auch daran das ich vorher viel im 'Game Maker' mit variablen gearbeitet hab), wüsste aber nicht wie ich damit sinnvoll in einem 'C++-Spiel' umgehen sollte.
    Allerdings komme ich ja noch nicht einmal dazu darüber nachzugrübeln, da ich das Fenster für das Spiel(wahrscheinlich eine Kleinigkeit) nicht öffnen/kreieren/erstellen kann. Ich hab zwar schon gesehen wie der Code dazu aussieht, aber keine passende Erklärung zu den einzelnen Befehlen finden können(und einfach abschreiben will ich da nicht, ich will das selbstständig könnenund und wissen was ich da 'hinprojeziert' hab).
    Fals mein Ziel ein 'Star-Defender' zu programmieren zu hoch ist wär ich über einen anderen Vorschlag erfreut(mit 'Star-Defender' meine ich soetwas: http://upload.wikimedia.org/wikipedia/en/2/20/SpaceInvaders-Gameplay.gif). So ein Spiel war auch im 'Game Maker' mein erstes Spiel und auch recht erfolgreich(zumindest für mich 🙂 ).
    Desweiteren weiß ich nicht ob bzw. welches Buch ich mir zulegen sollte und ob die Bücher extra für Spieleprogrammierer z.B. 'C++ für Spieleprogrammierer' empfehlenswert sind oder 'nur' Geldmacherei?

    Weiterhin danke für jede Hilfe.

    -Skotchy


  • Mod

    macht euch das leben nicht unnoetig schwer, besonders am fang. Ihr koennt nicht erst alles lernen was man lernen muss bevor ihr anfang ein spiel zu machen. Auch AAA super pro entwickler wissen nicht alles, das themengebiet ist viel zu umfangreich, kaum jemand kann details zu soft body physics, inverse kinematics, indexed lighting, navigation mesh und udp synchronization gleichzeitig wissen.

    gerade so bullshit wie fenster erstellen, last es sein am anfang. das macht euer spiel nicht ein micron besser ob ihr das fertig nehmt oder selbst ueber wochen ausarbeitet.
    natuerlich ist wissen etwas wertvolles, aber waehrend man sich mit so BS aufhaellt, entgeht einem viel wichtigereres wissen.

    Eine qualitaet eines guten programmierer ist, dass man mit dem effektivsten weg zum ziel kommt, variablen hinschreiben und schleifen formulieren ist da eher wie geradeaus gucken, das sollte man koennen, aber es ist nur ein werkzeug, kein skill.

    deswegen, schreib ein spiel, nimm http://code.google.com/p/pixeltoaster/ da sind example enthalten wie du in wenigen zeilen ein fenster aufmachst, ein bild ausgibst, die maus benutzt (notfalls kannst du hier fragen). ich programmiere dir damit ind er selben zeit ein "Star-Defender" spiel hin wie es mich kosten wuerde ein gutes window handling unter windows hinzuschreiben. bei dir ist es vielleicht nicht anders, aber was willst du in 2 wochen vorzeigen, ein windows fenster oder ein spiel? 😉



  • Wichtig ist erstmal, wieviel du selbst machen willst und wieviel aus Libraries kommen soll.
    Man kann so ein Spiel schon recht einfach mit GDIPlus machen. Andere Module sind natürlich schneller und/oder einfacher zu bedienen. Da wären dann die Loader für Dateiformat (z.B. png) schon dabei und man kann mit einfachen Befehlen die Bilder anzeigen.



  • rapso schrieb:

    macht euch das leben nicht unnoetig schwer, besonders am fang. Ihr koennt nicht erst alles lernen was man lernen muss bevor ihr anfang ein spiel zu machen.

    Eigendlich hatte ich vor: erstmal die Grundkenntnisse mindestens grob zu wissen/kennen/können und mich dann an das Spiel zu machen, dass was ich während das programmierens nicht weiß such ich in google raus(z.B. wenn ich nicht weiß wie ich das Programm anhalte/pausiere suche ich etwas in google und finde die wunderbare funktion namens sleep() 🙂 ) mit der Zeit lerne ich dann oft benutzte Befehle auswendig. Und irgendwann ist dann das Spiel fertig 🙂 .

    rapso schrieb:

    deswegen, schreib ein spiel

    Würd ich ja gerne aber...

    rapso schrieb:

    nimm http://code.google.com/p/pixeltoaster/

    ...ich bin entweder zu dumm deinen Vorschlag zu installieren oder... ich weiß auch nicht (readme hab ich gelesen).

    Marthog schrieb:

    Wichtig ist erstmal, wieviel du selbst machen willst und wieviel aus Libraries kommen soll.

    Also, eigendlich will ich soviel wie möglich selber machen...

    Weiterhin danke für eure Hilfe.

    Edit: Könnte mir jemand ein Buch empfehlen ( oder zwei) mit dem ich das lernen könnte was ich da brauche um mein Ziel zu erreichen? Ich fühle mich gerade so als ob ich in meiner Entwicklung stehen geblieben wäre und weiß nicht mehr weiter. Die 'Zusatzfunktionen'(fals es welche sind) die ihr mir zum download vorschlagt hören sich alle gut an, aber ich kann sie leider nicht instalieren 😞 .

    Ich danke weiterhin für jede Hilfe.

    -Skotchy



  • Tut mir leid wegen dem (erneuten) doppel-Post aber ich finde dieser Post verdient es ein eigener zu sein 🙂 .

    Und zwar bin ich gerade etwas verrwirt, weil ich nicht genau weiß was denn nun genau die Grundkenntnisse in C++ sind. Auf meinem Streifzug durch Google fand ich leider nicht die passende Lösung die ich wollte. Meine Suche beschrenkte sich auf die oben genannten C++ Grundkenntnisse von denen ich eine Tabelle zu finden erhoffte. Auch zu den erweiterten Kenntnissen im Bereich Spieleprogrammierung wurde ich nur einmal fündig, allerdings ist/war die Seite auf englisch, was nicht das Problem darstellte, sondern(ab dem spannenden Bereich) Kostenpflichtig.
    Ich dachte mir, dass wenn ich Geld ausgebe auch nur für Bücher, doch verrwiren mich die Rezensionen auf Amazon zu den Büchern noch mehr(die einen finden das Buch unübertroffen, andere meinen das es das Geld nicht wert sei und man sich viel bessere Bücher kaufen könne und von wieder andere Rezensionen verrwiren mich noch mehr).

    Und weil ich das ganze irgendwie verrwirend finde(ganz schön verrwirend oder? 🤡 ) gibt es hier nochmal meine wichtigsten Punkte zusammengefasst:
    -was genau muss/soll ich unter den Grundkenntnissen verstehen bzw. was sind die Befehle?(Würde mich hier über eine Tabelle freuen die ich dann abarbeiten könnte.)
    -welche ertweiterten Kenntnisse werde ich im Bereich Spieleprogrammierung brauchen?(erstmal nur grob, bin ja noch nicht so weit 😉 )
    -welches Buch ist für mich zu empfehlen?(der Preis spielt dabei erstmal keine Rolle.)
    -und, ein Punkt den ich im obigen Text nicht angesprochen habe: Was taugen kostenlose E-Books?

    So, nun bin ich fürs erste alle meine Fragen zum Thema los.

    Bedanke mich weiterhin für Hilfe

    -Skotchy



  • Skotchy schrieb:

    -was genau muss/soll ich unter den Grundkenntnissen verstehen bzw. was sind die Befehle?(Würde mich hier über eine Tabelle freuen die ich dann abarbeiten könnte.)

    Na, eine Tabelle zum Abarbeiten, was?

    • Variablen
    • Funktionen
    • Abfragen (if, switch)
    • Schleifen
    • Arrays
    • Casts
    • Pointer
    • Speichermanagement bzw. Lebenszeit von Objekten. (Stack, Heap, static sind Stichworte)
    • Strukturen
    • Ein / Ausgabe. // Bis hier hin ist es eher C, aber das sollte natürlich auch für C+++ bekannt sein.
    • Standardcontainer (insbesondere: string, vector, map)
    • Klassen mit allem was dazu gehört. (private, protected, public, Vererbung, virtual, pure virtual, ..)
    • Iteratoren
    • Templates
    • Exceptions
    • Ein paar Dinge aus <algorithm>

    Das wären so in etwa die Grundlagen. Alle Befehle auswendig zu lernen ist aber nicht nötig, das passiert automatisch und falls man mal etwas sucht, kann man das immer noch z.B. hier nachschlagen.
    Mit C++11 kommen vermutlich noch ein paar "Grundlagen" dazu, aber wenn du das oben alles verstanden hast, kannst du schon ein paar Dinge basteln.

    Skotchy schrieb:

    -welche ertweiterten Kenntnisse werde ich im Bereich Spieleprogrammierung brauchen?(erstmal nur grob, bin ja noch nicht so weit 😉 )

    Das variiert sehr stark und ist abhängig davon, wie "low-level" du programmieren möchtest. Das kann von "WinAPI mit DirectX" bis zur Einarbeitung in eine bestimmte Engine gehen. Das solltest du dir überlegen, wenn du die Grundlagen hast.

    Skotchy schrieb:

    -und, ein Punkt den ich im obigen Text nicht angesprochen habe: Was taugen kostenlose E-Books?

    So viel wie auch kostenlose Internetseiten. Kommt sowohl auf den Autor als auch auf dich an. Kostenlos ist nicht per se schlecht, genauso wie die Tatsache, dass ein Buch etwas kostet, kein Garant für die Qualität ist.



  • cooky451 schrieb:

    • Strukturen

    Benutzt man die in C++ überhaupt noch großartig? Lohnt sich es nicht stattdessen direkt ne Klasse zu benutzen?



  • @Holymagic:
    Also ich habe schon manchmal noch klassische "structs".

    Also Klassen die halt nur öffentliche Member haben, was jetzt nicht heisst dass diese Member alle eingebaute Typen sein müssen.

    z.B. als Ersatz für elendig lange Parameterlisten macht das IMO Sinn, macht alles etwas leichter zu lesen.

    Klar könnte man sowas auch mit "class" machen, und dann halt gleich "public:" nach der "{" schreiben (und kein "protected" oder "private"), nur... wozu? "struct" sagt für mich schön "das ist ne dumme Sammlung von Werten, mehr nicht".



  • cooky451 schrieb:

    Na, eine Tabelle zum Abarbeiten, was?

    • Variablen
    • Funktionen
    • Abfragen (if, switch)
    • Schleifen
    • Arrays
    • Casts
    • Pointer
    • Speichermanagement bzw. Lebenszeit von Objekten. (Stack, Heap, static sind Stichworte)
    • Strukturen
    • Ein / Ausgabe. // Bis hier hin ist es eher C, aber das sollte natürlich auch für C+++ bekannt sein.
    • Standardcontainer (insbesondere: string, vector, map)
    • Klassen mit allem was dazu gehört. (private, protected, public, Vererbung, virtual, pure virtual, ..)
    • Iteratoren
    • Templates
    • Exceptions
    • Ein paar Dinge aus <algorithm>

    Das wären so in etwa die Grundlagen.

    Dann fange ich mal gleich mit dem Abarbeiten an 😃 .

    cooky451 schrieb:

    Das variiert sehr stark und ist abhängig davon, wie "low-level" du programmieren möchtest. Das kann von "WinAPI mit DirectX" bis zur Einarbeitung in eine bestimmte Engine gehen. Das solltest du dir überlegen, wenn du die Grundlagen hast.

    Ok, dann werde ich nach den Grundlagen wahrscheinlich nochmal dazu fragen wenn ich mir da wieder unsicher bin(und google mir nicht hilft).

    Danke für eure Hilfe 👍

    -Skotchy



  • Ich bin soweit mit der Liste durch, einige Dinge konnte ich schon vorher(wusste nur nicht wie die heißen) und bei manchen Dingen brauche ich noch Hilfe. Ab dem Punkt 'Standardcontainer' finde ich alles(außer Klassen) recht kompliziert.
    Deshalb frage ich hier einmal nach Seiten- und Tutorialempfehlungen(bitte Links)und nach einer Buchempfehlung(hab mir da auch schon eins rausgesucht: C++ von A bis Z und C++ für Spieleprogrammierer . Allerdings habe ich immer bedenken bei den negativen Rezensionen).
    Weiterhin danke für eure Antworten.

    -Skotchy



  • Standardcontainer musst du nur benutzen und nicht verstehen. (Zumindest nicht im Detail, ein gewisses Verständnis sollte natürlich auch zum Benutzen da sein.)
    Dafür sollte eigentlich http://www.cplusplus.com/reference/stl/ reichen.
    Auch sonst kann ich dir die Seite empfehlen, die haben zu allem was:
    http://www.cplusplus.com/doc/tutorial/classes/
    http://www.cplusplus.com/doc/tutorial/templates/
    http://www.cplusplus.com/doc/tutorial/exceptions/
    http://www.cplusplus.com/reference/algorithm/
    Iteratoren guckst du dir am besten gleich mit den <algorithm> Sachen an, auf der Seite stehen auch Beispielimplementierungen, da bekommt man ein gutes Gefühl für Iteratoren.



  • Danke für die Seiten, die sind zwar auf englisch aber ich müsste da mit meinen Englisch-Kenntnissen relativ gut durchkommen.

    Edit: Nebenbei hätte ich da noch eine Frage(es werden immer mehr :)):
    Könnte mir jemand auch so eine Art Aufgabe geben damit ich das gelernte auch wiedergebe?
    Also ich stelle mir das so vor das ich in einem Programm möglichst viel des Gelernten nutze um zu sehen was ich schon kann und was nicht, in 'Schwierigkeitsstufen' unterteilt( leicht, mittel, schwer) wäre nett 🙂

    Danke für die Hilfe.

    -Skotchy



  • Schreibe eine Funktion, die eine Datei einließt, die folgendermaßen aufgebaut ist:

    Schlüssel Wert
    Schlüssel Wert
    ...
    

    Gib anschließend jeden Schlüssel und den dazugehörigen Wert aus.
    Da hätten wir dann schon mal: Variablen, Funktionen, Schleifen, (Pointer/Referenzen?), Standardcontainer, Iteratoren. 🙂



  • Meinst du soetwas?

    #include <iostream>
    #include <map>
    #include <conio.h>
    
    using namespace std;
    
    int main()
    {
    	int zahl[5];
    
    	cout << "Gib 5 Zahlen ein\n";
    	for (int i = 0; i != 5; i++)
    		cin >> zahl[i];
    
    	map<char, int> _map;
    	for (int i = 0; i != 5; i++)
    		_map[i] = zahl[i];
    
    	for (int i = 0; i != 5; i++)
    		cout << "_map[" << i << "] ist: " << zahl[i] << endl;
    
    	getch();
    	return 0;
    }
    

    Oder habe ich da etwas falsch verstanden oder einen anderen Fehler gemacht?

    Weiterhin danke für Hilfe.

    -Skotchy



  • Skotchy schrieb:

    Meinst du soetwas?

    #include <iostream>
    #include <map>
    #include <conio.h> // kein Standardheader, raus damit, da für Aufgabe irrelevant ;)
    
    #include <limits> // std::numeric_limits<T>
    #include <ostream> // operator<< für std::ostream
    
    using namespace std;
    
    int main()
    {
    	int zahl[5];
    
    	cout << "Gib 5 Zahlen ein\n";
    	for (int i = 0; i != 5; i++)
    		cin >> zahl[i];
    
    	map<char, int> _map; // leading underscores sind reserviert, _map ist zudem nichtsaussagend
    	for (int i = 0; i != 5; i++)
    		_map[i] = zahl[i];
    
    	for (int i = 0; i != 5; i++)
    		cout << "_map[" << i << "] ist: " << zahl[i] << endl;
    
    	getch(); // --> cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); cin.getline();
    	return 0;
    }
    

    Oder habe ich da etwas falsch verstanden oder einen anderen Fehler gemacht?

    Weiterhin danke für Hilfe.

    -Skotchy

    Ich hab mal ein paar Sachen markiert, die du demnächst ändern solltest.

    In der Aufgabe war aber nicht das Einlesen von 5 Werten, sondern das Auslesen von beliebig vielen Datenpaaren aus einer Datei gefragt 😉

    Tipp: ofstream und getline zum Einlesen in einen string , zeilenweise Verarbeitung der Daten, Einfügen in die map , Iterieren über die Map, um die Ergebnisse auszugeben



  • Sorry, ifstream meinte ich natürlich 😉



  • helper() {cout<<MY_ schrieb:

    In der Aufgabe war aber nicht das Einlesen von 5 Werten, sondern das Auslesen von beliebig vielen Datenpaaren aus einer Datei gefragt 😉

    Aus welcher Datei soll ich denn Auslesen?
    Muss ich in dem Programm erst eine Datei erstellen die ich dann Auslesen soll?

    Danke für eure Hilfe.

    -Skotchy



  • Schreib dir doch einfach im Editor eine kleine Testdatei. Dafür brauchst du kein Programm schreiben.



  • Ok, nun hab ich zwei Programme zusammengebastelt:

    Einmal das:

    #include <iostream>
    #include <map>
    #include <limits>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    	string sText;
    	string::iterator itText;
    
    	map<char, string> mText;
    	ifstream MeineDatei ("TestDokument.txt");
    
    	if (MeineDatei.is_open())
    	{
    		getline (MeineDatei, sText);
    		int DatenGroesse = sText.size();
    		for (int i = 0; i != DatenGroesse; i++)
    		{
    			mText[i] = sText;
    		}
    		MeineDatei.close();
    	}
    	else
    		cout << "Fehler";
    
    	for (itText = sText.begin(); itText < sText.end(); itText++)
    	{
    		cout << *itText;
    	}
    
    	cin.clear();
    	cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	return 0;
    }
    

    und einmal das:

    #include <iostream>
    #include <map>
    #include <limits>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    	string sText;
    
    	map<char, string> mText;
    	ifstream MeineDatei ("TestDokument.txt");
    
    	if (MeineDatei.is_open())
    	{
    		getline (MeineDatei, sText);
    		int DatenGroesse = sText.size();
    		for (int i = 0; i != DatenGroesse; i++)
    		{
    			mText[i] = sText[i];
    			cout << mText[i];
    		}
    		MeineDatei.close();
    	}
    	else
    		cout << "Fehler";
    
    	cin.clear();
    	cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	return 0;
    }
    

    Beide haben den Fehler das sie nur die erste Zeile des Dokuments wiedergeben.
    Wo ist da der Fehler und hab ich dieses Mal die Aufgabe erfüllt(abgesehen von dem Fehler 😉 )?

    Weiterhin danke für eure Hilfe.

    -Skotchy



  • Jain. Immerhin liest du jetzt aus einer Datei, so wie es vorgesehen war. Aber du hast die std::map leider noch gar nicht verstanden. Zudem würde sich bei dieser Aufgabe der operator >> zum Auslesen aus der Datei anbieten. Und es war gefordert, den "Auslesen" Teil in eine Funktion zu packen.

    Aber wie gesagt, das Hauptproblem besteht einfach darin, dass du die std::map nicht verstanden hast, die solltest du dir noch mal angucken.
    Du hast dich wohl etwas zu nah an diesem Beispiel gehalten, scheinbar ohne wirklich verstanden zu haben, wie die map funktioniert. Ein Tipp: Sowohl Schlüssel als auch Wert sollten hier vom Typ std::string sein!

    Und kleine Schönheitsfehler:
    globales using namespace std;, pack das lieber in die Funktion rein oder schreibe gleich std::.
    Und "Fehler" ist keine aussagekräftige Fehlermeldung.

    Edit:
    Und nenne deine Variablen ruhig einfach text oder so, ein "Typen-Prefix", auch als Ungarische Notation bekannt, ist nicht gern gesehen.

    Edit2:
    Und warum schließt du deine Datei innerhalb der Schleife? 😮 Warum liest du nur ein mal etwas aus?


Anmelden zum Antworten