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

08.04.2011, 00:17

Sprite Trifft auf anderes Sprite. Suche funktionierende If Anweisung

Hi,
Irgendwie bekomme ich es einfach nicht hin herauszufinden ob sich zwei Sprites berühren oder nicht -.- Sollte ja eigentlich nicht so schwer sein...?
Ich hab jetzt nen Haufen unterschiedlicher Ansätze gehabt, das hier ist mein letzter:

C-/C++-Quelltext

1
2
( PositionSprite.y+Sprite.GetSize().y>=PositionFood.y && PositionSprite.y<=PositionFood.x+Food.GetSize().y ) &&
    ( PositionSprite.x+Sprite.GetSize().x>=PositionFood.x && PositionSprite.x<=PositionFood.x+Food.GetSize().x )


Warum klappt es nicht? Also teilweise klappt es, aber nicht annähernd zufriedenstellend und ich hab echt kein Bock mehr auf rumtesten -.-


Edit: hmm wahrscheinlich wäre es hilfreicher den ganzen Code zu posten. Btw habe ich keine Regeln beim Fehlverhalten feststellen können, nur dass es beim ersten mal immer klappt.

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
    while(App.GetEvent(Event)){
        if (Event.Type==sf::Event::Closed)
            App.Close();
        if ((Event.Type==sf::Event::KeyPressed)&&(Event.Key.Code==sf::Key::Escape))
            App.Close();
        if((Event.Type==sf::Event::KeyPressed)&&(Event.Key.Code==sf::Key::Left)){
            x=-1;
            y=0;
        }
        if((Event.Type==sf::Event::KeyPressed)&&(Event.Key.Code==sf::Key::Right)){
            x=1;
            y=0;
        }
        if((Event.Type==sf::Event::KeyPressed)&&(Event.Key.Code==sf::Key::Up)){
            y=-1;
            x=0;
        }
        if((Event.Type==sf::Event::KeyPressed)&&(Event.Key.Code==sf::Key::Down)){
            y=1;
            x=0;
        }
        if ((Event.Type==sf::Event::MouseButtonPressed)&& (Event.MouseButton.Button==sf::Mouse::Left)){
            if(ctr==0) Clock.Reset();
            ctr++;
        }
        if((Event.Type==sf::Event::KeyPressed)&&(Event.Key.Code==sf::Key::F1)){
            sf::Image Screen=App.Capture();
            Screen.SaveToFile("Screenshot.jpg");
        }

        if(Event.Type==sf::Event::Resized);{
            glViewport(0, 0, Event.Size.Width, Event.Size.Height);
        }
    }


    if(Clock.GetElapsedTime()>=time && ctr>0)
                App.Close();
    if(Clock.GetElapsedTime()>=n && ctr>0){
        cout << n  << endl;
        n++;
    }

    if(
        ( Position.y+Sprite.GetSize().y>=PositionFood.y && Position.y<=PositionFood.x+Food.GetSize().y ) &&
        ( Position.x+Sprite.GetSize().x>=PositionFood.x && Position.x<=PositionFood.x+Food.GetSize().x )


    ){
        speed+=0.1;
        App.Clear(Color);
        Food.SetPosition(rand()%280, rand()%280);
        App.Draw(Food);
        App.Draw(Sprite);
        App.Display();
    }

    if(Clock.GetElapsedTime()>=t/100 && ctr>0){

        Position=Sprite.GetPosition();
        if(Position.y+Sprite.GetSize().y>=App.GetHeight())
            y=-1;
        if(Position.y<=0)
            y=1;
        if(Position.x+Sprite.GetSize().x>=App.GetWidth())
            x=-1;
        if(Position.x<=0)
            x=1;

        App.Clear(Color);
        Sprite.SetPosition(Position.x+1.25*x*speed,Position.y+1.25*y*speed);
        App.Draw(Sprite);
        App.Draw(Food);
        App.Display();
        t++;

    }




}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Ronschk« (08.04.2011, 00:26)


Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

08.04.2011, 00:25

Je nachdem mit was du arbeitest, ließe es sich einfacher angehen. SFML, SDL?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

3

08.04.2011, 00:27

SFML Sorry :)

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

08.04.2011, 00:31

Schau dir mal contains an ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

5

08.04.2011, 02:01

passt intersects nicht besser? immerhin sinds zwei rechtecke.
unter umständen muss du das rechteck anpassen oder mehrere verwenden wenn eins nicht genau genug ist.
"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?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (08.04.2011, 02:08)


6

08.04.2011, 14:38

Schau mal hier, da hatten wir das schon

7

08.04.2011, 16:10

Vielen Dank :)

8

08.04.2011, 17:55

hmm hab da jetzt ein wenig drüber gegrübelt und auch nach der alogrithm datei gesucht um vllt daraus schlau zu werden, aber beides hat zu nichts geführt:
Was meinen die mit TopCoord, LeftCoord etc? Also wie erstelle ich das Rechteck? ist TopCoord die y Koordinate von der linken oberen Ecke, LeftCoord die x Koordinate davon und sind Bottom und right die ybzw x Koordinaten von der unteren, rechten Ecke?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

9

08.04.2011, 17:59

jup.
"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?

Toa

Alter Hase

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

10

09.04.2011, 02:51

Wie sehen die Sprites denn aus? Eventuell kannst du was mit bounding boxes basteln.
Beispielsweise so:

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
class CCircle

{

private:

     

    Vector m_vPos;

    float  m_fRadius;

 
public:

 
    CCircle(): m_vPos(),m_fRadius(0) {}

     CCircle(const CCircle &copy): m_vPos(copy.m_vPos),m_fRadius(copy.m_fRadius) {}

    CCircle(const Vector &vPos,float fRad) : m_vPos(vPos),m_fRadius(fRad) {}

 
    void Set(const Vector &vPos,float fRad) { m_vPos = vPos; m_fRadius = fRad; }

     void Move(const Vector &vMove) { m_vPos += vMove; }

 
    bool Intersect(const CCircle &Circ) 

    { 

        return ((m_vPos.x - Circ.m_vPos.x) * (m_vPos.x - Circ.m_vPos.x) + 

                (m_vPos.y - Circ.m_vPos.y) * (m_vPos.y - Circ.m_vPos.y)) <= 

                (m_fRadius + Circ.m_fRadius) * (m_fRadius + Circ.m_fRadius);

    }

};


Grüße Toa

€Dit: Nachtrag für den Post unter mir: Tut mir leid, hatte heute nacht nur den Eingangspost gelesen. Aber es ist ist nicht falsch auch mal was von Bounding Circles gehört zu haben :)
"Das ist ein Minkovski Raum, manche Menschen nennen ihn auch Weltraum" Prof. Dr. Jürgen Wambach, Theoretische Physik, TU Darmstadt | Meine Homepage

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Toa« (09.04.2011, 11:29)


Werbeanzeige