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

gorn

Frischling

  • »gorn« ist der Autor dieses Themas

Beiträge: 6

Wohnort: Würzburg

Beruf: Schueler

  • Private Nachricht senden

1

21.01.2007, 16:42

Problem mit der Kollisions-Erkennung mit der SDL

Ich hab das Spiel aus Kapitel 12 ein bisschen erweitert sodass man es zu
zweit spielen kann (einer ist auf der linken Seite einer auf der rechten).

Jetzt will ich testen ob der Schuss des einen Spielers den anderen trifft.
Kollisions-Abfrage von Heiko Kalista funktioniert aber nicht mehr !!!

Kann mir jemand helfen ???

Sheddex

unregistriert

2

21.01.2007, 17:01

Lies dir das was du geschriebe hast mal ganz in Ruhe durch, und du wirst feststellen dass dir mit diesen Infos niemand weiterhelfen kann (ich zumindest nicht).

gorn

Frischling

  • »gorn« ist der Autor dieses Themas

Beiträge: 6

Wohnort: Würzburg

Beruf: Schueler

  • Private Nachricht senden

3

21.01.2007, 18:39

Also noch mal genauer:

Hier ist die IF-Anweißung ob der Schuss des Spielers
den anderen Spieler trifft
(Spieler 1 ist auf der linken Seite des Bildschirms
Spieler 2 auf der rechten) :

if (RectShot.y < RectPlayer.y + RectPlayer.h &&
RectShot.y + RectShot.h > RectPlayer.y &&
RectShot.x < RectPlayer.x + RectPlayer.w &&
RectShot.x + RectShot.w > RectPlayer.x)

4

21.01.2007, 21:48

ich schätze mal diese if-Abfrage steckt in einer Funktion die true oder false zurück gibt!?

Wenn ja und du sie nicht verändert hast sollte sie ja weiterhin funktionieren.

Poste mal den Code wo du sie anwendest. Es wird wohl eher an der Verwendung der Funktion bzw. der Verwaltung deiner Spieler und Schussdaten liegen

gorn

Frischling

  • »gorn« ist der Autor dieses Themas

Beiträge: 6

Wohnort: Würzburg

Beruf: Schueler

  • Private Nachricht senden

5

22.01.2007, 17:18

Ok, hier ist die gesamte Funktion:

// CheckCollisionShot
//
// Aufgabe: Kollisionen zwischen Playern und Schüssen prüfen
//
void CGame::CheckCollisionShot (CPlayer *PlayerShot, CPlayer *PlayerAim)
{

list<CShot> *ShotList = PlayerShot->GetShotList ();
list<CShot>::iterator ItShot;

SDL_Rect RectPlayer;
SDL_Rect RectShot;

RectPlayer = PlayerAim->GetRect ();

for (ItShot = ShotList->begin ();
ItShot != ShotList->end ();
++ItShot)
{
// Rect des Schusses holen
RectShot = ItShot->GetRect ();

if (RectShot.y < RectPlayer.y + RectPlayer.h &&
RectShot.y + RectShot.h > RectPlayer.y &&
RectShot.x < RectPlayer.x + RectPlayer.w &&
RectShot.x + RectShot.w > RectPlayer.x)
{
ItShot->SetAlive(false);
PlayerAim->SubLife(ItShot->DoDamage());
}
}



} // CheckCollisionShot





( Die Funktion SubLife :
void CPlayer:: SubLife (int Damage){m_Life-=Damage;}

Die Funktion DoDamage:
int CShot::DoDamage () {return m_Damage;}
)

6

22.01.2007, 19:47

Du solltest den Itterator mal initialisieren.

C-/C++-Quelltext

1
ItShot = ShotList->begin();

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

23.01.2007, 10:21

Zitat von »"chriss"«

Du solltest den Itterator mal initialisieren.

C-/C++-Quelltext

1
ItShot = ShotList->begin();

Tut er doch, in der for-Schleife.

Aber ich verstehe Deine eigentlich Kollisionsabfrage nicht. Müsste es nicht vielmehr so aussehen?
Pseudo-Code:

Quellcode

1
2
3
4
5
6
7
if ((RectShot.top < RectPlayer.bottom) &&
    (RectShot.bottom > RectPlayer.top) &&
    (RectShot.right < RectPlayer.left) &&
    (RectShot.left > RectPlayer.right))
{
    // ....
}


mit

Quellcode

1
2
3
4
top = y
bottom = y - h
left = x
right = x + w


Ich bin dabei jetzt einfach mal davon ausgegangen, dass x und y die obere linke Ecke des Rechtecks definieren und das Koordinatensystem derart aufgespannt ist, dass die x- und y-Koordinaten nach rechts bzw. nach oben im Wert steigen.
Für sowas ist manchmal ein einfacher Zettel mit 'nem Stift ganz hilfreich.
Kommen Sie nie mit einem Schwert zu einer Schießerei.

gorn

Frischling

  • »gorn« ist der Autor dieses Themas

Beiträge: 6

Wohnort: Würzburg

Beruf: Schueler

  • Private Nachricht senden

8

24.01.2007, 18:54

Geht trotzdem nicht !!!
In Heikos Buch ist es so:

Top = y
Bottom = y + h
Left = x
Right = x + w

Er schreibt nämlich:
...mit der Bedingung

RectShot.y < RectPlayer.y + RectPlayer.h

testet man ob sich die Oberkante des Schusses oberhalb
der Unbterkante des players befindet.

Also sinkt x und y im Wert nach oben!

Ich denke dann muss es folgendermaßen aussehen :


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
 void CGame::CheckCollisionShot (CPlayer *PlayerShot,CPlayer *PlayerAim)
 {
  
  list<CShot> *ShotList = PlayerShot->GetShotList ();
  list<CShot>::iterator ItShot;

  SDL_Rect RectPlayer;
  SDL_Rect RectShot;
  
  RectPlayer = PlayerAim->GetRect ();
  
  for (ItShot = ShotList->begin (); 
       ItShot != ShotList->end ();
       ++ItShot)
    { 
       RectShot = ItShot->GetRect ();
       
       if (RectShot.y < RectPlayer.y + RectPlayer.h &&
               RectShot.y + RectShot.h > RectPlayer.y &&
               RectShot.x < RectPlayer.x + RectPlayer.w &&
               RectShot.x + RectShot.w > RectPlayer.x)
          {
          cout << "YES !!!";
          ItShot->SetAlive(false);
          PlayerAim->SubLife(ItShot->DoDamage());
      }
     
      else
     {
         cout << "\nNO !!!";
     }
    }

    
   
} // CheckCollisionShot


Was mich auch wundert,wenn das Spiel starte einmal schieße und dann gleich woeder beende steht in
der Konsole ungfähr 20mal 'NO !!!' ???
Ich glaub es liegt doch irgendwie an der Schussliste oda so ?????


P.S: trotzdem danke für deine Hilfe !!!

9

28.01.2007, 11:03

Versuch doch einfach, eine eigene Routine zu schreiben. Nimm ein Stück Papier und male mehrere Rechtecke auf, die sich schneiden. Jetzt kannstdu sehr einfach gucken, wie die 4 Eckpunkte sein müssen, damit sie sich schneiden oder eben nicht schneiden.
In der Regel reich es vollkommen aus zu testen, ob irgendein Eckpunkt eines der Rechtecke im anderen Rechteck liegt.
Sich so etwas selber auszudenken ist eine sehr gute Übung, weil man das immer wieder machen muss. Und es selber zu überlegen geht schneller als jemanden danach zu fragen.
Lieber dumm fragen, als dumm bleiben!

gorn

Frischling

  • »gorn« ist der Autor dieses Themas

Beiträge: 6

Wohnort: Würzburg

Beruf: Schueler

  • Private Nachricht senden

10

30.01.2007, 15:49

ES GEHT !!!!

Die Kollisionsabfrage an sich ging,aber ich hab vergessen in der Update-Funktion vom Schuss die X-Position zu updaten!!!
bin halt noch ein anfänger...

:D

Werbeanzeige