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

07.11.2011, 16:25

C++ SFML Bounding Box Test

Hallo liebe Leser/innen.
Ich bins mal wieder mit einer dummen Frage!
Also, ich möchte mit dem Kollisionverfahren BoundingBoxTest überprüfen, ob sich 2 Rectangles überlappen.
Ich weiß, dass alles dort vorgegeben ist usw. , aber ich bin zu dumm um es zu benutzen.
Besser gesagt ich verstehe nicht wie man es "aufschreiben" soll bzw. anwendet.
Über ein kleines Beispiel würde ich mich freuen.

Immer, wenn ich das hier schreibe, wird Collision unterstrichen, d.h. dass es in irgendeiner Art und Weise falsch ist, jedoch verstehe ich dies nicht...

C-/C++-Quelltext

1
2
3
4
if(Collision::BoundingBoxTest(ball, bar))
{
Yspeed = 150.f;
}


Hier ist der Link: http://www.sfml-dev.org/wiki/en/sources/…ision_detection

Ich habs ehrlich gesagt noch nicht so wirklich verstanden...

Danke im voraus...
Only God can judge me.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »denniro« (07.11.2011, 16:32)


2

07.11.2011, 20:08

Ist es schei** formuliert, sinnlos oder warum antwortet keiner? ;(
Only God can judge me.

3

07.11.2011, 20:11

Der Code oben ist richtig, falls es sich bei ball und bar um sf::Sprites handelt.
Ich vermute aber, dass du die Collision Klasse einfach falsch eingebunden hast und die Funktion daher nicht bekannt ist.

Lg

4

07.11.2011, 20:21

Der Code oben ist richtig, falls es sich bei ball und bar um sf::Sprites handelt.
Ich vermute aber, dass du die Collision Klasse einfach falsch eingebunden hast und die Funktion daher nicht bekannt ist.

Lg

Danke für deine Antwort, nun zu der Stelle wo es stehen sollte, kannste mir dabei helfen? Hier 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
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <iostream>
#include <SFML\Graphics.hpp>

using namespace std;

sf::FloatRect RectAll(sf::Sprite &sprite)
{
    sf::FloatRect Rect(
    sprite.GetSubRect().Left,
    sprite.GetSubRect().Top,
    sprite.GetSubRect().Right,
    sprite.GetSubRect().Bottom);
    return Rect;
}

int main()
{
    
    sf::RenderWindow app(sf::VideoMode(400, 300,32), "Pong");
    sf::Image image;
    sf::Image image2;
    if(!image.LoadFromFile("bar.png"))
    {
        return EXIT_FAILURE;
    }
        if(!image2.LoadFromFile("ball.png"))
    {
        return EXIT_FAILURE;
    }
    sf::Sprite bar(image);
    sf::Sprite bar2(image);
    sf::Sprite ball(image2);
    bar.SetPosition(app.GetWidth() / 2 - bar.GetSize().x / 2,0);
    bar2.SetPosition(app.GetWidth() / 2 - bar2.GetSize().x / 2,app.GetHeight()-bar2.GetSize().y);
    ball.SetPosition(app.GetWidth() / 2 - 5,app.GetHeight() / 2 - 5);
    ball.SetScale(0.45f,0.5f);
    float Xspeed = 0.f;
    float Yspeed = 150.f;
while(app.IsOpened())
{
    sf::Event Event;
    while(app.GetEvent(Event))
    {
            if(Event.Type == sf::Event::Closed)
            {
                app.Close();
            }
    }
    float ElapsedTime = app.GetFrameTime();
    if (app.GetInput().IsKeyDown(sf::Key::Left) && (bar2.GetPosition().x > 0))
    {
        bar2.Move(-100 * ElapsedTime, 0);
    }
    if (app.GetInput().IsKeyDown(sf::Key::Right) && (bar2.GetPosition().x < app.GetWidth()-bar2.GetSize().x))
    {
        bar2.Move(+100 * ElapsedTime, 0);
    }
    if (app.GetInput().IsKeyDown(sf::Key::A) && (bar.GetPosition().x > 0))
    {
        bar.Move(-100 * ElapsedTime, 0);
    }
    if (app.GetInput().IsKeyDown(sf::Key::D) && (bar.GetPosition().x < app.GetWidth()-bar.GetSize().x))
    {
        bar.Move(+100 * ElapsedTime, 0);
    }

    ball.Move(Xspeed * ElapsedTime,Yspeed * ElapsedTime);

    if(ball.GetPosition().x < 0)
    {
    }
    if(ball.GetPosition().x > app.GetWidth()-ball.GetSize().x)
    {
    }   

    if(Collision::BoundingBoxTest(ball, bar))
    {
    Yspeed = 150.f;
    }

    app.Clear();
    app.Draw(bar);
    app.Draw(bar2);
    app.Draw(ball);
    app.Display();
}
    return EXIT_SUCCESS;
}
Only God can judge me.

5

07.11.2011, 20:23

Was heißt denn unterstrichen? Gibt's Fehlermeldungen? Wenn ja, welche? Inkludierst Du überhaupt collision.hpp? Diese Kollisionsfunktionen sind nämlich nicht Bestandteil von SFML.

6

07.11.2011, 20:27

Was heißt denn unterstrichen? Gibt's Fehlermeldungen? Wenn ja, welche? Inkludierst Du überhaupt collision.hpp? Diese Kollisionsfunktionen sind nämlich nicht Bestandteil von SFML.
Omg.. Wie dumm kann man nur sein, ich dachte die ganze Zeit, dass dieses Collision in SFML drin ist, also dass ich nichts anderes inkludieren muss...


Edit: Ich danke dir vom Herzen, es funktioniert ;DD
Only God can judge me.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »denniro« (07.11.2011, 20:40)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

7

07.11.2011, 20:41

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
sf::FloatRect RectAll(sf::Sprite &sprite)
{
    sf::FloatRect Rect(
    sprite.GetSubRect().Left,
    sprite.GetSubRect().Top,
    sprite.GetSubRect().Right,
    sprite.GetSubRect().Bottom);
    return Rect;
}

So funktioniert das nicht. Mit dem Subrect kannst du angeben welchen Teil des Bildes du Zeichnen willst.
Du musst das Rect mithilfe von GetPosition und GetSize berechnen.
Du kannst es übrigens auch gleich so schreiben:

C-/C++-Quelltext

1
2
3
4
5
6
7
sf::FloatRect RectAll(sf::Sprite &sprite)
{
    return sf::FloatRect(sprite.GetSubRect().Left,
    sprite.GetSubRect().Top,
    sprite.GetSubRect().Right,
    sprite.GetSubRect().Bottom);
}
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

8

07.11.2011, 20:46

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
sf::FloatRect RectAll(sf::Sprite &sprite)
{
    sf::FloatRect Rect(
    sprite.GetSubRect().Left,
    sprite.GetSubRect().Top,
    sprite.GetSubRect().Right,
    sprite.GetSubRect().Bottom);
    return Rect;
}

So funktioniert das nicht. Mit dem Subrect kannst du angeben welchen Teil des Bildes du Zeichnen willst.
Du musst das Rect mithilfe von GetPosition und GetSize berechnen.
Du kannst es übrigens auch gleich so schreiben:

C-/C++-Quelltext

1
2
3
4
5
6
7
sf::FloatRect RectAll(sf::Sprite &sprite)
{
    return sf::FloatRect(sprite.GetSubRect().Left,
    sprite.GetSubRect().Top,
    sprite.GetSubRect().Right,
    sprite.GetSubRect().Bottom);
}

Achso, danke, dass du mich darauf hinweist. Ich denke nicht, dass es eine Schwierigkeit ist es umzuschreiben.
Ich dachte immer man könnte es so machen :S Hmm komisch, naja jetzt weiß ich es ;)
Only God can judge me.

9

07.11.2011, 20:52

Nun ja, das Problem ist, mit dem SubRect gibst Du quasi bei deiner Bilddatei an, welchen Ausschnitt Du nehmen (und später zeichnen) willst. In der Regel hat man bei einem 80x80 Bild dann eben ein Rect mit (0, 0, 80, 80). Beim Rect, welches Du für die Kollisionsüberprüfung brauchst, muss es sich aber auf das gesamte Fenster beziehen (also an welcher Position es anfängt und wie groß es ist), wenn Du oben genanntes Bild mit einem Sprite (Position: sf::Vector2f(100, 500)) zeichnest, dann wäre das Rect (100, 500, 80, 80).

10

08.11.2011, 14:46

Nun ja, das Problem ist, mit dem SubRect gibst Du quasi bei deiner Bilddatei an, welchen Ausschnitt Du nehmen (und später zeichnen) willst. In der Regel hat man bei einem 80x80 Bild dann eben ein Rect mit (0, 0, 80, 80). Beim Rect, welches Du für die Kollisionsüberprüfung brauchst, muss es sich aber auf das gesamte Fenster beziehen (also an welcher Position es anfängt und wie groß es ist), wenn Du oben genanntes Bild mit einem Sprite (Position: sf::Vector2f(100, 500)) zeichnest, dann wäre das Rect (100, 500, 80, 80).

Ahso danke, da hatte ich immer eine komplett andere Vorstellung xD
Ich dachte man muss jede Seite eines Rects angeben, also links-oben-rechts-unten.
Only God can judge me.

Werbeanzeige