C++ Kenntnisse für Spieleprogrammierung!
-
Da ich ja schon ein wenig Kenntnisse in Delphi habe wollte ich fragen,ob es auch ein Delphi Buch gibt,wo mal sowas lernt!
Braucht mal gute Mathekenntnisse,um seine erste kleine 3D Engine zu programmieren`?
-
In diesem Forum würde ich nicht nach einem Delphi Buch fragen -.-
Und Mathe muss man können.
-
Und Mathe muss man können.
Wie viele Funktion differenzierst oder integriesrt due denn so beim Programmieren deiner Engine. Interessiert mich einfach mal.
Zurück zum Thema: Ich hab schon einige Spielchen gesehen die ganz gut wahren von Leuten die für meine Begriffe eher wenig Ahnung vom Programmieren haben.
-
Ich habe mehrere Vektorberechnungen (Richtungsvektor bei bestimmter Geschwindigkeit), Abstandsberechnungen, Wegfindung.
Bei 3D würden noch Matrixberechnungen hinzukommen.
-
Naja, ich würde sagen es ist nicht schlecht wenn man sich bei Vektoren auskennt, aber nicht unbedingt erforderlich, denn dafür gibt es die meisten Funktionen sowieso fertig.
Viel wichtiger ist meiner Meinung nach dass man sich bei den Winkelfunktionen Sin, Cos, Tan und vor allem auch den Umkehrfunktionen auskennt, denn damit muss man sich sehr oft selbst Funktionen zusammenbasteln.mfg
-
Ich habe mehrere Vektorberechnungen (Richtungsvektor bei bestimmter Geschwindigkeit), Abstandsberechnungen, Wegfindung.
Bei 3D würden noch Matrixberechnungen hinzukommen.Abstandsberechnugn ist doch nur Pytagoras. Das ist doch nicht wirklich Mathe, das ist kinderkram. Wegfindung ist hart. Aber zum glück findet man ja Texte über den A*-Algorithmus.
Bleiben Vektoren und Matrizen.
Naja, ich würde sagen es ist nicht schlecht wenn man sich bei Vektoren auskennt, aber nicht unbedingt erforderlich, denn dafür gibt es die meisten Funktionen sowieso fertig.
Viel wichtiger ist meiner Meinung nach dass man sich bei den Winkelfunktionen Sin, Cos, Tan und vor allem auch den Umkehrfunktionen auskennt, denn damit muss man sich sehr oft selbst Funktionen zusammenbasteln.Ja, aber solche Dinge kennt doch jeder. Wie ich den Winkel zwischen mein Fahrtrichtung und der des gegners berechne oder so, ist nicht unbedingt dass, was ich als Mathematik bezeichne.
-
Mei, wie gesagt, Realschul-Kenntnisse sollte man meiner Meinung nach schon haben. Fertige Funktionen bei Vektoren... ich berechne meinen Abstand lieber selbst. Weil ich zum Beispiel aus Performancegründen die Wurzel nicht ziehe.
Ich bin jetzt nicht der 3D-Owner aber ich dafür soll man angeblich auch ein bisschen Matrix-Berechnungen beherrschen müssen.
-
Mei, wie gesagt, Realschul-Kenntnisse sollte man meiner Meinung nach schon haben. Fertige Funktionen bei Vektoren... ich berechne meinen Abstand lieber selbst. Weil ich zum Beispiel aus Performancegründen die Wurzel nicht ziehe.
Ich hab mir irgendwann ne Vektorklasse gebastelt, die bot unter anderem auch die Möglichkait das Quadrat der Entfernung zu berechnen, weils schneller geht und für vergleiche föllig ausreicht. Bei anderen Sachen reichts eben nicht, aber auch dafür bietet die Klase möglichkeiten. Ich weiß nicht, ab das jetzt das ist, was du mit vorgefertigt meinst, aber ein:
Vector position1, position2; ... float distance = Vector_tools::distance_square(position1, position2);
ist mir lieber, als jedesmal
float distance; { float temp_dist_x = position1.get_x() - position2.get_x(); float temp_dist_y = position1.get_x() - position2.get_x(); distance = temp_dist_x * temp_dist_x + temp_dist_y * temp_dist_y; }
zu schreiben.
Ich bin jetzt nicht der 3D-Owner aber ich dafür soll man angeblich auch ein bisschen Matrix-Berechnungen beherrschen müssen.
Das du 3D besitzt hätte ich dir auch nie geglaubt, da "dreidimensional" nichts ist, was man besitzen kann.
Ja der umgang mit Matrizen ist tatsächlich sehr hilfreich. Vieles lässt isch einfacher und vor allem schneller erledigen. Ebenfalls sinnvoll in diesem zusammenhang sind Quaternionen. Leider habe ich darüber nur wenig Tutorien gefunden, aber einige waren trotzdem recht hilfreich.
-
ist mir lieber, als jedesmal
float distance;
{
float temp_dist_x = position1.get_x() - position2.get_x();
float temp_dist_y = position1.get_x() - position2.get_x();distance = temp_dis_x * temp_dist_x + temp_dist_y * temp_dist_y;
}
zu schreiben.Na subba, ne eigene Funktion/Klasse zu schreiben hat ja nichts mit vorgefertigten Klassen zu tun. Ich rechne auch nicht jedes mal den Abstand so wie oben aus, sondern hab dafür eine Methode. Allerdings benenne ich meine Variablen nicht so hässlich
EDIT: Warte nur, bald besitze ich das 3D auch -.-
-
Optimizer schrieb:
Allerdings benenne ich meine Variablen nicht so hässlich
kennt jemand n buch übers bennen von variablen?
meine sind nämlich regelmäßig ziemlich hässlich benannt
-
@ Desire
Dazu sind gute Englisch-Kenntnisse (Vokabeln) von Vorteil.
Je mehr Vokablen man kennt, desto genauer kann man durch den Namen der Variable beschreiben, was sie für einen Sinn hat.
Außerdem ist die Konvention sinnvoll, alle Variablen mit einem Kleinbuchstaben beginnen zu lassen und dann jedes weitere Nomen, das Bestandteil des Variablennamens ist, mit einem Großbuchstaben am Anfang zu schreiben:carHeight, bottleNettoVolume
-
also ich schreib meine variablen in deutsch hin, ich seh gar nich ein wieso ich das nicht tun sollte die sources bekommt eh kein englisch sprechender zu lesen
bye
-
Vector position1, position2; ... float distance = Vektor_tools::distance_square(position1, position2);
CVector3 Pos1, Pos2; ... float Dist = Pos1 * Pos2;
da man selten zwei vectoren multipliziert um sie nur zu skalieren, ist es sehr praktisch den operator*(..) zu überladen und als DotProduct zu nutzen... wozu hat man denn sonst operator überladung in c++? (da man auch selten ^ und % für vectoren nutzt, kann man eines davon als CrossProduct nutzen)
rapso->greets();
-
@tobias so mach ichs auch...trotzdem beschwert sich mein vater immer über meine namen *g+ (is informatiker)
-
"Brauche ich C++??"
Nein. Du brauchst kein c++. Viele spiele werden in C++ programmiert, aber das heißt noch lange nicht das man in C++ muß!
Du kannst auch gerne Lisp, Haskel, C, Pascal, Fortran, Java usw. nehmen.
Wichtig ist nicht die Sprache, sondern das du die sprache beherschst, und weißt was du mit ihr machen kannst.
Für alle die oben genannten Programmiersprachen gibt es Grafiklibs ( opengl...)."Wieviel Mathe brauche ich"?
Kommt drauf an. Wenn du das rad neu erfinden möchtest ( deine eigene Grafiklib schreiben) viel. Wenn du nur anwender von libs bist, nicht so viel. Oft reicht zu wissen was "was kommt dabei raus" wenn ich die und die Funktion aufrufe. Aber es währe nat. gut wenn man auch weiß wie diese Funktion funktioniert, um fehler zu vermeiden.
Gut wäre ein grundwissen in Linearer Algebra, trigonometrische Funktionen und ein wenig intelligenz um sich sachen über die man stolpert selbst anzueignen.
-
Tobias Dallmann schrieb:
@ Desire
Außerdem ist die Konvention sinnvoll, alle Variablen mit einem Kleinbuchstaben beginnen zu lassen und dann jedes weitere Nomen, das Bestandteil des Variablennamens ist, mit einem Großbuchstaben am Anfang zu schreiben:und wieso ist es sinnvoll das erste Nomen klein und die restlichen gross zu schreiben? wäre eine einheitlicherere Konvention nicht besser?
rapso->greets();
-
also ich schreib meine variablen in deutsch hin, ich seh gar nich ein wieso ich das nicht tun sollte die sources bekommt eh kein englisch sprechender zu lesen
Das heißt nicht, das das bei allen so ist.
Zeig mal ein Beispiel für deine Variablenbenennung. Vielleicht finde ich die ja hässlich.
Und das verwenden von Operatoren ist natürlich vorteilhaft. Das letzte mal habe ich aber vor etwa drei Jahren Spiele programmiert. Ich hab überhaupt keine Ahnung mehr von meinem eigenen Code. Natürlich ließ sich das Punktprodukt auch mit Operatoren berechnen. * konnte auch gleichzeitig fürs Skalarprodukt verwendet werden. % war das Kreuzprodukt. Langsam erinnere ich mich. Ich müsste erstmal wieder reinkommen. Eigentlich ging mit meiner kleinen Minibibliothek alles, was man so in dem Bereich brauchte. Multiplizieren mit Matrizen zum rotieren, transformieren, ... , umrechnen von Quaternionen in Matrizen und umgekehrt, ... . Was weiß ich vielleicht sollte ichs mir nochmal angucken, bevor ich irgendwas schreibe.
-
rapso schrieb:
und wieso ist es sinnvoll das erste Nomen klein und die restlichen gross zu schreiben? wäre eine einheitlicherere Konvention nicht besser?
rapso->greets();
Das ist doch einheitlich
int eineLangeVariable;
class MeineLangeKlasse
{
};oft bestehen ja Klassennamen nicht aus mehreren Wörtern (bei mir zumindest nicht).
Auf jeden Fall erkennt man so Variablen immer am kleinen Anfangsbuchstaben und Klassennamen am großen.
Den Unterstrich zu verwenden finde ich außerordentlich hässlich und anangenehm zu schreiben.
Mein Vorschlag fürfloat temp_dist_x;
wäre also
float distanceX; // Wozu das temp
Ach und wenn wir schon dabei sind...
Die Namen von Funktionen und Methoden schreibe ich immer Groß:class MeineKlasse { [...] }; MeineKlasse meineInstanz; meineInstanz.BerechneZeitpunktsDesUrknalls(); meineInstanz.SetBla(4);
Get- und Set Methoden sollten auch immer mit Get oder Set beginnen -.-
man sieht hier übrigens ganz schön (anhand der Groß/Kleinschreibung!) dass MeineKlasse eine Klasse ist und meineInstanz ein Objekt.So, jetzt wisst ihr alles über mich.
-
Optimizer schrieb:
Das ist doch einheitlich
int eineLangeVariable;
int EineLangeVariable; // das wäre einheitlicher
class CMeineLangeKlasse { }; class IMeineLangeKlasse { }; struct SMeineLangeKlasse { };
wenn du nur gross und kleinschreibung hast zu differenzierung, dann hast du viele variablen die "int","class" und "float" heißen
nein, aber mal das beispiel da, Jedes Nomen gross anfangen lassen, das finde ich besser als ne "unnütze" ausnahme einzubauen.
ein interface mit I anfangen lassen, denn es kann sein, dass man ein plugin schreibt, dann leitet man von einem interface ab, da weiß man gleich, dass das eine abstract class ist und man kommt nicht auf die versuchung IMeineKlasse& ... zu schreiben.
und S für kleine structuren für die es sich nicht lohnt eine gekapselte klasse zu erstellen mit accessorfunktionen.
bsp:
struct SLookUpTable { int m_Hash; float m_SquareRoot; }
desweiteren finde ich es sehr angenehm m_ zu schreiben für member variabeln, dann kann man auch
void CBla::Bla(float Position) { m_Position = Position; }
schreiben, ohne sich für die eigentlich eindeutige benennung der Position etwas ausdenken zu müssen...was schreibt man statt Position?
rapso->greets();
-
wenn du nur gross und kleinschreibung hast zu differenzierung, dann hast du viele variablen die "int","class" und "float" heißen
hmmm versteh ich jetzt nicht so ganz was du meinst.
desweiteren finde ich es sehr angenehm m_ zu schreiben für member variabeln, dann kann man auch
void CBla::Bla(float Position)
{
m_Position = Position;
}schreiben, ohne sich für die eigentlich eindeutige benennung der Position etwas ausdenken zu müssen...was schreibt man statt Position?
mein Vorschlag:
void Bla::Bla(float startPosition) // Konstruktor, also wie wärs mit startPosition? { position = startPosition; // Das position ein Member ist, ist eigentlich offensichtlich. // Davon abgesehen sollte man seine eigene Klasse schon kennen ;) }
Wie auch immer, es ist alles Geschmackssache (bis auf Unterstriche
)
Das wichtigste ist, dass man seine Konvention konsequent durchhält.