|
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: 16.03.2004, 14:20 Titel: STL list mit Klasse funktioniert nicht! |
|
|
Ich programmiere gerade ein Spiel, bei dem man als Taucher Fische einsammeln muss.
Also hab ich eine Klasse für die Objekte geschrieben (class Objekt). Die funktioniert auch wunderbar, ich kann Objekte erzeugen, und alles ist prima.
Hier mal der Code von der Klasse:
Code: |
class Objekt
{
private:
Animation aObjekt;
int XPos;
int YPos;
int XSpeed;
int Typ;
public:
void Set(int nTyp)
{
switch(nTyp)
{
case 1: //Ein Fisch
aObjekt.Set("media\\regenbogenfisch.bmp", 45, 72, 1, 3, 3, &ckBlue);
aObjekt.Start(-1);
YPos=rand()%600;
XPos=1024;
XSpeed=5;
break;
case 2: //Eine Pflanze
aObjekt.Set("media\\pflanze.bmp", 64, 96, 2, 1, 6, &ColorKey);
aObjekt.Start(-1);
YPos=768-96-96;
XPos=1024+rand()%64;
XSpeed=2;
break;
}
Typ=nTyp;
}
void Show(void)
{
aObjekt.Show(XPos, YPos);
}
bool Move(void)
{
XPos-=XSpeed;
if(-45>=XPos)
{
return true;
}
else
{
return false;
}
}
};
|
Da es aber viele Fische sein sollen, wollte ich eine STl list machen:
Code: |
list<Objekt> Fischliste;
list<Objekt>::iterator it;
void NeuerFisch()
{
Objekt nFisch;
nFisch.Set(1);
Fischliste.push_back(nFisch);
}
it=Fischliste.begin();
if(it->Move())//Die Funktion gibt true zurück, wenn das Objekt den Bildschirmrand erreicht
{
Fischliste.erase(it);
}
it->Show();
|
Der Fisch bewegt sich, aber er wird nicht angezeigt, sondern stattdessen irgend ein paar teiel aus einer ganz anderen Oberfläche. Und sobald er den Bildschirmran erreciht hat, und gelöscht wird, stürtz das Programm ohne eine Fehlermeldung ab.
Meine Frage: Warum funkioniert die Klaase in der Liste nicht? Und warum zeigt sie wenn sie in der Liste ist den Fisch nicht korekt an? Gibt es irgendeine Möglichkeit den Fehler zu beheben?
Es ist übrigens egal, ob das Objekt in der Liste als Fisch, oder Pflanze verwendet wird. Aber meine einzel erstellten Objekte (ohne Liste) funktionieren.[/code] _________________ 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: 16.03.2004, 14:54 Titel: |
|
|
Was ist denn "Animation aObject"?
Ich habe da nämlich die Vermutung, dass es ein Problem mit dem Zuweisungsoperator gibt, also dass da irgendwo "flache Kopien2 gemacht werden, die dann Probleme machen.
Hast du denn mal ausprobiert:
Code: | Fisch einFisch;
Fisch nocheinFisch = einFisch;
einFisch.Set(1);
einFisch.Show();
nocheinFisch.Set(1);
nocheinFisch.Show(); |
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 16.03.2004, 14:56 Titel: Re: STL list mit Klasse funktioniert nicht! |
|
|
Jonathan_Klein hat Folgendes geschrieben: | Der Fisch bewegt sich, aber er wird nicht angezeigt, sondern stattdessen irgend ein paar teiel aus einer ganz anderen Oberfläche. Und sobald er den Bildschirmran erreciht hat, und gelöscht wird, stürtz das Programm ohne eine Fehlermeldung ab. |
Das könnte vielleicht an dem erase() liegen.
Durchläufst du die gesamte Liste und kommst dabei durch erase() vielleicht über das Ende der Liste hinaus? _________________ 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 |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 16.03.2004, 15:25 Titel: |
|
|
Du musst einen Copykonstruktor definieren, in dem das Objekt für die Animation korrekt erstellt wird. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 16.03.2004, 16:13 Titel: |
|
|
Kannst du mir mal erklären, wie das hier funktionieren soll:
Code: | it=Fischliste.begin();
if(it->Move())//Die Funktion gibt true zurück, wenn das Objekt den Bildschirmrand erreicht
{
Fischliste.erase(it);
}
it->Show();
|
nach Fischliste.erase(it) ist das element it gelöscht, das heißt, du hast gar kein gültiges Element, das du mit it->Show() anzeigen lassen kannst! _________________ 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: 16.03.2004, 16:48 Titel: |
|
|
Animation ist eine Klasse die Animationen darstellt.
Sie besteht aus einer Oberfläche, in die die Bilddatei geöffnet wird, und zeigt dann die einzelnen Bilder hintereinander an.
Jedes Fischobjekt hat also ein Animation Objekt, welches wiederrum eine eigene Oberfläche hat. Ich weiß, das ich damit ein und dieselbe Bilddatei mehrmals in den Speicher lade, aber wenn ich einen Zeiger auf die Animation nheme, sind ja alle Animationen immer gleich (also nicht voneinander abhängig). Außerdem ist es einfacher.
Stimmt, das mit dem it->Show. Ist ja eigentlich kar, das er abstürzen muss. Danke.
@HotAcid: Ich probiers gerade mal aus.
@Hazel: Hört sich so an, als ob das mein Problem lösen könnte. Ich habe aber leider überhaupt keine Ahnung, was du damit meinst. Könntest du mir das näher erklären? _________________ 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: 17.03.2004, 19:07 Titel: |
|
|
Ich glaub ich weiß jetzt wie ichs mache:
Ich entferne aus der Objektklasse der Funktion zum anzeigen, und lasse den Objektmanager sämtliche Objekte anzeigen. Damit sollte es dann keine Probleme mehr geben. Schade, das es nicht funktioniert hat, aber man muss halt flexibel sein. Auch wenn ich meine Planung dafür ändern muss, hauptsache ich kann das Projekt vortsetzen. _________________ https://jonathank.de/games/ |
|
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
|