Direct3D Spiel, Frage zum Rendern



  • Hallo liebes Forum,

    ich versuche mich derzeit an Direct3D, ich habe erst ein kleines Tutorial im Internet durchgearbeitet um rein zu kommen. Nun bin ich damit soweit fertig und versuche jetzt ein kleines 2D-Spiel zu basteln.

    jetzt stellt sich mir aber schon die erste Frage...
    Bisher hatte ich nur eine Klasse, welche Funktionen wie Initialisierung und Säuberung von D3D hatte und auch z.B. ein Dreieck renderte. Alles war sauber aufgeteilt.

    Nun möchte ich ja das Spiel mit mehreren Klassen programmieren. Also eine Klasse für die Map, eine für die Spielfigur, usw...
    jetzt zur Frage.

    Wie rendere ich das am besten. Ich muss ja die Map darstellen, und auch die Spielfigur. Normalerweise sollte das doch jede Klasse für sich machen oder?

    In diesem Fall müsste ich dann in jeder Klasse eine Renderfunktion haben der ich das D3DDevice übergebe! Sehe ich das richtig so ?

    Gibt es eine bessere Lößung oder hab ich das ganze Falsch angegangen ?
    Könnt ihr mir vlt. Tipps geben!?

    vielen dank schonmal 🙂



  • bin immer noch interessiert 😉



  • Ich würde auch jede Klasse sich selbst rendern lassen.

    Ich hätte jetzt spontan eine Wrapperklasse gemacht die das D3DDevice enthält und eventuell noch etwas Abstraktion der Renderfunktionen. Von der Klasse legst du dann Anfangs ein Objekt an und übergibst das der Map/Spieler/... im Konstruktor.

    Dann musst du das Handle nicht immer neu übergeben, kannst das ganze auch so weit abstrahieren dass keine der anderen Klassen direkt von DirectX abhängt und kannst das Handle auch anpassen falls es ungültig wird (z.B. bei einem Verlust des Rendercontext, keine Ahnung die das bei DX ist).



  • Wie DarkShadow schon sagte, abstrahiere so weit es geht, so dass jede Klasse sich selber rendert, aber auch nichts von DirectX weiss. Dafür legst du eine Render Klasse an, in der du die versch. Funktionen die benötigt werden zur Verfügung stellst. So kannst du auch im nachhinein als bsp noch OpenGL einbauen als zweiten Renderer, falls nötig.

    Wenn dir das schnurz ist, dann kannst darauf auch verzichten.


  • Mod

    was macht die map klasse beim renders anders als die player klasse? zeichnen nicht beide einfach nur sprites?



  • rapso schrieb:

    was macht die map klasse beim rendern anders als die player klasse? zeichnen nicht beide einfach nur sprites?

    Ich würde mal annehmen, dass beim Terrain eine Art von Batching zum Einsatz kommt. Zumindest würde ich das so machen. Ich würde auch annehmen, dass eine Actor Klasse eine Art von Animation beinhaltet wie picture-by-picture oder sogar Bones.



  • Ich habe ehrlich gesagt von der Idee Abstand genommen Dinge sich selbst zeichnen zu lassen. Ich sage meinem Renderer einfach "hier haste die Daten für alle Bäume, zeichne die mal".


  • Mod

    Scorcher24 schrieb:

    rapso schrieb:

    was macht die map klasse beim rendern anders als die player klasse? zeichnen nicht beide einfach nur sprites?

    Ich würde mal annehmen, dass beim Terrain eine Art von Batching zum Einsatz kommt.

    ich wuerde annehmen, dass batching immer zum einsatz kommt.

    Ich würde auch annehmen, dass eine Actor Klasse eine Art von Animation beinhaltet wie picture-by-picture oder sogar Bones.

    ich nehme an, dass alles eine animation haben kann, ob es das wasser, das grass auf dem terrain oder die blaetter der baeume sind, nicht nur der character.

    aus diesem grund wuerde in eine generalisierte sprite klasse nutzen und einen zentrallen ort alle sprites zu verwalten. die terrain-, die player-, die particle-, die ...-class kann diese manipulieren, die verwaltungs klasse zeichnet diese dann einheitlich, egal wer der owner ist.

    -saubere render/logic trennung
    -kein duplizierter code den man verwalten muss
    -kein feature wildwuchs der einzelne teile inkompatibel zueinander macht
    -einmalige optimierungen wirken sich auf alles aus bzw muss man nicht alles auf die gleiche weise optimieren
    -optimierungen ueber die klasse hinaus sind moeglich (z.b. statt dass jeder gegner das char-sprite + waffen-sprite zeichnet, kann die zentrale verwaltungsklasse alle char-sprites im batch abarbeiten, sofern sie gleich sind, und alle waffen-sprites im batch).

    [edit]aber das natuerlich unter unseren utopischen annahmen. fuer einen ordentlichen vorschlag muesste der thread starter beantworten wozu er ueberhaupt alles einzeln rendern moechte.



  • Hallo liebe Community,
    also wie schon oben gesagt soll es nur ein einfaches 2D-Spiel werden. Von daher würde wie Rapso schon gesagt haben beide klassen nur sprites zeichen. Beziehungsweise würde mir das erstmal reichen.
    Das Spiel zu programmieren soll auch nur als übung dienen um mich besser in directx / direct3D einzuarbeiten.

    Nur hab ich von der Spieleprogrammierung mit directx ja nun keine ahnung. Will mir aber auch nichts falsch aneignen usw., daher hab ich hier mal gefragt.

    Vielen Dank erstmal an alle die mir geantwortet haben.

    Das jede klasse sich selbst rendern soll dachte ich wäre einfach gut so, weil es ordnung bringt und alles schön zusammengehört.

    Wie DarkShadow schon sagte, abstrahiere so weit es geht, so dass jede Klasse sich selber rendert, aber auch nichts von DirectX weiss. Dafür legst du eine Render Klasse an, in der du die versch. Funktionen die benötigt werden zur Verfügung stellst. So kannst du auch im nachhinein als bsp noch OpenGL einbauen als zweiten Renderer, falls nötig.

    Klingt schonmal gut. Aber um ehrlich zu sein wüsste ich nicht wie ich eine klasse so aufbauen soll das sie sich rendern kann aber nichts von directx weiß.
    bzw. was mach ich mit der render-klasse wenn ich sie habe. Wie setzte ich sie ein?

    Es soll auch erstmal alles ohne animation sein. Alles ganz simpel. Ich möchte erst eeinmal nur vernünftig alles aufbauen und paar sprites zeichnen 😉
    Die meisten hier denken viel zu komplex für mein simples vorhaben 😃

    Liebe Grüße
    Sc0rpe



  • Naja du machst eine Renderklasse vo nder immer nur ein Objekt existiert. Bei der Erstellung diese Objekts erstellst du den Rendercontext und initialisiert DirectX.
    Dann baust du z.b. eine Methode ein der Vertexliste übergeben kannst und diese wird dann an DirectX weitergegeben.


Anmelden zum Antworten