JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Klassen Arry einzeln austauschen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 30.01.2006, 17:33    Titel: Klassen Arry einzeln austauschen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
PeaceKiller
JLI Master


Alter: 36
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 30.01.2006, 18:06    Titel: Re: Klassen Arry einzeln austauschen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
fast hawk
Senior JLI'ler



Anmeldedatum: 15.07.2005
Beiträge: 237
Wohnort: Freiburg
Medaillen: Keine

BeitragVerfasst am: 30.01.2006, 18:07    Titel: Antworten mit Zitat

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 Twisted Evil </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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
PeaceKiller
JLI Master


Alter: 36
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 30.01.2006, 18:14    Titel: Re: Klassen Arry einzeln austauschen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 30.01.2006, 18:25    Titel: Antworten mit Zitat

also erstmal: list ist die Lösung deines Problems Wink
(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 Wink

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 Rolling Eyes )
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 Wink )


Zuletzt bearbeitet von DirectXer am 30.01.2006, 18:52, insgesamt 4-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
RayJunx
JLI'ler


Alter: 44
Anmeldedatum: 16.01.2006
Beiträge: 130
Wohnort: Bayern
Medaillen: Keine

BeitragVerfasst am: 30.01.2006, 19:01    Titel: dachte... Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
PeaceKiller
JLI Master


Alter: 36
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 30.01.2006, 19:06    Titel: Re: dachte... Antworten mit Zitat

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.

  1. Wenn man was mit new erstellt hat mit delete wieder freigeben
  2. 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 30.01.2006, 20:34    Titel: Re: dachte... Antworten mit Zitat

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 Smile

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
RayJunx
JLI'ler


Alter: 44
Anmeldedatum: 16.01.2006
Beiträge: 130
Wohnort: Bayern
Medaillen: Keine

BeitragVerfasst am: 30.01.2006, 22:07    Titel: Die ganze Thematik Antworten mit Zitat

hätte das topic wohl besser garnicht eröffnen sollen Wink 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 Wink

grüße und danke für alle hilfe,

Rayjunx
_________________
Just a Freak
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: 30.01.2006, 23:06    Titel: Re: Die ganze Thematik Antworten mit Zitat

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 Smile
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
RayJunx
JLI'ler


Alter: 44
Anmeldedatum: 16.01.2006
Beiträge: 130
Wohnort: Bayern
Medaillen: Keine

BeitragVerfasst am: 30.01.2006, 23:30    Titel: umständlich Antworten mit Zitat

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 Wink

Rayjunx
_________________
Just a Freak
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: 31.01.2006, 01:31    Titel: Antworten mit Zitat

Hmm...du kannst sie mit Release() wieder freigeben, meinst du das?

PS: Ich find die STL übrigens übersichtlich Wink
_________________
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
David
Super JLI'ler


Alter: 40
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 31.01.2006, 08:05    Titel: Antworten mit Zitat

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! Smile

grüße
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


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

BeitragVerfasst am: 31.01.2006, 09:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
RayJunx
JLI'ler


Alter: 44
Anmeldedatum: 16.01.2006
Beiträge: 130
Wohnort: Bayern
Medaillen: Keine

BeitragVerfasst am: 31.01.2006, 16:52    Titel: Alles was man braucht: Antworten mit Zitat

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 Wink

grüße an alle
Rayjunx
_________________
Just a Freak
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 -> Entwicklung 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