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

Frede

Treue Seele

  • »Frede« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hameln

Beruf: Schüler

  • Private Nachricht senden

1

27.05.2006, 22:07

SDL - Kollisionen werden nicht erkannt

Ich bin grade dabei ein Bomberspiel mit der SDL zu entwerfen.
Das klappt schon ganz gut nur bei der Kollisionsabfrage zwischen Energiewelle (von der Bombe) und den Steinen hakts noch...

Die Welle (CFirewall) und die Steine (CMetal) sind beide gleichgroß (50*50pxl).

Er funzt nur wenn die Bombe genau auf dem Stein explodiert. (d.h es entsteht noch nicht mal eine Welle....)

Das ist ein Code-Ausschnitt aus der Funktion des CGames, die Alle Objekte in einzelnen Listen gespeichert hat. (z.B. m_FirewallList)


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
// CheckCollision

//

void CGame::CheckCollision ()
{
    // Iteratoren für alle Listen erstellen

    list<CFirewall>::iterator iFirewalls;
    list<CMetal>::iterator iMetals = m_MetalList.begin ();


      // Rects für Metalle und Firewalls

      SDL_Rect RectFirewall;
      SDL_Rect RectMetal;

      // Alle Metalle durchlaufen

      while (iMetals != m_MetalList.end () )
      {
        // Rect der Metalle holen

        RectMetal = iMetals->GetRect ();

        // Alle Firewalls durchlaufen

        for (iFirewalls = m_FirewallList.begin (); 
             iFirewalls != m_FirewallList.end ();
             ++iFirewalls)
        {
          // Rect der Firewall holen

          RectFirewall = iFirewalls->GetRect ();

          // Überschneiden sich die Rects?

          if (RectFirewall.y < RectMetal.y + RectMetal.h &&
              RectFirewall.y + RectFirewall.h > RectMetal.y &&
              RectFirewall.x < RectMetal.x + RectMetal.w &&
              RectFirewall.x + RectFirewall.w > RectMetal.x)
          {
            // Ja, also gab es eine Kollision. Somit Firewall deaktivieren

            iFirewalls->SetAlive (false);
          }

        }
        iMetals++;

      }

} // CheckCollision


Was habe ich falsch gemacht? :?

P.S Das ist die Abfrage aus C++ für Spieleprogger Kapitel 12 :D

Lemming

Alter Hase

Beiträge: 550

Beruf: Schüler

  • Private Nachricht senden

2

27.05.2006, 22:18

bau in die if anweisung mal mehr klammern ein, ich bezweifele, dass da das abgefragt wird, was du erwartest
Es gibt Probleme, die kann man nicht lösen.
Für alles andere gibt es C++...

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

3

27.05.2006, 22:33

Nein die if-Anweisung ist eindeutig, + und && sind beide assoziativ.

Frede

Treue Seele

  • »Frede« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hameln

Beruf: Schüler

  • Private Nachricht senden

4

28.05.2006, 14:39

Und warum kapiert er's nicht wenn sich die Rects überschneiden ?

Lemming

Alter Hase

Beiträge: 550

Beruf: Schüler

  • Private Nachricht senden

5

28.05.2006, 15:05

so wie ich das verstehe besteht die firewall aus blöcken, der gleichen größe wie die steine. bewegen sich diese firewall blöcke jetzt irgendwie, oder werden die bei der explosion, einfach im raster an die umliegenden punkte gelegt. denn wenn sie einfach auf die umliegenden punkte im raster gelegt würden, dann würde sie, falls sie auf einem block drauf liegen, die selben koordinaten haben. also müssten eine überprüfung alá firewall.x == metal.x && firewall.y == metal.y reichen. kann aber auch sein, dass ich das jetzt falsch verstanden habe. ansonsten zieg doch die ganzen rechnereien mal aus der if anweisung raus und geh mit dem debugger mal schritt für schritt drüber-. dabei sollte sich zeigen, wo der fehler liegt
Es gibt Probleme, die kann man nicht lösen.
Für alles andere gibt es C++...

Frede

Treue Seele

  • »Frede« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hameln

Beruf: Schüler

  • Private Nachricht senden

6

28.05.2006, 20:08

joah, fast.
Die Firewalls, ich denke der etwas unpassende Name hat für Verwirrung gesorgt, bestehen aus EINEM Block.
Die Metals (ebenfalls unpassend = Steine) bewegen sich nicht.
Sie liegen einfach auf der Karte rum...
Die Firewalls werden in alle 4 Richtungen abgeschoßen und da soll dann die Kollisionsbafrage ins Spiel kommen...

Außerdem würde deine Sache mit Metal.x == Firewall.x usw. nicht funzen, da sich die Firewalls ja nicht in 50er Schritten (die Größe der Firewall- und der Steinsprites) bewegen.

Lemming

Alter Hase

Beiträge: 550

Beruf: Schüler

  • Private Nachricht senden

7

28.05.2006, 20:49

Zitat von »"Frede"«

Außerdem würde deine Sache mit Metal.x == Firewall.x usw. nicht funzen, da sich die Firewalls ja nicht in 50er Schritten (die Größe der Firewall- und der Steinsprites) bewegen.

ja genau das war es, was mir nicht klar war...
dann solltest du einfach mal mit dem debugger drüber gehen und alles prüfen, was sich irgendwie prüfen lässt... vorallem auch die bewegung der firewall blöcke prüfen
Es gibt Probleme, die kann man nicht lösen.
Für alles andere gibt es C++...

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

8

31.05.2006, 09:50

also zumindest für den fall dass sie genau aufeinander liegen solltest du aus dem < ein =< machen

Frede

Treue Seele

  • »Frede« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hameln

Beruf: Schüler

  • Private Nachricht senden

9

31.05.2006, 13:32

Shit, na klar! Danke :D !
Die Y-Position ist natürlich gleich, da das Spiel auf einer Art Raster verläuft...
Du bist der Beste ;)

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

10

31.05.2006, 14:20

ich weiß ^.^

Werbeanzeige