|
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: 14.03.2004, 09:17 Titel: BltFast stürzt ab |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 14.03.2004, 21:31 Titel: |
|
|
Vielleicht solltest du malö überprüfen, ob das Surface überhaupt existiert
...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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 15.03.2004, 13:13 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 15.03.2004, 13:48 Titel: |
|
|
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 |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 15.03.2004, 14:30 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 15.03.2004, 15:41 Titel: |
|
|
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 |
|
|
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 15.03.2004, 17:54 Titel: |
|
|
versuch mal 2 fische im manager zu erstellen, so wie HotAcid oben geschrieben hat...also mal ohne liste. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 15.03.2004, 18:04 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 15.03.2004, 19:22 Titel: |
|
|
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 |
|
|
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 15.03.2004, 20:22 Titel: |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 15.03.2004, 20:54 Titel: |
|
|
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 _________________ 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 |
|
|
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 16.03.2004, 00:12 Titel: |
|
|
bei mir ists genau andersrum . ich hab schon öfters mit lists probleme gehabt.. |
|
Nach oben |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 16.03.2004, 09:21 Titel: |
|
|
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 |
|
|
|
|
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
|