|
JLI Spieleprogrammierung
|
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
|
Verfasst am: 21.03.2004, 18:37 Titel: DX 9 Buch: Kap 22 Ressourcenmanagment und Timing |
|
|
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 |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 21.03.2004, 18:49 Titel: Re: DX 9 Buch: Kap 22 Ressourcenmanagment und Timing |
|
|
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 |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 21.03.2004, 18:57 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 21.03.2004, 19:13 Titel: |
|
|
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 |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 21.03.2004, 20:53 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 21.03.2004, 21:00 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 21.03.2004, 21:01 Titel: |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 21.03.2004, 21:20 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 21.03.2004, 21:45 Titel: |
|
|
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 |
|
|
|
|
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
|