JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Unbekannte Anzahl an Objekten erstellen
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 03.10.2005, 18:35    Titel: Unbekannte Anzahl an Objekten erstellen Antworten mit Zitat

Hey, malwieder eine Frage von mir :

Ich habe eine Klasse namanes Level angelegt.
Diese Klasse enthält eine Liste die Strkuturen enthält. Diese Strukturtyp spiegelt Objekte wieder, die später als Sprites an bestimmten Positionen dargestellt werden.

Jetzt kann die Liste beispielsweise 18 Strukturen enthalten.
Jetzt sollen in einer Funktion diese 18 Srukturen als Sprites gezeichet werden.

Aber man muss ja immer eine konstante Anzahl von Sprites (schließlich auch eine Klasse) erstellen.

Ich habe folgendes ausgetüfftelt:

Code:

void InitializationLevel(void)
{
    const int NUMBER_OBJECTS = Level.GetObjectNumber();
   CSprite Target[NUMBER_OBJECTS];
   for(int i=0;i<=NUMBER_OBJECTS;i++)
   {
      Target[i].Create(dxobj.GetDevice(),&ResourceManager,10);
   }
}


Funzt aber leider nicht ;(
Kann mit einer sagen, wie ichdas hinbekomme ?
Muss doch irgendwie gehen, die gewünschte Anzahl an Sprites zu erstellen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
xardias
JLI Master


Alter: 38
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 03.10.2005, 18:54    Titel: Antworten mit Zitat

anstatt hier groß wsa zu erklären kann ich dir diesen link hier empfehlen:

http://www.cplusplus.com/doc/tutorial/tut3-4.html

Du musst deinen array mit new erstellen (wie im tutorial beschrieben), dann kannst du auch bestimmen wie viele Objekte du erstellen willst.

Code:
void InitializationLevel(void)
{
    const int NUMBER_OBJECTS = Level.GetObjectNumber();
   CSprite Target = new CSprite[NUMBER_OBJECTS];
   for(int i=0;i<=NUMBER_OBJECTS;i++)
   {
      Target[i].Create(dxobj.GetDevice(),&ResourceManager,10);
   }
}

wobei du darauf achten musst, dass du den Speicher den du mit new erstellst auch wieder freigibts. z.b. beim beenden des spieles. dies geschieht mit delete[] Target;
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 03.10.2005, 18:59    Titel: Antworten mit Zitat

Ahh Wink Vielen Dank, diese Möglichkeit hatte ich ganz vergessen ...

Ich denke das bekomme ich jetzt hingebastelt.

PS: Vielen Dank ans gesamte jli-board, schon zahlreiche Probleme (zum Großteil auch durch die Suchfunktion) konnte ich dank der Community beheben Wink
Ist super hier, weiter so !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
xardias
JLI Master


Alter: 38
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 03.10.2005, 19:01    Titel: Antworten mit Zitat

man tut was man kann Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
HotAcid
Super JLI'ler


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

BeitragVerfasst am: 03.10.2005, 20:08    Titel: Antworten mit Zitat

du könntest sonst auch noch ne std::list benutzen und die SPrites einfach hinten ranhängen, umj den Speicherplatz musste dich da net kümmern
_________________
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
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 03.10.2005, 20:26    Titel: Antworten mit Zitat

@HotAcid:
So habe ich es nach langem Hin und Her auch gemacht Wink
Habe noch lange daran gegrübelt, wie ich das letztedlich gut hinbekomme, und habe mich dann für die std::list entschieden.

PS: Mal eine Frage zu std::list :
Weiß nicht warum, aber immer wenn ich mit Listen arbeite, und schließlich das Programm beende kommt eine Fehlermeldung die besagt, das eine Anweisung auf einen Speicherbereich verweist, und dabei die Read Anweisung nicht ausgeführt werden kannte.
Aber immer erst dann wenn ich das Programm mit Esc beende.
Habe in den Destruktor mal :
Code:
m_ObjectList.clear();
eingefügt, hat aber nicht geholfen ..

Kennt ihr da eine potentielle Fehlerquelle !?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


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

BeitragVerfasst am: 03.10.2005, 20:28    Titel: Antworten mit Zitat

Wie genau hast du deine List gemacht und wie steckst du da sachen rein? Ein wenig Quellcode *lechz* wäre hilfreich.
_________________
"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
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 03.10.2005, 21:25    Titel: Antworten mit Zitat

In diesem Context steht die Liste jeweils :

CPP:
list<CObject> m_ObjectList;

CPP:
CLevel::~CLevel(void)
{
   m_ObjectList.clear();
}

CPP:
void CLevel::Draw(void)
{
   list<CObject>::iterator it;
    for(it = m_ObjectList.begin(); it != m_ObjectList.end();it++)
   {
        //m_ObjectBuffer = *it;
      it->Draw();


      //Hier ist es möglich die Länge an die FPS anzugleichen. Dazu die MaxFrame-Dauer des Textes neu berechnen, und die Differenz addieren
      
      /*it->Frames--;
      if(it-> > 0) m_dxobj->DrawText(m_TextBuffer.Text, m_TextBuffer.x, m_TextBuffer.y, D3DCOLOR_XRGB(0,255,0));
      else{ m_lText.erase(it); it= m_lText.begin();}*/

   }
}


bool CLevel::CheckCollision(CSprite *Counterpart)
{
   list<CObject>::iterator it;
   int i = 0;
    for(it = m_ObjectList.begin(); it != m_ObjectList.end();it++)
   {
        //m_ObjectBuffer = *it;
       i += it->CheckCollision(Counterpart);


      //Hier ist es möglich die Länge an die FPS anzugleichen. Dazu die MaxFrame-Dauer des Textes neu berechnen, und die Differenz addieren
      
      /*it->Frames--;
      if(it-> > 0) m_dxobj->DrawText(m_TextBuffer.Text, m_TextBuffer.x, m_TextBuffer.y, D3DCOLOR_XRGB(0,255,0));
      else{ m_lText.erase(it); it= m_lText.begin();}*/

   }
   return i;
}


Das sind eigendlich die einzigen Befehle, die mit der Liste angieren.
Hoffe du findest dawas Wink

Ich vermute, dass der Fehler in den for-Schleifen steckt .. bin mir da aber unsicher ..

PS: Die Kommentare dürft ihr ignorieren Razz

EDIT(Kampfhund): Code Tags durch CPP-Tags der übersicht halber ersetzt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


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

BeitragVerfasst am: 03.10.2005, 21:38    Titel: Antworten mit Zitat

Was soll das hier machen?

CPP:
if(it-> > 0) m_dxobj->DrawText(m_TextBuffer.Text, m_TextBuffer.x, m_TextBuffer.y, D3DCOLOR_XRGB(0,255,0));


Ausserdem nehme ich an das du deiner Liste Zeiger auf deine Objekte zugewiesen hast stimmt das? Wenn ja dann solltest du diese auch mit delete wieder frei geben bevor du erase anwendest, denn erase tut das nicht (!) für dich.
_________________
"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
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 04.10.2005, 16:05    Titel: Antworten mit Zitat

Fallen hat Folgendes geschrieben:
Was soll das hier machen?

CPP:
if(it-> > 0) m_dxobj->DrawText(m_TextBuffer.Text, m_TextBuffer.x, m_TextBuffer.y, D3DCOLOR_XRGB(0,255,0));



Das hatte "nichts" zu bedeuten, da hatte ich mal was gemengt, habe ich aber vorerst in Kommentar gesetzt, und wird früher oder später aus demCode entfernt. War vermutlich noch nicht fertig.

Ein Zeiger auf die Objekte befindet sich eigendlich nicht in der Liste, sondern "nur" direkte Objekte.
Also:
Code:
list<CObject> m_ObjectList;


Und dann übernimmt std::list ja eigendlich die Speicherverwaltung oder ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 04.10.2005, 16:10    Titel: Antworten mit Zitat

Was sagt der Debugger?
_________________
http://www.sieder25.org/ (Siedler 2 - Remake)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
xardias
JLI Master


Alter: 38
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 04.10.2005, 17:34    Titel: Antworten mit Zitat

der fehölermeldung nach wäre es interessant zu wissen wie du deine liste befüllst. dort konnte ein fehler liegen.

ansonsten hilft natürlich debuggen um den genauen ort zu finden an dem der fehler auftritt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 04.10.2005, 19:11    Titel: Antworten mit Zitat

Normalerweiße spuckt der Compiler immer :
Das Programm "C:\C++\Entwicklung\Lost Bird\Erica\Erica\Debug\Erica.exe" wurde mit Code -1073741819 (0xC0000005) beendet.

aus, aber (ich weiß nicht warum, wieso und was ich anders gemacht habe) eben hat der Debugger auf eine Spezielle Zeile gezeigt, die jedoch nichts "direkt" mit der Liste zu tuen hat.

CPP:
CSprite::~CSprite(void)
{
    if(NULL != m_lpSprite)
    {
        m_lpSprite->Release(); // Diese Zeile
        m_lpSprite = NULL;
    }

    if(NULL != m_lpTexture)
    {
        m_lpTexture = NULL;
    }
}


Und tatsächlich, wenn ich diese Zeile Ausklammere (in Kommentar setze), meldet das Programm beim Beenden keinen Fehler ... seltsam.

Liegt das daran, dass die Liste die Objekte löscht, bevor der Destruktor aufgerufen wird ?
Soll ich die Zeile dann einfach weglassen ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dragon
Super JLI'ler


Alter: 38
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 04.10.2005, 19:34    Titel: Antworten mit Zitat

ich hatte mal ein änliches problem mit directsound
ich hab directsound zuerst released und dann erst die sounds
zu deinem problem. Es kann sein, dass du Direct3D vorher beendest und dann erst das SpriteObjekt freigibst.

Ach man wie kompliziert hab ich den das geschrieben Rolling Eyes
so noch mal kurz

du hast es sicherlich so
d3d init
sprite anlegen
[spiel machen]
d3d term / release
sprite->release

das liegt daran, das der konsturkor nach dem runterfahren von dd3d aufgerufen wird.
Lösung: nutzt new und delete für deine spriteklasse
_________________
Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 07.10.2005, 11:04    Titel: Antworten mit Zitat

Seh ich das richtig das du für jedes Sprite ein eigenes Spriteobjekt hast?

Wenn ja versuch mal ein einziges zu nehmen mit dem du alles zeichnest.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
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
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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