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

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

1

09.04.2009, 14:49

Nochmal wegen Collision

Hallo,

ich hab ein Problem bei meinem aktuellem Spiel.

Und zwar bei der Kollisionserkennung. Die zwar eigentlich funktioniert aber dann doch wieder nicht. Hmm also ich versuchs mal zu beschreiben.

Spieler 2 hat 5 leben. Schiest Spieler 1 nun und trifft Spieler2 verschwindet der Schuss (das ist gut also hat die Erkennung funktioniert). Nur hört er nicht mehr auf zu zählen.
Irgendwann hat Spieler 2 -1000 Leben xD

edit: Jeder Spieler kann immer nur einen Schuss abfeuern. Und erst wieder feuern wenn der andere weg ist.

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
void CGame::CheckCollisions()
{

    CShot *pShotPlayer1=NULL;
    CShot *pShotPlayer2=NULL;

    pShotPlayer1= m_pPlayer1->GetShotPlayer ();
    pShotPlayer2 = m_pPlayer2->GetShotPlayer ();

    SDL_Rect ShotPlayer1=pShotPlayer1->GetRect ();
    SDL_Rect ShotPlayer2=pShotPlayer2->GetRect ();

    SDL_Rect Player1= m_pPlayer1->GetRect ();
    SDL_Rect Player2= m_pPlayer2->GetRect ();

    //Kollision prüfen


    if   (ShotPlayer1.y < Player2.y + Player2.h &&
          ShotPlayer1.y + ShotPlayer1.h >Player2.y &&
          ShotPlayer1.x < Player2.x + 64 &&
         ShotPlayer1.x + 64> Player2.x)
      {
        m_pPlayer2->SetALive(1);
        pShotPlayer1->SetALive(false);
      }


}


Wo könnte solch ein Fehler liegen?

physX

Treue Seele

Beiträge: 119

Wohnort: Dresden

  • Private Nachricht senden

2

09.04.2009, 14:58

Re: Nochmal wegen Collision

Hmmm, aus dem Code, den du gepostet hast lässt sich schwer sagen was genau passiert.

sollte m_pPlayer2 nicht ebenfalls nach dem Treffer auf false gesetzt werden? Ansonsten würd ich das runterzählen der leben mal mit einer Abfrage abfangen.
Ansonsten mal posten wie du genau die SpielerLeben kontrollierst;
Gruss


Zitat von »"Errschaffer"«

Hallo,
Spieler 2 hat 5 leben. Schiest Spieler 1 nun und trifft Spieler2 verschwindet der Schuss (das ist gut also hat die Erkennung funktioniert). Nur hört er nicht mehr auf zu zählen.
Irgendwann hat Spieler 2 -1000 Leben xD

C-/C++-Quelltext

1
2
3
4
5
6
7
      {
        m_pPlayer2->SetALive(1);
        pShotPlayer1->SetALive(false);
      }


}


Wo könnte solch ein Fehler liegen?

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

3

09.04.2009, 15:21

1. Solltest du uns vielleicht auch SetAlive vom Spieler posten...
2. Nachdem du den Schuss "getötet" hast, löschst du ihn auch aus der Liste?

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

4

09.04.2009, 15:26

1. void SetALive (int Live) {m_Lives -= Live;}

2. Es gibt keine Liste. Wäre ja auch unnötig wenn jeder Spieler eh nur einen Schuss auf dem Bildschirm haben kann.

Hier mal die Schuss funktion

Da sich die Schüsse unterschiedlich verhalten muss ich mir merken wer gerade schiest. Deswegen die bool Werte.

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
void CPlayer::ProcessShot(bool Player1, bool Player2)
{

if (Player1)
{
  if((g_pFramework->KeyDown(SDLK_l))&& (!m_bShotLockPlayer1) && (!m_pShotPlayer->GetALive ()))
  {
      m_pShotPlayer=NULL;
      m_pShotPlayer= new CShot;
      m_pShotPlayer->Init (m_pSpriteShotPlayer,m_fXPos,m_fYPos);
      
      //Sound abspielen

      m_pSoundShot->Play ();

      m_bShotLockPlayer1=true;
  }
  


}


if (Player2)
{
    if((g_pFramework->KeyDown(SDLK_q))&& (!m_bShotLockPlayer2) && (!m_pShotPlayer->GetALive ()))
  {
      m_pShotPlayer = NULL;
      m_pShotPlayer= new CShot;
      m_pShotPlayer->Init (m_pSpriteShotPlayer,m_fXPos,m_fYPos);

      //Sound abspielen

      m_pSoundShot->Play ();

      m_bShotLockPlayer2=true;
  }
  



}

5

09.04.2009, 15:32

C-/C++-Quelltext

1
pShotPlayer1->SetALive(false);


Müsste das, um dem Schuss 1 Leben abzuziehen, damit er nichtmehr lebt, nicht so heißen:

C-/C++-Quelltext

1
pShotPlayer1->SetALive(1); 

:?:

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

6

09.04.2009, 15:38

Gut dann zählt er zwar nicht ständig runter aber trotzdem immer noch jedesmal -27 anstatt -1 Leben.

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

7

09.04.2009, 15:48

Also irgendwie versteh ich es nicht ganz, der Schuss soll doch sofort sterben oder? deshalb ist das false doch wohl auch richtig... das funktioniert ja auch, so wie du sagtest (jedenfalls verschwindet er)
Außerdem zählt er konstant immer -1, und hört nicht mehr auf, oder zählt er jedesmal -27 wenn er getroffen wird, oder zählt er konstant immer um 27 runter?!
Und du machst immer new CShot... aber wann deletest du? das ist vielleicht nicht der Fehler, aber möglicherweise ein Memoryleak

Edit: bau in der Kollision, falls getroffen wurde mal bitte noch eine IsAlive() überprüfung des Shots ein, und guck mal, ob sich was ändert

8

09.04.2009, 15:58

n0_0ne void SetALive(int Live) {m_Lives -= Live;}
Er setzt mit false die Leben nicht auf 0, sondern er zieht 0 ab.

Errschaffer Mir fällt gerade ein, dass du bei deiner Kollisionsabfrage garnicht überprüfst, ob der Schuss überhaupt "lebt".
Daran könnte es evtl. liegen?

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

9

09.04.2009, 15:58

1. Wenn ich bei der Kollision den Schuss deaktiviere und false angebe zählt er unendlich runter.

2. Gebe ich eine 1 an zählt er 27 runter

3: zum edit: jetzt kommts... bei einer Prüfung ob der Schuss noch da ist zählt er 17 runter xD

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

10

09.04.2009, 16:24

Zitat von »"defaultplayer^^

n0_0ne void SetALive(int Live) {m_Lives -= Live;}
Er setzt mit false die Leben nicht auf 0, sondern er zieht 0 ab.

Errschaffer Mir fällt gerade ein, dass du bei deiner Kollisionsabfrage garnicht überprüfst, ob der Schuss überhaupt "lebt".
Daran könnte es evtl. liegen?


Also bei mir (und so war es auch standardmäßig im buch) konnte man CShot entweder leben lassen SetAlive(true) oder killen mit false... da gab es keine HP für die Shots, deshalb dachte ich, das wäre hier auch so (finde ich auch sinnvoller...)
Außerdem hab ich deine Idee, direkt im Post drüber selbst geschrieben... vielleicht solltest du mal lesen was ich schreibe ^^
@Errschaffer, sry ich bin raus, komme da nichtmehr mit xD

Werbeanzeige