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

1

14.07.2013, 20:14

Probleme mit Listen(C++)

Hey Leute

Habe mir eben ein simples Target system für mein Spiel ausgedacht.

Ich erstelle 3 Player die dann in eine Liste gepackt werden.
Um einfach mal zu testen, übergebe ich dann eine x und y Koordinate die dann in einer for schleife in der Liste überprüft werden.

Das Setzen des targets klappt ohne probleme doch wenn ich in der zweiten for schleife ausgeben will wer ein target hat, gibt er mir nichts aus, er sagt alle haben kein Target.


Ich habe noch nie so mit listen und dem this Zeiger gearbeitet.

Hier mal der Quellcode
main.cpp

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include<iostream>
#include"Player.hpp"
#include<list>
using namespace std;
   list<Player> m_Pl;
int main()
{
    int x;
    int y;

    Player *Omos;
    Omos=new Player;
    Omos->Init(4,10,10);

    x=0;
    y=0;
    cin >>x;
    cin>>y;

    cout << x << y << endl;


Player *Hero;
Hero=new Player;
Player *Enemy;
Enemy=new Player;
Hero->Init(1,100,200);
Enemy->Init(2,50,50);
m_Pl.push_back(*Omos);
m_Pl.push_back(*Hero);
m_Pl.push_back(*Enemy);

list<Player>::iterator ItFind;
for(ItFind=m_Pl.begin(); ItFind!=m_Pl.end();)
{


    if(ItFind->Check(x,y)==true)
    {

          Enemy->Setit(ItFind->GetPlayer());

            ItFind->UseIT();

    }
    ItFind++;

}
for(ItFind=m_Pl.begin(); ItFind!=m_Pl.end();)
{

            ItFind->UseIT();


    ItFind++;

}









    return 0;
}


Player.hpp

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
#ifndef CPLAYER_HPP
#define CPLAYER_HPP
#include<iostream>
using namespace std;
class Player
{
public:
    void Init(int Number, int X, int Y);
    Player *GetPlayer(){return this;}
    void Setit(Player *muh);
    void Show();
    void ShowNumber();
    bool Check(int targx, int targy);
    bool LikeTrue();
    void UseIT();
private:
    int PlayerNummer;
    Player *Mogo;
    int x;
    int y;
    bool itset;
};
#endif // CPLAYER_HPP


Player.cpp

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
#include "Player.hpp"


void Player::Init(int Number, int X, int Y)
{
    PlayerNummer=Number;
    x=X;
    y=Y;
    itset=false;
    Mogo=NULL;
}
void Player::Setit(Player *muh)
{

   Mogo=muh;

}
void Player::Show()
{
    if(Mogo!=NULL)
    {
       Mogo->ShowNumber();
    }
    cout << "QAufgerufen" << endl;

}
void Player::ShowNumber()
{
    cout << "NUMMER " << PlayerNummer << endl;
}
bool Player::Check(int targx, int targy)
{
    if(targx==x && targy==y)
    {
        return true;
    }
    return false;
}
void Player::UseIT()
{
    if(Mogo!=NULL)
    {
     cout << "Target wird beschossen" << endl;
    }
    else
    {
        cout << "kein Target" << endl;
    }

}


Ich verstehe wirklich nicht warum es nicht funktioniert habe selbst schon einen zweiten iterator erstellt aber da gings auch nicht

Hoffe ihr könnt mir da eventuell helfen, damit ich das ganze verstehe

Gruß Leri

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

14.07.2013, 20:31

float Werte sind nicht exakt, sie mit == zu vergleichen ist sehr selten eine gute Idee...

3

14.07.2013, 20:37

okay ich glaube ich habe gerade was herausgefunden :D

nehme ich anstatt Enemy->SetIT(ItFind->GetPlayer()) das hier ItFind->SetIt(ItFind->GetPlayer) dann macht er es, ich denke mal.

habe schon eine Idee wie ichs eventuell umsetzen kann


nur eben wegen den float werten, es handelt sich bei allen um int werte

4

14.07.2013, 21:14

okay leider zu früh gefreut :D

komme trotzdem nicht weiter.

mit dem iterator weißt er alles richtig zu, versuche ich es direkt mit der instanz in der for schleife funktioniert es nicht.

weiß eventuell jemand warum?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

14.07.2013, 21:25

nur eben wegen den float werten, es handelt sich bei allen um int werte

Oh sry, ich dachte du hättest was von float geschrieben, da muss mein Hirn wohl irgendwie mit dem anderen Thread, den ich grad gelesen hatte, vermischt haben...

Hast du schon einfach mal einen Breakpoint gesetzt und dich mit dem Debugger etwas umgesehen?

6

14.07.2013, 21:35

ich hab ja schon den punkt, wo es nicht funktioniert

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
list<Player>::iterator ItFind;
for(ItFind=m_Pl.begin(); ItFind!=m_Pl.end();)
{


    if(ItFind->Check(Hero->getx(),Hero->gety())==true)
    {


          Hero->Setit(ItFind->GetPlayer());



    }
    ItFind++;

}



Die Spalte haut den Fehler rein

C-/C++-Quelltext

1
Hero->Setit(ItFind->GetPlayer());


Der Player ist ja oben in der main angelegt, extra mit new.
Dann übergebe ich halt den pointer in die liste.


dann wird ja dort überprüft ob die x und y koordinaten mit einer anderen player instanz übereinstimmen, ist das der Fall, so hat der Player ja ein Target angeklickt b.z.w will es targeten.

jetzt sage ich ja nicht, das hier ItFind->Setit(ItFind->GetPlayer()) sonst würde er von der getargeten instanz, einen pointer auf diese selbst machen, ich will aber das target zum spieler das heißt ich muss sagen, spieler target = Hero->Setit(ItFind->GetPlayer()); weil Hero ist mein player und Itfind ist das momentan angeklickte Target. Das problem ist, der Player könnte sich ja auch selbst targeten, wäre auch kein thema ^^ . Nur übernimmt er halt an der Stelle nicht die Instanz der anderen Spieler klasse b.z.w bei selbst anklicken sich selbst.


Mir wird angezeigt, das der Pointer auf Target leer ist

7

16.07.2013, 22:06

hat jemand vielleicht noch eine Idee warum das so ist, ich setze über en iterator ein target und über die zweite iterator schleife, sagt er mir, das ich kein target besitze ^^

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

16.07.2013, 22:22

Ich würde da mit dem Debugger drüber gucken. Guck dir an ob das Target überhaupt erst richtig gesetzt wird. Und dann Schritt für Schritt gucken ab welcher Stelle das ganze nicht mehr funktioniert.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

17.07.2013, 00:25

Warum erzeugst du deine Objekte zuerst mit new, um sie dann by value in einer Liste zu speichern (wodurch sie kopiert werden)? Die Liste sollte Pointer enthalten, nicht komplette Objekte.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

17.07.2013, 06:39

Den selben Unfug hat er hier schon gemacht:
Vererbung und Container
Und meinen Kommentar dazu komplett ignoriert. Das Thema Slicing wurde ihm da auch schon mal vor die Füße geworfen, aber auch das hat er ignoriert.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige