Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Pixma

Frischling

  • »Pixma« ist der Autor dieses Themas

Beiträge: 35

Wohnort: Mainz

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

1

08.02.2011, 12:08

Spielfigur Struktur in Liste

Hallo,

ich arbeite bereits seit mehreren Tagen an einem Problem.
Und zwar möchte ich die Struktur in der ich die Koordinaten meiner Spieler speicher an eine Liste binden um diese am Ende dynamisch zu löschen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
struct S_Pawn
{
    int x;
    int y;
    bool white;
};
.
.
S_Pawn *pawns = new S_Pawn[16];
list<S_Pawn> pawn_list;
list<S_Pawn>::iterator pawn_i;

int main (int argc, char *argv[])
{
    for(int i=0; i<8; i++)
    {
        
        pawns[i].x = i;
        pawns[i].y = 6;
        pawns[i].white = false;
        //pawn_list.push_back(&pawns[i]);
        pawn_list.push_back(pawns[i]);
    }

    for(int i=0; i<8; i++)
    {
        pawns[i+8].x = i;
        pawns[i+8].y = 1;
        pawns[i+8].white = true;
        pawn_list.push_back(pawns[i+8]);
    }
}

void isPawnCollision(int PawnX, int PawnY, bool isWhite,list<S_Pawn> list)
 {
    
    for(int i=0; i<16; i++)
    {
            /* for (pawn_i = pawn_list.begin(); pawn_i != pawn_list.end(); pawn_i++)
             {
                if(pawn_i->x == pawns[i].x && pawn_i->y == pawns[i].y)
                {
                    pawn_list.erase(pawn_i);
                }
     
             }*/

        if(pawns[i].x == PawnX && pawns[i].y == PawnY && pawns[i].white != isWhite)
        {
            pawns[i].x =-100;
            pawns[i].y =-100;
        }
    }


Ich habe jetzt nicht den kompletten Quellcode hier abgebildet.
Bisher habe ich das gelöst in dem ich Figur X und Y -100 rechne.
Jedoch hat man dann immernoch das problem, dass die Objekte im Speicher existieren.
Wodurch man nicht so leicht herausfinden kann, welche Figuren von welchem Spieler noch im Spielfeld wären.

Mit freundlichen Grüßen

Dennis Köhler

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

2

08.02.2011, 12:24

Also wenn du die Objekte einfach löschen willst, dann sollte das hier den gewünschten Erfolg mit sich bringen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
for( pawn_i = pawn_list.begin(); pawn_i != pawn_list.end(); )
{
   if(...)
   {
        delete (*pawn_i);
        pawn_i = pawn_list.erase( pawn_i );
    }
   else
        pawn_i++;
}

Pixma

Frischling

  • »Pixma« ist der Autor dieses Themas

Beiträge: 35

Wohnort: Mainz

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

3

08.02.2011, 13:23

Hallo Fred,

danke für deine Antwort.
So einen ähnlichen Gedanken hatte ich auch schon ausprobiert.
Jedoch wird die Figur dabei nicht gelöscht, sondern bleibt bestehen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
if(pawns[i].x == PawnX && pawns[i].y == PawnY && pawns[i].white != isWhite)
        {
            for( pawn_i = pawn_list.begin(); pawn_i != pawn_list.end(); )
            {
                if(pawn_i->y == pawns[i].y && pawn_i->x == pawns[i].x)
               {
                    delete (pawns);
                    pawn_i = pawn_list.erase( pawn_i );

                }
               else
                    pawn_i++;
            }

Kann es sein dass du statt
delete (*pawn_i);, delete (pawns); meintest

Gruß
Dennis

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

4

08.02.2011, 13:55

Ah jetzt habe ich erst verstanden, was du da machst ;). Sorry habe vorhin keinen Wert auf das Erstellen deiner Objekte gelegt.
Aber jetzt muss ich schon mal nach dem Sinn fragen: Warum legst du ein Array an, in dem sich alle Objekte befinden und legst dann alle Objekte nochmal in einer Liste ab?
Das macht doch egtl. überhaupt keinen Sinn. Dein Ansatz ist sicherlich richtig, einen Container zu verwenden, wenn man Objekte dynamisch erstellen und löschen will. Denn Elemente aus deinem Array löschen ist mitunter etwas gefährlich.
Ich meinte es genauso wie ich es oben geschrieben habe. Denn delete pawns würde ja alle pawn-Objekte zerstören; wnen dann müsstest du schon gezielt ein Objekt in Angriff nehmen mit delete pawns[irgendwas]. Aber das ist auch Quatsch, weil so zwar das Objekt verschwindet, aber du einen leeren Eintrag in deinem Array hast und das kann auf Dauer nicht gut gehen. Die Erstellung der Objekte würde ich daher so handhaben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
std::list< S_Pawn* > test;
    for( int i = 0; i < 8; i++ )
    {
        S_Pawn* pawn = new S_Pawn();
        pawn->x = i;
        pawn->y = 6;
        pawn->white = false;
        test.push_back( pawn );
    }

Dann hast du alle Objekte bequem in der Liste, kannst mit dieser Arbeiten und wenn du einen Eintrag - mit Hilfe meines Codes von oben - löschst, wird das entsprechende Objekt einfach zerstört und ist auch nicht mehr in der Liste vertreten und wird somit nicht mehr behandelt.

Pixma

Frischling

  • »Pixma« ist der Autor dieses Themas

Beiträge: 35

Wohnort: Mainz

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

5

08.02.2011, 16:14

ok danke, für die Hilfe.
Dann werde ich morgen den Quellcode umschreiben

Werbeanzeige