JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=62aa71f5072c6d9e2d61aa4a934ff432Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

DX 9 Buch: Kap 22 Ressourcenmanagment und Timing

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 21.03.2004, 18:37    Titel: DX 9 Buch: Kap 22 Ressourcenmanagment und Timing Antworten mit Zitat

Ich arbeite mich gerade in D3D ein und bin irgendwo zwischen Kap 21 und 22

Mein Zeil ist es mir einen haufen Klassen zu schreiben, mit denen ich dann alee meine zukünftigen Projekte schnell und einfach programmieren kann. Das gleiche wird im Buch ja auch gemacht (Klasse für Direct3D, für Sprites, CResourceManager usw.)

Nun will ich die Klassen aus dem Buch ja nicht kopieren, es ist sinnvoller sie z. B. abzuschreiben und selbst anzupassen, da lernt man mehr und hat hinterher im Code voll den Durchblick.

Jetzt meine Frage:

In Kapitel 22 wird ein Asteroidenfeld erzeugt. Dazu gibt es zunächst eine Klasse, die einen einzelnen Asterioden enthält. Dieser besitzt nun seine eigene Textur und sein eigenes D3D Sprite. Dann werden 5 Objekte angelgt, die nacheinander angezeigt werden.

Ich hätte glaub ich eine bessere Idee. Man erstellt eine Klasse CAsteriod (oder eine Struktur) die die Werte eines Asterioden (Position, Größe, Geschwindigkeit, Winkel usw.) speichert.

Dann erstellt man eine weitere Klasse CAsteriodManager:
Code:

CAsteriodManager
{
private:
list <CAsteriod> Asterioden;
LPD3DXSPRITE lpSprite
LPDIRECT3DTEXTUR9 lpTextur

public:
void Move()
void Show()
void New()
void Clear()
};


Die Funktionen Show() und Move() gehen jeweils die Liste durch und zeigen das Objekt an, bzw. Bewegn es. Je nach dem ob CAsteriod eine Klasse oder eine Struktur ist, prallt der Asteroid seblstständig an Wänden ab, oder der AsteriodManager übernimmt diese Aufgabe. Ist ja egal, kann jeder machen wie er will.

Diese Methode hat meiner Meinung nach den Vorteil, das man nur 1 D3DSprite benötig und nur eine Textur.

Theoretisch ist D3DSprite ja eigentlich keine Klasse, nur eine Funktion, weil man ja nirgendwo auf die Werte zugreift, sondern alles der Draw()-Funktion übergibt. Dehalb müsste man doch auch mit nur einem einzigen D3DSprite Objekt für ein ganzes Spiel auskommen, oder? Man kann ja bei jedem Anzeigen die Textur und die anderen Werte ändern.


Wie gesagt, ich hab davon noch nicht so viel programmiert, ich hab erst mal die Kapitel durchgelesen und mi genau überlegt, wie die das da gemacht haben, und ob ich es auch so machen soll. Ich finde meinen Vorschlag nämlich irgendwie besser.

Also: Was meint ihr dazu? Hab ich jetzt einen ganz dummen Fehler gemacht, und meine Planung ist nichts wert? Oder ist es Ok so?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
HotAcid
Super JLI'ler


Alter: 43
Anmeldedatum: 04.08.2002
Beiträge: 372
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 21.03.2004, 18:49    Titel: Re: DX 9 Buch: Kap 22 Ressourcenmanagment und Timing Antworten mit Zitat

Jonathan_Klein hat Folgendes geschrieben:
Je nach dem ob CAsteriod eine Klasse oder eine Struktur ist, prallt der Asteroid seblstständig an Wänden ab, oder der AsteriodManager übernimmt diese Aufgabe. Ist ja egal, kann jeder machen wie er will.


Wieso ist das jetz davon abhängig, ob CAsteroid als Klasse oder als Struktur implementiert ist?

cu Felix
_________________
StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 21.03.2004, 18:57    Titel: Antworten mit Zitat

Da der ResourcenManager die Texturen lädt, ist sie ja sowieso nur einmal vorhanden. Ob es sehr viel ausmacht, dass Sprite nur einmal anzulegen, weiss ich nicht. Man könnte es noch als statische Klassenvarieble anlegen.

C.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 21.03.2004, 19:13    Titel: Antworten mit Zitat

Ist nur denk ich ein bisschen einfacher und überschaubarer, wenn man nur 1 Sprite Objekt macht.

@HotAcid
Man kann es entwerder so:
Code:

struct Asteriod
{
float XPos, YPos;
float XSize, YSize;
float XSpeed, YSpeed;
//usw..
};

oder so:
Code:
class Asteriod
{
private:
float XPos, YPos;
float XSize, YSize;
float XSpeed, YSpeed;

public:
void Move()//Testet ob der Asteriod am Bildschrimrand ist, und veränder die Geschwindigkeit entsprechen
D3DXVeCTOR GetPosition();
D3DXVECTOR GetScale();
D3DXVECTOR GetRotationCenter();
};

machen. Ist halt die Frage ob der Manager das übernehmen soll, oder ob das Objekt noch zu einem Teil sebststädig ist.

(es ist ja eher naheliegend, die Struktur zu benutzen, da dann das Objekt nicht mehr selbständig ist, und man nich eine Mischung (halb selbstständig, muss aber angezeigt werden) benutz.

Also die 3 Varianten:
1. Objekt ist komplett selbstständig, und bweget und zeichnet sich selber
2. Das Objekt wird gezeichnet, bewegt sich aber selber
3. Das Objekt (oder eben Struktur) wird bewegt und gezcihnet und speichert nur die eigenn Daten

soweit die Überlegung.

Wenn man jetzt viele Objekte des gleichen Typs hat (wie z. B. in einem Asteroidenfeld) benutz man Methode 3, wenn man nur ein oder 2 (den Spielr, evtl. mehrere Spielr) würde ich Methode 1 benutzen.

Wenn man verschiedene Objekte hat (Asterioden, Gegner, Sterne) würde ich nach Methode 3 eine Basisklasse erstellen und dann z.B. erweiterte Bewegungsfunktionen, wie für eine KI daraus ableiten (also Vererbung).

Die abgeleitete Klasse hätte dan z. B. einen Zeiger auf den Spieler, damit sie dessen Position ermittel, und auf ihn zusteuern kann.

Ups, jetz hab ich meine komplette Engine neidergeschriebn. Nja, egal, was haltet ihr davon?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
HotAcid
Super JLI'ler


Alter: 43
Anmeldedatum: 04.08.2002
Beiträge: 372
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 21.03.2004, 20:53    Titel: Antworten mit Zitat

du kannst aber auch schreiben:
Code:
Code:
struct Asteriod
{
private:
float XPos, YPos;
float XSize, YSize;
float XSpeed, YSpeed;

public:
void Move()//Testet ob der Asteriod am Bildschrimrand ist, und veränder die Geschwindigkeit entsprechen
D3DXVeCTOR GetPosition();
D3DXVECTOR GetScale();
D3DXVECTOR GetRotationCenter();
};


Strukturen sind - vereinfacht gesagt - Klassen in C. Unterschied: Elemente in Strukturen sind per default public, bei Klassen per default private. Und es gibt keine Vererbung.

ich würde dir raten, immer möglichst stark zu kapseln. Also alles, was nur mit einem Objekt zu tun hat, kommt in die Objektklasse. Für das Management von mehreren Objekten kommt dann ein Manager ins Spiel. Hier könnte man eine Methode MOVE schrieben, die als Parameter die Richtung bekommt. Das Objekt kümmert sich um die Verarbeitung der Daten, der Manager kümmert sich um die Ermittlung der Parameter.

cu Felix
_________________
StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 21.03.2004, 21:00    Titel: Antworten mit Zitat

Hast du in deinem Spiel nur Asteroiden ? Wenn nein (und das nehme ich stark an) dann würde ich erstmal eine Basisklasse erstellen die alle Grundfunktionen bereitstellt. Also alles was die Nachfolgeklassen auch besitzen. Und wenn du deine neuen Klassen in eine gemeinsame Objektliste legen möchtest (wie es fast alle machen) dann brauchst du nur zu deiner Basisklasse casten und wenn du sie wieder brauchst zurück.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 21.03.2004, 21:01    Titel: Antworten mit Zitat

Ja, genau so:
Alle möglichst gut kapslen, aber nicht 100mal das selbe speichern, nur weil man 100 Objekte hat.
Also: Bei einzelnen Objekten alles ind die Klasse
Bei vielen Objekten: Managerklasse erstellen!
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 21.03.2004, 21:20    Titel: Antworten mit Zitat

Ich würde in die Asteroidenklasse/-struktur nicht jedes Mal die ganze Textur speichern, aber wenigstens so etwas, wie eine ID.
Meistens nimmt man bei Spielen, damit nicht alles so gleich und langweilig aussieht, verschiedene Texturen(und in diesem Fall wohl auch unterschiedliche Asteroiden).
So kann man in einer STL-Map die ganzen Texturen mit der dazugehörigen ID speichern und zu den Koordinaten, etc... einfach die ID dazuspeichern.
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 21.03.2004, 21:45    Titel: Antworten mit Zitat

Ja, entweder erweiter man den Manager um mehrere Texturen und speichert im Objekt, welche Textur man hat, oder wenn die Asterioden stark unterschiedlich sind, macht man für jeden Typ einen eigenen Manager (wie gesagt, nur wenn sie sich stark unterscheiden, also eher nicht bei Asterioden sondern bei Gegnerischen Raumschiffen)
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum