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
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); } } } } |
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; }; |
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; } } } |
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Sceiwen« (25.05.2014, 14:02)
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.
Community-Fossil
C-/C++-Quelltext |
|
1 |
const std::vector<...>& getVector(){return _vector;} |
C-/C++-Quelltext
1 const std::vector<...>& getVector(){return _vector;}
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.
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; } } }
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
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
Werbeanzeige