JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

BltFast stürzt ab

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
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: 14.03.2004, 09:17    Titel: BltFast stürzt ab Antworten mit Zitat

In meinem Programm kommt folgender Code vor:
Code:

Write("ist noch da");
         if(FAILED(lpDDSBack->BltFast(nxpos, nypos, lpSurface, &Sprite, DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY)))
         {
            Write("Animation konnte nicht angezeigt werden");
         }
         Write("ist immer noch da");


Die Funktion Write erzeugt eine textdatei mit der Fehlermeldung.
Sie kommt aber immer nur bis("ist noch da") also, die BltFast Funktion hat einen Fehler und beendet das Programm OHNE den Befehl in der if(FAILED()) Abfrage auszuführen.

Das merkwürdige ist, das diser Programmtiel manchmal funktioniert, und manchmal nicht:

Ich hab ein Klasse mit dem Objekt(Fisch) das sich slebst anzeigen soll. Funktioniert auch wunderbar.
Nun hab ich noch eine Klasse den Fischmanager.
Dieser soll eine Liste, mit FischObjekten durchgehen, und bei jedem die Show() Funktion aufrfen.

Wenn ich ein Fischobjekt erstelle funktioniert diese Funktion.
Wenn der Fischmanager diese Funktion aufruft, stürtzt das Programm an der besagten Stelle ab.

Woran kann es liegen, das BltFast abstürztz???
Ich hab gedacht, vieleicht am Rechteck und hab statt &Sprite NULL übergeben, aber es stürtz trotzdem ab.
Und wieso hilft die Abfrage nichts?
_________________
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: 14.03.2004, 21:31    Titel: Antworten mit Zitat

Vielleicht solltest du malö überprüfen, ob das Surface überhaupt existiert Wink

...also:
Code:
if(lpSurface==0)
{
//existiert nicht
}
else
{
//existiert
}

_________________
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: 15.03.2004, 13:13    Titel: Antworten mit Zitat

Hm, hab ich gemacht:
Code:

if(NULL!=lpSurface)
         {
            if(FAILED(lpDDSBack->BltFast(nxpos, nypos, lpSurface, &Sprite, DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY)))
            {
               Write("Animation konnte nicht angezeigt werden");
            }
         }
         else
         {
            Write("Surface=NULL");
         }

Die Fehlermeldung, wenn lpSurface=NULL ist, hat er allerdings nie angezeigt. Er stürtzt auch nciht mehr ab.

Ich hab eine Bilddatei mit allen Zahlen und Buchstaben und eine Funktion die damit Texte im Spiel anzeigen soll. Funktioniert auch prima, aber der Fischmanager zeigt statt des Fisches irgendwelche Zahlen an (die immer wechseln/flimmern) die aus dieser Oberfläche zu stammen scheinen. Aber wenn ich ein einzelnes Fischobjekte mache, wird es korrekt angezeigt.

Es ist ziemlich komisch, der Fischmangaer ist nur nur eine Klasse, die eine Liste mit Fischobjekten verwalten soll. Wenn ich ein einzelnes Fischobjekt mache, funktionierts, wenn ich das über den Fischmanager laufen lasse nicht.

Es kann also eigentlich nur daran liegen, das der Fischmanager das Objekt nicht richtig verwaltet. Aber es müsste alles stimmen:

der Fischmanager
Code:

class Fische
{
private:
   list<Fisch> Fischliste;
   list<Fisch>::iterator itFisch;
public:
   void Bewegen(void)//hab ich aus übersichtlichkeitsgründen weggelasen
   
   void Anzeigen(void)
                for(itFisch=Fischliste.begin();itFisch!=Fischliste.end(); itFisch++)
      {
         itFisch->Show();
      }
   
   void NeuerFisch(void)
   {
      Fisch nFisch;
      nFisch.Set();
      Fischliste.push_back(nFisch);
   }

   Fische::~Fische()
   {
      Fischliste.clear();
   }
};

Die Fischkalsse:
Code:

class Fisch
{
private:
   Animation aFisch;
   int XPos;
   int YPos;
   int XSpeed;
public:

   void Set(void)
   {
      aFisch.Set("media\\regenbogenfisch.bmp", 45, 72, 1, 3, 3, &ckBlue);
      aFisch.Start(-1);
      YPos=300;
      XPos=1024;
      XSpeed=5;
   }

   void Show(void)
   {
      aFisch.Show(XPos, YPos);
   }
}

einzelnen Fish anzeige:
Code:

Fisch Testfisch;
Testfisch.Set();
Testfisch.Show();

Und jetzt mit dem Fischmanager:
Code:

Fische Fischmanager;
Fischmanager.NeuerFisch();
Fischmanager.Show();

Müsste doch funktionieren oder etwa nicht? Wie gesagt, einzelner Fisch geht, Fischmanager net.
_________________
https://jonathank.de/games/
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: 15.03.2004, 13:48    Titel: Antworten mit Zitat

Ich hab die Fischmanagerklasse noch mal ausgebaut, und einfach so eine Fischliste erstellt. Die Funktioniert auch nicht. Ich habe also eine Klasse deren Objekte immer wunderbar funktionieren, nur nicht wenn man sie in eine Liste schreibt! Das kann doch irgendwie gar nicht sein!
_________________
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: 15.03.2004, 14:30    Titel: Antworten mit Zitat

probier mal aus:

Code:
Fisch Testfisch;
Testfisch.Set();
Testfisch.Show();

Fisch nochEinFisch;
nochEinFisch = TestFisch;
nochEinFisch.Set();
nochEinFisch.Show();


Du kannst auch mal versuchen, aus deiner FischListe eine FischZeigerListe zu machen, also

Code:
list<Fisch*> fischList;

_________________
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
Jonathan_Klein
Living Legend


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

BeitragVerfasst am: 15.03.2004, 15:41    Titel: Antworten mit Zitat

Wie muss ich das den mit den Zeigern dann schreiben?

Original:
Code:

list<Objekt> Fischliste;
   list<Objekt>::iterator itFisch;
public:
   void Bewegen(void)
   {
      for(itFisch=Fischliste.begin();itFisch!=Fischliste.end(); itFisch++)
      {
         tFisch->Move();
      }
   }
                void NeuerFisch(void)
   {
      Objekt nFisch;
      nFisch.Set(1);
      Fischliste.push_back(nFisch);
   }

Und jetz mit Zeigern.
Code:

list<Objekt*> Fischliste;
   list<Objekt*>::iterator itFisch;
public:
   void Bewegen(void)
   {
      for(itFisch=Fischliste.begin();itFisch!=Fischliste.end(); itFisch++)
      {
         (*itFisch)->Move();
      }
   }
                void NeuerFisch(void)
   {
      Objekt nFisch;
      nFisch.Set(1);
      Fischliste.push_back(&nFisch);
   }

Hinweis: Die Fischklasse heißt jetzt Objekte (ich will ja nicht nur fische)
und die Fische Klasse Manager.

Die Schreibweise mit den Zeiger funktioniert zwar, nur wie muss ich dann das schreiben:
Code:

if(itFisch->Move()) //die funktion gibt ture zurück wenn der Fisch am Bildschirmrand ist
{
Fischliste.erase(itFisch);
itFisch=Fischliste.begin();
continue;
}

hab ich umgeschriben in:
Code:

for(itFisch=Fischliste.begin();itFisch!=Fischliste.end(); itFisch++)
      {
         if((*itFisch)->Move())
         {
            Fischliste.erase(itFisch);
            itFisch=Fischliste.begin();
            continue;
         }
      }

Aber irgendwie funktioniert das alles nicht.

Ich hab mal beim Spielstart einen Fisch erstellt. Wenn ich im Fischmanager:
Code:
(*itFisch)->Move();

benutze stürtz er sofort ab. Wenn ich das aber durch:
Code:
if((*itFisch)->Move())
         {
            Fischliste.erase(itFisch);
            itFisch=Fischliste.begin();
            continue;
         }

stürtz er nicht ab! Aber funktionieren tuts trotzdem nicht.

Und wenn ich am Anfang keinen Fisch erstelle, die Funktion also ein paar mal mit leerer liste ausgeführt wird, stürtz er auch nicht ab. Wenn ich dann mitten im Spiel einen Fisch erstelle (mit:
Code:
if(bKeyboard[DIK_F])
               {
                                    Objektmanager.NeuerFisch();
               }
stürtz er nicht ab, egal ob ich die Funktion zum Bewegen mit oder ohen Abfrage aufrufe!

Ich blick da echt kein bisschen mehr durch!


Das ganze ist mittlerweile so kompliziert, soll ich mal den kompletten Quellcode posten?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Chewie
Super JLI'ler



Anmeldedatum: 17.07.2003
Beiträge: 382

Medaillen: Keine

BeitragVerfasst am: 15.03.2004, 17:54    Titel: Antworten mit Zitat

versuch mal 2 fische im manager zu erstellen, so wie HotAcid oben geschrieben hat...also mal ohne liste.
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: 15.03.2004, 18:04    Titel: Antworten mit Zitat

2 Fische im Manager und ohne Liste?
Der Manager verwaltet doch die Liste! Der Manager besteht doch hauptsächlich aus der Liste. Oder meinst du 2 Fische ohne Manager?

Ich probiers mal
_________________
https://jonathank.de/games/
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: 15.03.2004, 19:22    Titel: Antworten mit Zitat

Ich hab den Manager nocheimla komplett gelöscht.
Dann habe ich 2 Zeiger auf Objekte gemacht, und im Programm dynamisch Fischobjekte erzeugt. Immer wenn ein Fisch aus dem Bildschirm rausgeschwommen ist, wird er gelöscht und ein neuer erstellt. Bei der ganzen Sache tritt kein einziger Fehler auf.
Nachdem ich dann jetzt wiß, das das Fischobjekt funktioniert (war mir eigentlich vorher schon klar) sollte ich das doch auch in eine Liste reinkriegen.
Naja, mal sehen, wei es klappt, wer Interesse hat, kann sich eine Vorabversion auf www.C3-Soft.de.vu runterladen udn mir die Meinung sagen.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Chewie
Super JLI'ler



Anmeldedatum: 17.07.2003
Beiträge: 382

Medaillen: Keine

BeitragVerfasst am: 15.03.2004, 20:22    Titel: Antworten mit Zitat

ja, so hab ichs gemeint...einfach 2 objekte(zeiger) anlegen. um zu sehen, ob der fehler immer bei mehreren objekten auftritt. was anscheinend nicht der fall ist...also muß es mit einer liste auch gehen. debug mal durch und schau, wo genau er abstürzt.

alternativ kannst dus mal mit einem vector statt ner liste versuchen...ich arbeite fast nur mit vektoren, ist angenehmer weil man nicht unbedingt nen interator braucht, find ich...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 15.03.2004, 20:54    Titel: Antworten mit Zitat

Chewie hat Folgendes geschrieben:
alternativ kannst dus mal mit einem vector statt ner liste versuchen...ich arbeite fast nur mit vektoren, ist angenehmer weil man nicht unbedingt nen interator braucht, find ich...

Aaaber damit habe ich schon öfters Probleme gehabt. Irgendwie hat da was beim hinzufügen nicht gefunzt(bzw. die Werte haben sich geändert). Als ich dann eine STL-list genommen habe, hats plötzlich einwandfrei gefunzt 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
Chewie
Super JLI'ler



Anmeldedatum: 17.07.2003
Beiträge: 382

Medaillen: Keine

BeitragVerfasst am: 16.03.2004, 00:12    Titel: Antworten mit Zitat

bei mir ists genau andersrum Wink. ich hab schon öfters mit lists probleme gehabt..
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: 16.03.2004, 09:21    Titel: Antworten mit Zitat

Bei vectoren verlieren alle Zeiger unbd Iteratoren ihre Gültigkeit, wenn neue Elemente hinzugefügt werden (und neuer Speicherplatz reserviert werden muss)

evtl liegts daran...

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
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL 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