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

10.07.2011, 10:28

Wiedermal ein Problem mit einem Vector!

Hallo :D

Ja, ich habe wieder ein Problem mit einem Vector... aber dieses mal erkläre ichs
mal genauer, undzwar habe ich einen Vektor der mit 3 Objekten gefüllt ist (diesesmal wirklich).

Erstmal der Code:

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
CPlayer.cpp:

void CPlayer::SetGravity(bool Status)
{
    //Set Status
    isGravity = Status;
}

void CPlayer::Movements(sf::RenderWindow &App)
{
     //Falls SetGravity(true) ist, fällt der Spieler, andernfalls nicht.
     if(isGravity == true)
     { 
        //Gravitation
    SCharacter.Move(0, CharacterGravity * App.GetFrameTime()); 
     }
}

//Der Constructor wird über eine Get Methode geholt, das wie aber weiter unten im Text erwähnt nicht das Problem sein sollte
for(vector<CObject>::iterator i = ObjectList.GetVectorByID(1).begin(); i != ObjectList.GetVectorByID(1).end(); ++i)
{

if(i->IsCollisionOnTopSide(SCharacter) == true)
            {
                cout << "Es gab eine Collision" << endl;
                //Set it on false
                SetGravity(false);
            }
            else
            {
                cout << "false" << endl;
                //Set it on true, if he is not on the Top of the Object
                                //Hier wird also die Gravitation angeschaltet so das er fällt
                SetGravity(true);
            }
}


Es sind, wie erwähnt, 3 Objekte im Vektor undzwar 0, 1 und 2. Diese exestieren auch wirklich im Vector zu 99,99%.
Deswegen müsste also die Get Funktion funktionieren und kann als Problemquelle eigentlich ausgeschlossen werden.
Trotzdem nochmal die Get Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
vector<CObject> &CObjectList::GetVectorByID(int ID)
{
    if(ID == 1)
    {
        //Return the Vector
        return Vector_ObjStone;
    }
}


Wenn eine Collision auf der oberen Seite des Objekts stattgefunden hat wird die Gravitation für den Spieler ausgeschaltet
so das er auf dem Block stehen bleibt und hier kommen wir zum Problem, denn im Spiel wird ledeglich
nur immer beim letzten Objekt die Gravitation ausgeschaltet wenn eine Collision stattfand, bei den anderen zwei Objekten
also das 0te und 1te wird zwar in der Konsole "Es gab eine Collision" ausgegeben, was also heißt das eine Kollision stattfand aber
die Gravitation wird nicht ausgeschaltet. Also die Gravitation wird nicht ausgeschaltet aber laut Konsolen ausgabe gab
es eine Collision... was mich enorm verwirrt, weil ich einfach nicht nachvollziehen kann woran es liegt... Da ja die
Variable isGravity dann auf false gesettet wird... und dies beim letzten Objekt auch dazu führt das er nicht mehr weiter runterfällt...

Die oben im anderen Code Abschnitt aufgerufene Collisions Funktion "IsCollisionOnTopSide":

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
CObject.cpp:

bool CObject::IsCollisionOnTopSide(sf::Sprite &CollisionSprite)
{
    //2 - Was there a Collision with the Top Side of the Object?
    if(     CollisionSprite.GetPosition().y + CollisionSprite.GetSubRect().GetHeight()  >= Sprite.GetPosition().y
       && CollisionSprite.GetPosition().y + CollisionSprite.GetSubRect().GetHeight()  <=  Sprite.GetPosition().y 
                                          + Sprite.GetSubRect().GetHeight()
       ||
            CollisionSprite.GetPosition().y + CollisionSprite.GetSubRect().GetHeight()  >=  Sprite.GetPosition().y
       && CollisionSprite.GetPosition().y + CollisionSprite.GetSubRect().GetHeight()  <=  Sprite.GetPosition().y 
                                          + Sprite.GetSubRect().GetHeight())
    {
        for(int x = 0; x < CollisionSprite.GetSubRect().GetWidth(); x++)
        {
            if(   CollisionSprite.GetPosition().x + x >= Sprite.GetPosition().x
                && CollisionSprite.GetPosition().x + x <= Sprite.GetPosition().x + Sprite.GetSubRect().GetWidth())
            {
                //There was a Collision
                return true;
            }
            
            if(x == CollisionSprite.GetSubRect().GetWidth())
            {
                //Reset it
                x = 0;
            }
        }
    }
    else
    {
                //There was no Collision
        return false;
    }
}


Das war eigentlich so gut wie alles Code was mit dem Problem zusammenhengt...
Und ja, das ist wiedermal so ein komisches Problem... aber ich hoffe ich hab es
diesmal verständlich erklärt so das man mir vielleicht helfen kann. :)

Mastermind

unregistriert

2

10.07.2011, 10:48

Dein Code ist sehr wirr. Es gibt mehrere Kleinigkeiten die man "besser" machen könnte, die aber semantisch erstmal nichts ändern. Das ganze "GetVectorByID Konstrukt ist außerdem so sicher nicht besonders sinnvoll aber seis drum. Es ist ein bisschen schwer was dazu zu sagen weil die Info fehlt in was für einer Funktion deine for-Schleife steckt, aber ich vermute das folgende ist logisch richtiger:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Set it on true, if he is not on the Top of the Object
//Hier wird also die Gravitation angeschaltet so das er fällt
SetGravity(true);

for(vector<CObject>::iterator i = ObjectList.GetVectorByID(1).begin(); i != ObjectList.GetVectorByID(1).end(); ++i)
{

             if(i->IsCollisionOnTopSide(SCharacter) == true)
            {
                cout << "Es gab eine Collision" << endl;
                //Set it on false
                SetGravity(false);
            }
}

3

10.07.2011, 11:22

Omg... ich vollidiot... wo hab ich mein Gehirn gelassen, ich ab sogar als ich deine Antwort
gelesen gedacht, das dass doch im prinzip das gleiche ist wie das was ich jetzt habe obwohl
ich es selbst oben oft genug erwähnt habe das ich drei objekte habe und nur ein Kollisionsobjekt was und
das hätte ja garnicht funktionieren können, weil er jeweils immer nur mit einem Objekt kollisioniert und dadurch
die anderen im else zweig landen und so wieder die Gravitation anschhalten und...
ach bin ich dumm...

Vielen vielen vielen Dank, ich glaube ich wäre dadrauf einfach nicht gekommen, weil man irgendwann
vor lauter Code nicht mehr durchblickt...

Vielleicht noch mal kurz zu GetVectorByID, ich denke schon das es sinnvoll ist, weil ich mir dadurch
ziemlich viel Tipp Arbeit Spare und so das ganze leichter erweitern kann, da ich mit einer Schleife
alle exestierenden Vektoren durchgehe, damit spare ich eine Menge an Tipparbeit, das sieht man allerdings
oben nicht, weil es ja eigentlich auch was das Problem angeht unrelevant ist.
Aber das konntest du ja nicht wissen können, weils oben nicht zu sehen ist, aber nett aber das
du mich darauf hingewiesen hättest. :P

Lg Jack

Ps.: Mhh fange ich an zu schleimen? Ach mir doch egal, ich bin gerade happy, Danke nochmals! :D

Werbeanzeige