 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
RayJunx JLI'ler
Alter: 44 Anmeldedatum: 16.01.2006 Beiträge: 130 Wohnort: Bayern Medaillen: Keine
|
Verfasst am: 30.01.2006, 17:33 Titel: Klassen Arry einzeln austauschen |
|
|
Hi!
Folgendes Problem:
ich habe eine Klasse, nennen wir sie mal HUND
ich erzeuge ein arry mit hunden:
HUND meineeigenenhunde[100];
so jetzt fällt mir ein hund nummer 23 will ich nicht mehr
also destruct: ~meineeigenenhunde[22]
jetzt ist nummer 23 futsch oder?
was wenn ich danach einen neuen jund erzeugen will in die
arrynummer 23?
wenn ich das versuche:
HUND meineeigenenhunde[22]
dann ist das ja unsinn weil er nicht element 23 erzeugt sondern
einen neuen arry mit gleichen namen...
kann/muß ich dann erst einen dummy erzeugen? so alla:
HUND dummy;
meineeigenenhunde[22]=dummy;
?so vielleicht? geht das überhaupt? und es gibt doch sicher
eine elegantere lösung?
jemand ne ahnung?
und eine frage habe ich auch noch.
ich erzeuge einen bool arry
so alla:
bool maps256[256][256][512];
stelle aber fest das mein programm jetztmehr arbeitsspeicher
schluckt aber nicht ein bit mehr pro feld sondern etwa
ein BYTE mehr pro feld. sollte das nicht ein bit sein?
grüße an alle
Rayjunx _________________ Just a Freak |
|
Nach oben |
|
 |
PeaceKiller JLI Master

Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 30.01.2006, 18:06 Titel: Re: Klassen Arry einzeln austauschen |
|
|
RayJunx hat Folgendes geschrieben: | und eine frage habe ich auch noch.
ich erzeuge einen bool arry
so alla:
bool maps256[256][256][512];
stelle aber fest das mein programm jetztmehr arbeitsspeicher
schluckt aber nicht ein bit mehr pro feld sondern etwa
ein BYTE mehr pro feld. sollte das nicht ein bit sein?
grüße an alle
Rayjunx |
Das liegt daran, das dein Compiler die bool Variable auf ein byte aligned, da Prozessoren mit einzelnen Bits nur sehr schlecht umgehen können. _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
 |
fast hawk Senior JLI'ler

Anmeldedatum: 15.07.2005 Beiträge: 237 Wohnort: Freiburg Medaillen: Keine
|
Verfasst am: 30.01.2006, 18:07 Titel: |
|
|
Frage:
1. ka
2. ne so weit wie ich weiß braucht der Datentyp bool ein Byte.
obwohl eigentlich nur 1 bit benutzt wird.
<edit>misst zu langsam </edit> _________________ Jetziges Projekt: The Ring War
Status: 40%
-----------------------------------
Nicht weil es schwer ist, wagen wir es nicht, sondern weil wir es nicht wagen, ist es schwer.
--
Lucius Annaeus Seneca (4)
röm. Philosoph, Dramatiker und Staatsmann |
|
Nach oben |
|
 |
PeaceKiller JLI Master

Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 30.01.2006, 18:14 Titel: Re: Klassen Arry einzeln austauschen |
|
|
RayJunx hat Folgendes geschrieben: | Hi!
Folgendes Problem:
ich habe eine Klasse, nennen wir sie mal HUND
ich erzeuge ein arry mit hunden:
HUND meineeigenenhunde[100];
so jetzt fällt mir ein hund nummer 23 will ich nicht mehr
also destruct: ~meineeigenenhunde[22]
jetzt ist nummer 23 futsch oder?
was wenn ich danach einen neuen jund erzeugen will in die
arrynummer 23?
wenn ich das versuche:
HUND meineeigenenhunde[22]
dann ist das ja unsinn weil er nicht element 23 erzeugt sondern
einen neuen arry mit gleichen namen...
kann/muß ich dann erst einen dummy erzeugen? so alla:
HUND dummy;
meineeigenenhunde[22]=dummy;
?so vielleicht? geht das überhaupt? und es gibt doch sicher
eine elegantere lösung? |
Du darfst Objekte, die auf dem Stack sind, nie mit delete löschen und den Destruktor selber aufzurufen ist eigentlich noch dümmer (außer du weißt sehr genau, was du tust).
Wenn dann könntest du ein Array von Pointern machen und den Speicher selber verwalten, dann hast du aber immer noch das Problem, das du "Lücken" kriegst.
Das, was du brauchst ist ein STL-Container. Schau am besten im Buch nach, oder ich glaube hier im Forum gibt's auch ein Tutorial. _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 30.01.2006, 18:25 Titel: |
|
|
also erstmal: list ist die Lösung deines Problems
(gibt auch andere, z.B. mit new und delete oder vector bzw. deque, aber list reicht erstma; also STL allgemein)
Das Beispiel was ich dir hier zeige, setzt allerdings voraus, dass eine Member in HUND so etwas wie "int nr" hat, der im Konstruktor ein übergebener Wert zugewiesen wird (brauchen wir, für die Position des Hundes in der Liste)
im code also:
CPP: | #include <list>
using namespace std; //setzt namespace std voraus
list<HUND> Hunde; // Liste mit Hundinstanzen erzeugen
// im Programm
for(long i=0;i<100;++i) // erzeugt 100 Hunde und ruft Konstruktor von HUND auf
Hunde.push_back( HUND (i) ); //ruft Konstruktor auf und füg neues Hundelement
//ans Ende der Liste; i wird im Konstruktor von
//HUND in nr gespeichert
//löscht Hunde[22] mit einem Iterator ( = Zeiger für bessere Handhabung extra für die Liste
for(Hunde::iterator itor = Hunde.begin(); itor != Hunde.end();)
{
if( itor->nr == 22 )
Hunde.erease(itor); // löscht Hunde[22]
break;
else
++itor;
}
// alle Elemente löschen am Ende des Programms
Hunde.clear();
|
Hoffe, dass ich dir helfen konnte. Wenn du allerdings noch nie etwas mit der STL und der list zu tun hattest(wovon ich _nicht_ ausgegangen bin), wird das alles etwas schwerer zu verstehen... Bei Fragen fragen
Gruß DirectXer
EDIT also, das was peacekiller meinte, hab ich hier erklärt (hab grad erst gesehen, dass er schon was zu stl gesagt hatte )
so, jetz wird aufgeräumt. also, wenn du noch nix von list gehört haben solltest, http://www.jliforum.de/board/viewtopic.php?t=3972
(hat gerade peacekiller noch gepostet, net wundern )
Zuletzt bearbeitet von DirectXer am 30.01.2006, 18:52, insgesamt 4-mal bearbeitet |
|
Nach oben |
|
 |
RayJunx JLI'ler
Alter: 44 Anmeldedatum: 16.01.2006 Beiträge: 130 Wohnort: Bayern Medaillen: Keine
|
Verfasst am: 30.01.2006, 19:01 Titel: dachte... |
|
|
dachte eigentlich das mit den klassen wäre ganz einfach.
habe bisher in allen büchern gelesen das der destructor die klassen instanzen wieder im speicher frei gibt.
tut er das denn nicht?
zumindest bei "nicht arry elementen"?
ich dachte immer wenn ich einfach
HUND lupus;
erzeuge
das ich ihn über den destructor auch wieder eleminieren kann.
sollte das nicht der sinn und zweck von dem teil sein? _________________ Just a Freak |
|
Nach oben |
|
 |
PeaceKiller JLI Master

Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 30.01.2006, 19:06 Titel: Re: dachte... |
|
|
RayJunx hat Folgendes geschrieben: | dachte eigentlich das mit den klassen wäre ganz einfach.
habe bisher in allen büchern gelesen das der destructor die klassen instanzen wieder im speicher frei gibt.
tut er das denn nicht?
zumindest bei "nicht arry elementen"?
ich dachte immer wenn ich einfach
HUND lupus;
erzeuge
das ich ihn über den destructor auch wieder eleminieren kann.
sollte das nicht der sinn und zweck von dem teil sein? |
Nein, den Destruktor ruft der Compiler automatisch auf, wenn die Variable/Klasse nicht mehr gültig ist. Denke einfach an die Grundregeln.
- Wenn man was mit new erstellt hat mit delete wieder freigeben
- Wenn man was mit new[] erstellt hat mit delete[] wieder freigeben
Ansonsten regelt das dein Compiler. _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 30.01.2006, 20:34 Titel: Re: dachte... |
|
|
PeaceKiller hat Folgendes geschrieben: | Nein, den Destruktor ruft der Compiler automatisch auf, wenn die Variable/Klasse nicht mehr gültig ist. Denke einfach an die Grundregeln. |
Recht hat er
Wenn du einen Konstruktor (neben dem Standardkonstruktor) einbaust, dann erzeugt dieser auch nicht die Klasse im Speicher. Das passiert, wenn du eine Klasseninstanz definierst/deklarierst. Der Konstruktor bietet nur Platz für evtl. Initialisierungsvorgänge. Genauso dient der Dekonstruktor als Gegenstück für Deinitialisierungen. Die Instanz der Klasse selbst wird afaik erst mit dem Beenden des Programms zerstört/aus dem Speicher gelöscht. _________________ 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 |
|
 |
RayJunx JLI'ler
Alter: 44 Anmeldedatum: 16.01.2006 Beiträge: 130 Wohnort: Bayern Medaillen: Keine
|
Verfasst am: 30.01.2006, 22:07 Titel: Die ganze Thematik |
|
|
hätte das topic wohl besser garnicht eröffnen sollen jetzt kenn ich mich garnicht mehr aus. Das mit den Containern scheint die lösung dafür zu sein aber ist das nicht irre kompliziert? so wirklich checke ich da zumindest im moment noch fast garnichts.
die gesamtthematik ist eigentlich so das ich ein spielchen programieren will,
was im grunde wie das sprite oder asteroiden program aus dem Buch funktioniert. Habe also eine Sprite objektklasse in der ich objekte wie raumschiffe und meteoriten erzeuge. nur wenn ich jetzt im verlauf des spieles immer neue objekte erzeugen will dann sind die alten ja alle
müll werden aber erst am programm ende aus dem speicher entfernt.
Jetzt sind mir zwei einfache ideen eingefallen wie ich das problem umgehen
könnte. ich könnte die Klassenobjekte einfach weiterverwenden indem
ich die parameter des objektes ändere, das könnte ich nur weiß ich nicht
wie ich die dem sprite zugeweisenen Texturen wieder zurückweißen kann ( um wieder neue zuweißen zu können ).
der code zum zuweißen sie ja so aus:
Code: | void Spriteobjekt::AddTexture(LPDIRECT3DTEXTURE9 lpTexture) // Textur für das Sprite festlegen
{
D3DSURFACE_DESC desc; // Beschreibung des zu Grunde liegenden Surfaces
lpTexture->GetLevelDesc(0,&desc);
m_Breite = desc.Width; // Breite und Höhe speichern
m_Hoehe = desc.Height;
m_HalbeBreite = m_Breite/2;
m_HalbeHoehe = m_Hoehe/2;
m_RotationsPunkt = D3DXVECTOR2((float)m_Breite/2, (float)m_Hoehe/2);
m_AnimationVec.push_back(lpTexture); // Zeiger auf die Textur speichern
} |
kann mir jemand nur sagen wie die "texturen wieder entfern" funktion
aussehen würde? dann wäre das problem insgesamt für mich gelöst
weil ich die klassenobjekte einfach weiterverwenden könnte gleich
ob sie nun ein raumschiff, eine geschosskugel oder ein asteroid sind.
die zweite idee wäre noch ein objekt für jeden bildtyp zu produzieren
und diesen dann mehrfach zum zeichnen pro frame an alle stellen
auf dem bild zu setzen an denen selbiges texturobjekt zu sehen ist.
aber das macht die sache ungemein komplizierter, schachtelt ja
alles irgendwie noch einmal.
die sache mit den countainern als dirtte lösung erscheint mir irgendwie
auch kompliziert weil ich davon nichts kapiere und man ja offenbar
immer die kette durchlaufen muß um irgend was zu manipulieren,
und das erschwert mir das handling der objekte. denk ich mal.
am liebsten wäre mir jetzt also wie oben angesprochen eine funktion
um einem sprite objekt die texturen zu "entziehen" damit ich ihm
wieer einfach neue zuweißen kann...
oder..hey kann ich einfach eine funktion schreiben die die
texturen added aber die vorhanden einfach überschreibt indem
es diesen texturenpuffer zurückzählt und wieder an dessen anfang
startet.
Bitte helft mir, ich glaube das ist jetzt mein letztes großes problem.
die kollisionsrutine habe ich jetzt auch gebacken bekommen und
zwar echt eins a performance optimiert
grüße und danke für alle hilfe,
Rayjunx _________________ Just a Freak |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 30.01.2006, 23:06 Titel: Re: Die ganze Thematik |
|
|
RayJunx hat Folgendes geschrieben: | die sache mit den countainern als dirtte lösung erscheint mir irgendwie
auch kompliziert weil ich davon nichts kapiere und man ja offenbar
immer die kette durchlaufen muß um irgend was zu manipulieren,
und das erschwert mir das handling der objekte. denk ich mal. |
Glaub mir, das ist die einfachste Lösung von allen
Du musst dich nur ein bisschen in die Container der STL einarbeiten, dann klappt das schon. Wenn dus erstmal kapiert hast, dann ist die STL eine mächtige Library, die ich schon lange nicht mehr missen möchte.
PS: Falls dir so viel daran liegt, dass man die Liste nicht durchlaufen muss, kannst du auch die Containerklasse 'vector' verwenden. Der Zugriff erfolgt hier wie bei einem normalen Array mit dem []-operator. Allerdings kann ein vector (je nach Situation) performancefressender sein, da bei jedem hinzufügen eines Elements die gesamte Struktur im Speicher neu erstellt wird(es sei denn, du reservierst vorher genügend Speicher).
Aber was genau spricht denn gegen die Liste? In welchen Situationen meinst du denn, dass du die Objekte in der Liste per Index ansprechen musst? _________________ 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 |
|
 |
RayJunx JLI'ler
Alter: 44 Anmeldedatum: 16.01.2006 Beiträge: 130 Wohnort: Bayern Medaillen: Keine
|
Verfasst am: 30.01.2006, 23:30 Titel: umständlich |
|
|
also über die Kontainer gewinne ich bestimmt nichts. weder performance
noch übersichtlichkeit meines codes. und ja ich muß die ganze
zeit über indexe auf "units meiner sprite klasse" zu greifen und das
geht über die objekt klassen aufruhfe total easy, es geht ja schon alles
und das ganze problem währe schon erledigt hätte ich die
codezeile bzw die funktion die mir wie oben, nur die texturen nicht
läd sondern wieder entfernt.
bin nicht sehr ergeizig was abstraktes programieren angeht, der
mittel heiligt den zweck und alles das was ich erledigen will
kann ich damit dann ohne probleme umsetzen. wenn ich denn
die texturen wieder einem objekt entziehen kann.
weiß jemand wies geht?
flehe instendig um erleuchtung
Rayjunx _________________ Just a Freak |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 31.01.2006, 01:31 Titel: |
|
|
Hmm...du kannst sie mit Release() wieder freigeben, meinst du das?
PS: Ich find die STL übrigens übersichtlich  _________________ 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 |
|
 |
David Super JLI'ler
Alter: 40 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 31.01.2006, 08:05 Titel: |
|
|
Hi!
Für dein Problem eignen sich die STL Container tatsächlich hervorragend! Du erstellst einfach eine Liste die Pointer auf deine Objekte enthält. So kannst du den Speicher beliebig freigeben.
Wenn du tatsächlich auf die STL verzichten willst, dann solltest du dir eine eigene Klasse schreiben die verlinkte Listen handelt.
Ansonsten seh ich da wenig (performante) Möglichkeiten für dich!
grüße |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 31.01.2006, 09:44 Titel: |
|
|
Ich benutze Grundsätzlich für alles STL. Seit ich das ich dem Buch mal gelesen habe, wusste ich das es genau das ist, was ich immer woltle.
Wenn du STL erst einmal verstanden hast, ist es einfahc genial. Ist so wie wenn du nur Konsolenspiele machen würdest weil du keinen Bock auf Windows und DX hast. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
RayJunx JLI'ler
Alter: 44 Anmeldedatum: 16.01.2006 Beiträge: 130 Wohnort: Bayern Medaillen: Keine
|
Verfasst am: 31.01.2006, 16:52 Titel: Alles was man braucht: |
|
|
hi Jungs,
also alles was man in meinem fall brauchte ist das:
Code: |
void Sprite::ClearFromTextures()
{
m_AnimationVec.clear();
}
|
hab ich eben gefunden, war total easy, die idee kam nur leider erst
heute in der arbeit. Dann werden neue texturen einfach wieder an den
anfang des texturspeichers für das sprite gestellt und volla, neues objekt.
ich brauch ja auch keine flexiblen kontainer die ihre größe verändern
da die spielobjekte in meinem programm eine gewisse anzahl nie
überschreiten und die vom speicherverbrauch ohnehin minimal ist.
so spart man sich komplett alles. nur klassenfunktionen. fertig.
ich mein mann kanns ja auch kompliziert machen wenn man will.
aber trotzdem danke für eure ratschläge, ich mein es gibt sicher sehr
viele fälle in denen man ohne fortgeschrittene methoden nicht weiter
kommt. Aber ich brauch keinen lamborgini um meinen Wohnwagen
zu ziehen
grüße an alle
Rayjunx _________________ Just a Freak |
|
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
|