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

T-VIRUS

Alter Hase

Beiträge: 548

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

Beruf: Schüler

  • Private Nachricht senden

21

05.10.2007, 14:57

Hallo,
kann es vllt daran liegen, das der Asteroid beim initalisieren nur de namen der bmp bekommt?
Den somit entfällt ie manuelle größe was zu dem Problem führen könnte.
Oder die manuelle initalisierung ist fehlerhaft.
Müsste man mal prüfen.

Ich werde das auch bei meinen "Feinden" prüfen.
Hab da aer die Wete vom Player geklaut :o)

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

22

06.10.2007, 23:54

Verstehe jetzt nicht was du meinst bzw. wie man eventuell das Problem lösen kann.

Bis jetzt ist meine einzige Lösung, die dass ich den 1. Asteroiden gezielt ganz rechts am Bildschirm erscheinen lasse. Somit bin ich erstmal das Problem umgangen. Wenn jetzt der Asteroid abgeschossen wird läuft das Spiel sowie so "normal" weiter.
Wenn der Asteroid nicht durch einen Schuss zerstört wird dann erledigt das letztendlich die "Putzfunktion" wenn der Asteroid die Bildschirmkante erreicht hat. Aber das kann ja keine Lösung sein.

Wieso wird bei der Initialisierung von .bmp Datein die aus mehrer Frames eines Rects bestehen solche Problem? Ich finde dazu sollten mal die Experten was schreiben. Da ist meiner Meinung nach ein generelles Problem zu lösen.
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

23

26.11.2007, 20:48

Hallo,
da ich wieder an dem Spiel bastle kann ich ja meinen Momentanen Stand zur Kollision preisgeben.

Und zwar versuche ich grade eine Pixelgenaue Kollision hinzubekommen.

Im Moment ist das noch alles recht ungenau, da ich entweder nur den Schuss oder durch mehre Schleifen die Asteroiden und Feinde durch jagen kann.

Das ganze ist meiner Meinung nach noch recht unsauber da es zuveiele Schleifen braucht.

Lange rede hier der Quellcode...
http://rafb.net/p/ckY0WE34.html

Ich suche noch eine bessere Lösung.
Falls jemand eine kennt würde ich mich freuen wenn ihr mir helfen könntet.

MFG T-Virus
Meine Blog:)

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

MFG T-VIRUS

Too_noobish

Treue Seele

Beiträge: 165

Wohnort: Wels - Aut

  • Private Nachricht senden

24

10.12.2007, 19:47

Dazu habe ich auch eine Frage:
Ich versuche gerade, eine Kollisionsabfrage zwischen Schiff + Asteroid und Schuss + Asteroid zu machen. Das mit der Abfrage Schuss + Asteroid funktioniert ohne Probleme, jedoch die Abfrage mit Schiff + Asteroid funktioniert nicht so ganz.
Hier mal der relevante 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
void CGame::CheckCollisions ()
{
  // Schussliste des Spielers holen

  list<CShot> *ShotList = m_pPlayer->GetShotList ();

  // Iteratoren für Asteroiden- und Schussliste

  list<CAsteroid>::iterator ItAsteroid = m_AsteroidList.begin ();
  list<CShot>::iterator ItShot;

  // Rects für Asteroiden und Schüsse

  SDL_Rect RectAsteroid;
  SDL_Rect RectShot;

  // Alle Asteroiden durchlaufen

  while (ItAsteroid != m_AsteroidList.end () )
  {
    // Rect des Asteroiden holen

    RectAsteroid = ItAsteroid->GetRect ();

    // Alle Schüsse durchlaufen

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

      RectShot = ItShot->GetRect ();

      // Überschneiden sich die Rects?

      if (RectShot.y < RectAsteroid.y + RectAsteroid.h &&
          RectShot.y + RectShot.h > RectAsteroid.y &&
          RectShot.x < RectAsteroid.x + RectAsteroid.w &&
          RectShot.x + RectShot.w > RectAsteroid.x &&
          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)
      {
        // Ja, also gab es eine Kollision. Somit Schuss und

        // Asteroid deaktivieren

        ItAsteroid->SetAlive (false);
        ItShot->SetAlive (false);
      }
      else if (RectShot.y < RectAsteroid.y + RectAsteroid.h &&
          RectShot.y + RectShot.h > RectAsteroid.y &&
          RectShot.x < RectAsteroid.x + RectAsteroid.w &&
          RectShot.x + RectShot.w > RectAsteroid.x)
      {
          ItAsteroid->SetAlive (false);
          ItShot->SetAlive (false);
      }
      else 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);
      }
      else {}

    }

    // Asteroid löschen, falls deaktiviert

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

  }

}

Bei der Schiff + Asteroid Kollision wird nur der Asteroid gelöscht, wenn ein Schuss aktiv ist und der Asteroid mit dem Schiff kollidiert.
Ich hab keinen Plan, woran es liegt, dass es auch geht, wenn kein Schuss aktiv ist.

EDIT:
Diese Frage bedarf keiner Antwort. Ich bin nur ein Slow-Motion-Denker^^
www.mymuesli.com !!

TigerClaw25

unregistriert

25

11.04.2013, 11:15

Bei mir funktioniert die Kollisionsabfrage nicht. Mein Raumschiff kollidiert alle paar millisekunden, obwohl keine Asteropiden zu sehen sind.

Hier der Code, der nicht anders sein dürfte, als von den anderen Mitgliedern:

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
// CheckCollisions
//
// Aufgabe: Kollisionen zwischen Asteroiden und Schüssen prüfen
//
void CGame::CheckCollisions ()
{
    // Schussliste des Spielers holen
    list<CShot> *ShotList = m_pPlayer->GetShotList ();

    // Iteratoren für Asteroiden- und Schussliste
    list<CAsteroid>::iterator ItAsteroid = m_AsteroidList.begin ();
    list<CShot>::iterator ItShot;

    // Rects für Asteroiden und Schüsse sowie Spieler
    SDL_Rect RectAsteroid;
    SDL_Rect RectShot;
    SDL_Rect RectPlayer;

    // Alle Asteroiden durchlaufen
    while (ItAsteroid != m_AsteroidList.end () )
    {
        // Rect des Asteroiden holen
        RectAsteroid = ItAsteroid->GetRect ();

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

            // Überschneiden sich die Rects?
            if (RectShot.y < RectAsteroid.y + RectAsteroid.h &&
                RectShot.y + RectShot.h > RectAsteroid.y &&
                RectShot.x < RectAsteroid.x + RectAsteroid.w &&
                RectShot.x + RectShot.w > RectAsteroid.x)
            {
            
                // Ja, also gab es eine Kollision. Somit Schuss und
                // Asteroid deaktivieren
                ItAsteroid->SetAlive (false);
                ItShot->SetAlive (false);
                
                m_AsteroidDestroy++;        // Wieviele Asteroiden zerstört?
            
                // Asteriod explodiert -> Soundeffekt
                m_pSoundAsteroid->PlaySound();
                        
            }           

        }

        // Kollision zwischen Asteroid und Spieler prüfen
            RectPlayer = m_pPlayer->GetRect();
            if (RectPlayer.y < RectAsteroid.y + RectAsteroid.h &&
                RectPlayer.y + RectPlayer.h > RectAsteroid.y &&
                RectPlayer.x < RectAsteroid.x + RectAsteroid.w &&
                RectPlayer.x + RectPlayer.w > RectAsteroid.x)
            {
            
                // Ja, also gab es eine Kollision. Somit Schuss und
                // Asteroid deaktivieren
                ItAsteroid->SetAlive (false);
                m_pPlayer->Reset();
                // Asteriod explodiert -> Soundeffekt
                m_pSoundAsteroid->PlaySound();                      
            }

        // Asteroid löschen, falls deaktiviert
        if (ItAsteroid->IsAlive () )
            ItAsteroid++;
        else
            ItAsteroid = m_AsteroidList.erase (ItAsteroid);

    }

} // CheckCollision

Muss ich eventuell in irgend einer Funktion von CPlayer noch etwas hinzufügen?


Eine Möglichkleit würde eventuell darin bestehen, in der CPlayer::Reset Funktion folgendes hinzuzufügen:


// Rect initialisieren
m_Rect.x = static_cast<int>(m_fXPos);
m_Rect.y = static_cast<int>(m_fYPos);
m_Rect.w = m_pSpritePlayer->GetRect().w;
m_Rect.h = m_pSpritePlayer->GetRect().h;

So ähnlich steht es auch in der Asteroid::Init und CShot::Init. Oder aber ich hole mir gleich die Positionen von der CSprite Klasse direkt über eine INstanz in der CPlayer-Klasse

Oder aber ich hole mir gleich in der GetRect()-Funktion von CPlayer das GetRect über ein Sprite-Zeiger ... verstehe nur den Sinn gerade nicht???


EDIT: FUnktioniert zwar, aber sehr unpräzise und mit großer Verzögerung ... Ich fliege also durch eine Asteroiden hindurch und erst nach 0,4 Sekunden etwa wird der Asteroid zerstört.

Zudem versteh ich die Rect Initialisierung in dem Fall einfach nicht ...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Aufgabe: Spielerwerte auf Standard setzen
//
void CPlayer::Reset ()
{
    // Startposition des Spielers
    m_fXPos = 376.0f;
    m_fYPos = 520.0f;

    // Animationsphase
    m_fAnimPhase = 5.0f;

    // Es darf geschossen werden
    m_bShotLock = false;

    // Rect initialisieren (Erweiterung für Kollision zwischen Asteroid und Spieler)
    m_Rect.x = static_cast<int>(m_fXPos);
    m_Rect.y = static_cast<int>(m_fYPos);
    m_Rect.w = m_pSpritePlayer->GetRect().w;
    m_Rect.h = m_pSpritePlayer->GetRect().h;

} // Reset


Wenn ich statt m_fXPos z.B 0 zurückgebe, und nicht die Startposition, dann werden die Asteroiden ununterbrochen zerstört, obwohl keine Kollision stattfindet ...

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »TigerClaw25« (11.04.2013, 11:48)


Werbeanzeige