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

chazon

Frischling

Beiträge: 56

Wohnort: Zons

  • Private Nachricht senden

11

16.10.2005, 11:27

Es ist schon ein Unterschied ob ein Schuß (also ein relativ
kleines Rechteck) ein größeres Objekt trifft im Gegensatz
zur Kollision zweier größerer Objekte.
Du kanns diese Abfrage auch nur dann so angehen wenn
beide objekte starr bleiben . Wenn sich ein Objekt zum
Beispiel auf den Kopf dreht simmt diese Abfrage nicht mehr.

Hast du schon einmal versucht die Werte der Rechtecke zu prüfen ?

12

18.03.2007, 12:40

Re: Kollisionsabfrage

Zitat von »"chrische5"«

Ich bin gerade dabei das SDL Spiel etwas zu erweitern und wollt daher unter anderm eine Kollisionsabfrage zwischen Schiff und Asteroiden einbauen.

[...]

Was mache ich den nur falsch?


Hallöchen!

Im Zuge meiner Abitur-Informatik-Projektarbeit beschäftige ich mich auch gerade mit der SDL und dem Programmbeispiel aus Heiko Kalistas hervorragendem Buch "C++ für Spieleprogrammierer". Ich habe die "2., erweiterte Auflage" und mir ist bewusst, dass du (chazon) inzwischen schon andere Probleme haben wirst, da ich etwa 17 Monate zu spät komme. Aber vielleicht hat ja auch ein anderer "Lese-Frischling" genau dasselbe Problem (Kollision von Raumschiff und Asteroiden) und stößt vielleicht zufälligerweise auf diesen Thread...

Deshalb ganz kurz und knapp die Lösung (relevanter Quellcode ist grün gekennzeichnet):

Player.hpp

Zitat

class CPlayer
{
public:
CPlayer ();

void Init ();
void Quit ();
void Render ();
void Update ();
void Reset ();
SDL_Rect GetRect();


Player.cpp

Zitat

// Init
//
// Aufgabe: Sprites erzeugen und laden
//
void CPlayer::Init ()
{
// Spielersprite erstellen
m_pSpritePlayer = new CSprite;

m_pSpritePlayer->Load ("Data/Player.bmp", 11, 64,64);
m_pSpritePlayer->SetColorKey (255, 0, 255);

// Schuss-Sprite erstellen
m_pSpriteShot = new CSprite;

m_pSpriteShot->Load ("Data/Laser.bmp", 0, 64, 64);
m_pSpriteShot->SetColorKey (255, 0, 255);

} // Init

SDL_Rect CPlayer::GetRect(void)
{
return m_pSpritePlayer->GetRect();
}



Game.cpp

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

//

// Aufgabe: Kollisionen zwischen Asteroiden und Raumschiff prüfen

//

void CGame::CheckCollisions ()
{ 
        SDL_Rect RectAsteroid;

        list<CAsteroid>::iterator ItAsteroid = m_AsteroidList.begin ();
    
    while (ItAsteroid != m_AsteroidList.end () )
    {

            RectAsteroid = ItAsteroid->GetRect ();

        if (m_pPlayer->GetRect().y < RectAsteroid.y         + RectAsteroid.h &&
            m_pPlayer->GetRect().y + m_pPlayer->GetRect().h > RectAsteroid.y &&
            m_pPlayer->GetRect().x < RectAsteroid.x         + RectAsteroid.w &&
            m_pPlayer->GetRect().x + m_pPlayer->GetRect().w > RectAsteroid.x)

            {   ItAsteroid->SetAlive(false);    }

        if(ItAsteroid->IsAlive() )
            ItAsteroid++;
        else
            ItAsteroid = m_AsteroidList.erase (ItAsteroid);

    }
}
// CheckCollision


Der hier gezeigte Code entfernt die Asteroiden bei Kollision mit dem Raumschiff.
Falls ihr etwas anderes haben wollt, ändert einfach die Anweisung nach ersten if-Abfrage in dem Game.cpp-Codebeispiel.

Viel Spaß, :)

Benny

ecsl

Frischling

Beiträge: 41

Wohnort: Kaiserslautern

Beruf: Meteorologie Student

  • Private Nachricht senden

13

27.03.2007, 21:45

Hi Benny,

klasse ^^ ich konnte es zwar noch net probieren aber das
Problem hab ich auch :-)
Danke das du dich dem angenommen hast.

Eike

Meandor

Frischling

Beiträge: 55

Wohnort: Oberhausen

Beruf: Student

  • Private Nachricht senden

14

01.10.2007, 18:42

Das gleich Problem hatte ich auch!

Hallo habe ein noch etwas anderes Problem mit der Kollisionserkennung.

Bei mir entsteht jedes mal folgendes Phänomen wenn ich die .exe ausführe. Mit den Orginal Sourcen von Heiko K. (nicht verändert!)

Der erste Schuss meines Raumschiffes braucht gar nicht irgendeinen Asteroiden treffen, sondern wird sobald der Schuss auf der gleichen Höhe ist wie der Asteroid (aber z.B. links oder rechts daneben) als Kollision erkannt. -> Der Asteroid wird darauf hin zerstört. Ab dann ist aber das Spiel okay. Ab jetzt zerstört jeder richtig Treffer auch einen Asteroiden. Ich habe den Fehler leider nie finden können.

Aber das gleiche gilt auch bei der Kollisionserkennung zwischen einem Asteroiden und dem Player. Der Player braucht beim ersten mal nur auf der gleichen Höhe zu sein wie der Asteroid und verliert sofort einen Lebenspunkt. (Hatte das Spiel so programmiert das der Player am Anfang 5 Lives hat). Danach ist die Kollisionserkennung zwischen Player und Asteroid so wie man es haben will.

Wie kommt es zu diesen Phänomen irgendwie scheint da ein Zusammenhang zu sein. Wo ist der Bug bei Heiko Kalista im Programm??
Kann es sein das die Kollisionserkennung nicht funktioniert weil am Anfang eventuell die Liste der Asteroiden bzw. der Schüsse leer ist.

Habe schon mehrere Nächte damit zugebracht - leider bisher vergebens
Eventuell kann mir ja hier jemand helfen.

Beste Grüße
WATT, VOLT, AMPERE, OHM
OHNE MICH GIBST KEINEN STROM
"DER ELEKTRO-LURCH" :-)

T-VIRUS

Alter Hase

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

15

02.10.2007, 10:32

Hallo,
ich werde Heutenachmittag mal guken was da los sein könnte.
Ich hab ein ähnliches Problem mit dem Schuss und einem selbsterstelltem "Feindschiff".

Es könnte aber auch daran liegen, das die Ecken des Sprites ja noch da sind, dies aber nur Transparent sind.
Ist nur ne Vermutung.

Aber ich werde mal gucken was ich so machen kann ^^

MFG T-Virus
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

Meandor

Frischling

Beiträge: 55

Wohnort: Oberhausen

Beruf: Student

  • Private Nachricht senden

16

02.10.2007, 13:43

Hallo T-Virus

du brauchst da gar nicht viel gucken. Nehm einfach mal die Orginal Sourcen von Heiko stell die enstprechenden includes und lib rein (genau wie im Buch beschrieben) und compilier das ganze.

Der ersten Schuss den ich abfeuere zerstört schon den ersten Asteroiden ohne Ihn wirklich zu treffen.
(Eventuell wird es klarer wenn du den Timer auf langsam einstellst)

Wie kommt das????
dannach läuft das Spiel so wie es sollte.
WATT, VOLT, AMPERE, OHM
OHNE MICH GIBST KEINEN STROM
"DER ELEKTRO-LURCH" :-)

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

17

02.10.2007, 14:28

DU wir Menschen ohne das Buch können dir so leider nicht weiterhelfen. Also entweder hoffst du auf die Menschen mit dem Buch oder du gibst uns Menschen ohne Buch die Möglichkeit das Problem ebenfalls nachzuvollziehen.

Aber du könntest das ganze mal per Haltepunkt debuggen. Also sprich, da wo der Asteriod zerstört wird setzt du einen Haltepunkt hin und schaust von wo und unter welchen Bedingungen die "Zerstörung" eingeleitet wurde.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Meandor

Frischling

Beiträge: 55

Wohnort: Oberhausen

Beruf: Student

  • Private Nachricht senden

18

04.10.2007, 16:43

Ich glaube wenn ich jetzt alle 8cpp dateien und alle 8 header dateien hier reinstelle dann sprengt das einwenig den Rahmen.
Oder gibt es hier in dem Forum ein Dateien Upload oder welche Alternative habe ich kann dir auch das komplette Projekt per E-mail schicken.

Habe schon versucht im Debug Modus dem Fehler auf die Schliche zu kommen aber dann stürzt jedes mal die Kiste ab. Wenn die Kollision eintritt. (Könnte das sein dass Debugen im Vollbildmodus der SDL nicht so einfach ist.)
WATT, VOLT, AMPERE, OHM
OHNE MICH GIBST KEINEN STROM
"DER ELEKTRO-LURCH" :-)

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

19

04.10.2007, 17:13

Also ohne Debugmodus->no way. Stell das Spiel doch auf Fenstermodus.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Meandor

Frischling

Beiträge: 55

Wohnort: Oberhausen

Beruf: Student

  • Private Nachricht senden

20

04.10.2007, 21:10

Mit dem Abschalten des Vollbildmodus kann ich endlich debuggen!

So habe jetzt heraus gefunden warum es zu Beginn sofort zu einer Kollision kommt. Heikos Programm initialisiert am Anfang die komplette Asteroiden.bmp das Asteroiden m_Rect hat somit zu Beginn die Abmasse von 640x128. (height x width) Somit ist mir zumindest klar warum es eine Kollision gibt. (Zur Erläuterung ein Schuss hat die Maße von 64x64)

Sobald der erste Asteroid zerstört ist (entweder durch einen Schuss oder aber auch dadurch das er am an der Bildschirm Unterkante angekommen ist) hat das Asteroiden m_Rect die korrekten Werte von (64 x64 )

Und die Kollisions Prüfung läuft reibungslos ab.

FRAGE: Wie kommt es dass das Asteroiden Rect am Anfang die Maße 640x128 hat??

Ich denke deshalb gibt es auch Probleme bei der Kollisions Prüfung zwischen Asteroiden und dem Player. Da der Player auch eine größere .bmp Datei hat und nicht sofort die Werte (64x 64) als rect Werte aufweist.
WATT, VOLT, AMPERE, OHM
OHNE MICH GIBST KEINEN STROM
"DER ELEKTRO-LURCH" :-)

Werbeanzeige