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

24.05.2014, 21:03

Wie returne ich in C++ einen Vector ?

Guten Abend,
Ich bin momentan daran beschäftigt ein kleines Spiel in C++ und SFML zu programmieren.
Alles auch soweit so gut bis auf das ich bei der Collision zwischen einem Bullet Sprite und einem Vector aus Asteroiden schwierigkeiten bekomme.

Hier einmal die Collisions Klasse (nur die 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
#include "Collision.h"

CCollision::CCollision ()
{
}
CCollision::~CCollision   ()
{
}

//Kollision für den BigAsteroid
void CCollision::BigAsteroid_Box2Box(sf::Sprite &Obj, std::vector<CBigAsteroid> &ObjList)
{
    for (int i = 0; i < ObjList.size(); i++)
    {
        if (ObjList[i].isAlive())
        {
            if(Obj.getGlobalBounds().intersects(ObjList[i].GetSprite().getGlobalBounds()))
            {
                ObjList[i].SetAlive(false);
            }
        }
    }
}
//Kollision für den LittleAsteroid
void CCollision::littleAsteroid_Box2Box(sf::Sprite &Obj, std::vector<CLittleAsteroid> &ObjList)
{
    for (int i = 0; i < ObjList.size(); i++)
    {
        if (ObjList[i].isAlive())
        {
            if (Obj.getGlobalBounds().intersects(ObjList[i].GetSprite().getGlobalBounds()))
            {
                ObjList[i].SetAlive(false);
            }
        }
    }
}




Es gibt große Asteroiden aber auch kleine.
In der Klasse prüfe ich ob das Sprite des Bullets mit einem Asteroiden aus dem vector kollidiert.
Das heißt ich muss sowohl ein Sprite als auch ein ganzen Vector übergeben. Doch was leider nur von dem Vector ankommt ist die Zahl '0'.
Ich habe leider keinen Plan mehr wie ich dass anders hinbekomme, ich hatte es schon mit Referenzen und Zeigern versucht. Und auch schon im Internet habe ich nicht viel gefunden.
Denn dass meiste wahr leider auf Englisch und Englisch beherrsche ich leider nicht so gut. Bei einer Referenz ist das Problem dass der Compiler mir eine Fehlermeldung gibt.
Ich hatte den Vector dann übriegens versucht per Getter-Funktion zu returnen doch dort sah das Problem nicht anders aus, hier mal ein Ausschnitt:


C-/C++-Quelltext

1
2
3
4
5
//Getter//

//Zum Returnen der Vectoren von CBigAsteroid und CLittleAsteroid
std::vector<CBigAsteroid>    GetBigAsteroidList()    { return mBigAsteroidList; };
 std::vector<CLittleAsteroid> GetLittleAsteroidList() { return mLittleAsteroidList; };



Ich habe dann versucht Aus der Asteroiden Klasse den ganzen Vector per Getter-Funktion zu returnen.
und diesen Vector dann über eine andere Klasse als Parameter der Funktion Collision zu übergeben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Hier werden die Schüsse geupdatet und nach jedem Update wird nach einer Kollision zwischen dem Asteroid (BigAsteroid) und (littleAsteroid) gefragt.
void CRaumschiff::AddBullet(float frametime)
{
    for (mBulletListIt = mBulletList.begin(); mBulletListIt != mBulletList.end();)
    {
        if (mBulletListIt->GetAlive())
        {
            mBulletListIt->Update(frametime);
            mCollision->BigAsteroid_Box2Box(mBulletListIt->GetSprite(), mAsteroid->GetBigAsteroidList());
            mCollision->littleAsteroid_Box2Box(mBulletListIt->GetSprite(), mAsteroid->GetLittleAsteroidList());
            mBulletListIt++;

//Hier gebe ich mir NUR die größe des GetBigAsteroidList() Vectors aus. Diese Funktion returnt einfach den Vector. 
            std::cout << "Liste Big: " << mAsteroid->GetBigAsteroidList().size() << std::endl;
        }
    }
}


Und beim übergeben des Vectors geht dann irgendwas falsch :/.
Zumindestens kommt nur die Zahl '0' inder Funktion an.

Ich hoffe das mir jemand helfen kann.
Ich bedanke mich jetzt schonmal für jede Antwort.

MFG
Sceiwen

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Sceiwen« (25.05.2014, 14:02)


birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

2

24.05.2014, 21:09

1. Lern zuerst Englisch
2. Check mal mit dem Debugger in der Laufzeit den Content von dem Vektor und versuche das Problem irgendwohin zurückzuführen.

3

24.05.2014, 21:11

1. Lern zuerst Englisch
2. Check mal mit dem Debugger in der Laufzeit den Content von dem Vektor und versuche das Problem irgendwohin zurückzuführen.

Ok Danke.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

24.05.2014, 21:28

C-/C++-Quelltext

1
const std::vector<...>& getVector(){return _vector;}

5

24.05.2014, 21:36

C-/C++-Quelltext

1
const std::vector<...>& getVector(){return _vector;}


Danke,
Doch nun bekomme ich folgenden Fehler:

IntelliSense: Qualifizierer wurden im Bindungsverweis vom Typ ""std::vector<CLittleAsteroid, std::allocator<CLittleAsteroid>> &"" im Initialisierer vom Typ ""const std::vector<CLittleAsteroid, std::allocator<CLittleAsteroid>>"" abgelegt. c:\Users\Andreas\Documents\Visual Studio 2013\Projects\Space Shooter new\Space Shooter new\Raumschiff.cpp 103 67 Space Shooter new


Im Code liegt der Fehler dort:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void CRaumschiff::AddBullet(float frametime)
{
    for (mBulletListIt = mBulletList.begin(); mBulletListIt != mBulletList.end();)
    {
        if (mBulletListIt->GetAlive())
        {
            mBulletListIt->Update(frametime);
            mCollision->BigAsteroid_Box2Box(mBulletListIt->GetSprite(), mAsteroid->GetBigAsteroidList());      <-----  mAsteroid->GetBigAsteroidList() gibt den Fehler
            mCollision->littleAsteroid_Box2Box(mBulletListIt->GetSprite(), mAsteroid->GetLittleAsteroidList());  <-----  mAsteroid->GetLittleAsteroidList() gibt den Fehler
            mBulletListIt++;

            std::cout << "Liste Big: " << mAsteroid->GetBigAsteroidList().size() << std::endl;
        }
    }
}

6

24.05.2014, 21:41

C-/C++-Quelltext

1
const std::vector<...>& getVector(){return _vector;}


Danke,
Doch nun bekomme ich folgenden Fehler:

IntelliSense: Qualifizierer wurden im Bindungsverweis vom Typ ""std::vector<CLittleAsteroid, std::allocator<CLittleAsteroid>> &"" im Initialisierer vom Typ ""const std::vector<CLittleAsteroid, std::allocator<CLittleAsteroid>>"" abgelegt. c:\Users\Andreas\Documents\Visual Studio 2013\Projects\Space Shooter new\Space Shooter new\Raumschiff.cpp 103 67 Space Shooter new


Im Code liegt der Fehler dort:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void CRaumschiff::AddBullet(float frametime)
{
    for (mBulletListIt = mBulletList.begin(); mBulletListIt != mBulletList.end();)
    {
        if (mBulletListIt->GetAlive())
        {
            mBulletListIt->Update(frametime);
            mCollision->BigAsteroid_Box2Box(mBulletListIt->GetSprite(), mAsteroid->GetBigAsteroidList());      <-----  mAsteroid->GetBigAsteroidList() gibt den Fehler
            mCollision->littleAsteroid_Box2Box(mBulletListIt->GetSprite(), mAsteroid->GetLittleAsteroidList());  <-----  mAsteroid->GetLittleAsteroidList() gibt den Fehler
            mBulletListIt++;

            std::cout << "Liste Big: " << mAsteroid->GetBigAsteroidList().size() << std::endl;
        }
    }
}
Ok ich habe denn Fehler zufälliger weise selbst herausgefunden. Doch jetzt ist wieder alles beim alten. :thumbsup:

7

24.05.2014, 21:43

Guten Abend,
Ich bin momentan daran beschäftigt ein kleines Spiel in C++ und SFML zu programmieren.
Alles auch soweit so gut bis auf das ich bei der Collision zwischen einem Bullet Sprite und einem Vector aus Asteroiden schwierigkeiten bekomme.

Hier einmal die Collisions Klasse (nur die 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
#include "Collision.h"

CCollision::CCollision ()
{
}
CCollision::~CCollision   ()
{
}

void CCollision::BigAsteroid_Box2Box(sf::Sprite &Obj, std::vector &ObjList)
{
    for (int i = 0; i < ObjList.size(); i++)
    {
        if (ObjList[i].isAlive())
        {
            if(Obj.getGlobalBounds().intersects(ObjList[i].GetSprite().getGlobalBounds()))
            {
                ObjList[i].SetAlive(false);
            }
        }
    }
}
void CCollision::littleAsteroid_Box2Box(sf::Sprite &Obj, std::vector &ObjList)
{
    for (int i = 0; i < ObjList.size(); i++)
    {
        if (ObjList[i].isAlive())
        {
            if (Obj.getGlobalBounds().intersects(ObjList[i].GetSprite().getGlobalBounds()))
            {
                ObjList[i].SetAlive(false);
            }
        }
    }
}




Es gibt große Asteroiden aber auch kleine.
In der Klasse prüfe ich ob das Sprite des Bullets mit einem Asteroiden aus dem vector kollidiert.
Das heißt ich muss sowohl ein Sprite als auch ein ganzen Vector übergeben. Doch was leider nur von dem Vector ankommt ist die Zahl '0'.
Ich habe leider keinen Plan mehr wie ich dass anders hinbekomme, ich hatte es schon mit Referenzen und Zeigern versucht. Und auch schon im Internet habe ich nicht viel gefunden.
Denn dass meiste wahr leider auf Englisch und Englisch beherrsche ich leider nicht so gut. Bei einer Referenz ist das Problem dass der Compiler mir eine Fehlermeldung gibt.
Ich hatte den Vector dann übriegens versucht per Getter-Funktion zu returnen doch dort sah das Problem nicht anders aus, hier mal ein Ausschnitt:


C-/C++-Quelltext

1
2
3
//Getter//
std::vector    GetBigAsteroidList()    { return mBigAsteroidList; };
 std::vector GetLittleAsteroidList() { return mLittleAsteroidList; };



Ich habe dann versucht Aus der Asteroiden Klasse den ganzen Vector per Getter-Funktion zu returnen.
und diesen Vector dann über eine andere Klasse als Parameter der Funktion Collision zu übergeben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void CRaumschiff::AddBullet(float frametime)
{
    for (mBulletListIt = mBulletList.begin(); mBulletListIt != mBulletList.end();)
    {
        if (mBulletListIt->GetAlive())
        {
            mBulletListIt->Update(frametime);
            mCollision->BigAsteroid_Box2Box(mBulletListIt->GetSprite(), mAsteroid->GetBigAsteroidList());
            mCollision->littleAsteroid_Box2Box(mBulletListIt->GetSprite(), mAsteroid->GetLittleAsteroidList());
            mBulletListIt++;

            std::cout << "Liste Big: " << mAsteroid->GetBigAsteroidList().size() << std::endl;
        }
    }
}


Und beim übergeben des Vectors geht dann irgendwas falsch :/.
Zumindestens kommt nur die Zahl '0' inder Funktion an.

Ich hoffe das mir jemand helfen kann.
Ich bedanke mich jetzt schonmal für jede Antwort.

MFG
Sceiwen

Mir ist so ebend aufgefallen das sogar bevor ich denn Vector returne der Vector auf '0' steht. Doch wieso werden dann meine Asteroiden gezeichnet und auf dem Bildschirm bewegt ?

8

24.05.2014, 21:56

Wer weiß. Erwartest du da echt eine Antwort? Meine Zauberkugel ist gerade in der Reinigung und leider ist hier auch kein Online-Debugger verfügbar, solltest du den kompletten Code posten wollen, um das adäquat beantworten zu können.

MfG
Check

9

24.05.2014, 22:01

Wer weiß. Erwartest du da echt eine Antwort? Meine Zauberkugel ist gerade in der Reinigung und leider ist hier auch kein Online-Debugger verfügbar, solltest du den kompletten Code posten wollen, um das adäquat beantworten zu können.

MfG
Check

Ich entschuldige mich wenn du nicht verstehst was ich meine.
Ich versuche es nochmal zu erklären:
Ich habe in einer Klasse einen Vector aus mehreren Asteroiden (Objecten), denn möchte ich dann in einer Getter-Funktion returnen so dass ich in einer anderen Klasse denn Vector dann als Parameter übergeben kann.
Wenn du was anderes meintest dann habe ich deine Aussage nicht ganz verstanden.

MFG
Sceiwen

10

24.05.2014, 22:15

Ohne Laufzeitwerte und ohne callstacks beim entsprechenden Ereignis, dass ein falscher Wert zurück gegeben wird, oder dass eine variable einen falschen Wert annimmt, können wir dir nicht viel helfen.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Werbeanzeige