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

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

21

08.04.2013, 17:57

SetAlive musst du so verändern, dass wenn die Variable, die zählt, wie oft der Asteroid getroffen wurde gleich dem Maximum an Treffern ist, die ein Asteroid wegstecken kann, die Variable, die angibt, dass der Asteroid noch "am Leben" ist auf false gesetzt wird und wenn die Variable darunter ist, dass der Counter dann erhöht wird.

Beispiel:

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
// Klassendefinition der Asteroidenklasse
class Asteroid
{
...
private:
int m_hitcount;
bool m_alive;
...
public:
void SetAlive(bool alive); // Passender wäre Hit
...
};

// Implementierung von Asteroid::SetAlive

void Asteroid::SetAlive(bool alive)
{
 if( alive == false )
 {
   if( m_hitcount == 2) // Hier kann auch mit einer Variable verglichen werden
   {
     m_alive = false;
   } else (m_hitcount < 2 ) {
     m_hitcount++;
   }
  } else {
     m_alive = true; // Wann ist das der Fall???
  }
}

// Implementierung von Asteroid::IsAlive
bool Asteroid::IsAlive()
{
 return m_alive;
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »patrick246« (08.04.2013, 22:14)


TigerClaw25

unregistriert

22

08.04.2013, 18:18

Dank dir erstmal, werde das Ganze nochmal durchgehen. Hab das Problem, dass mir nie klar ist, welche Variable wo deklariert wird. Wenn ich die Variable beispielswes in der Asteroidenklasse deklariere, kann ich auf diese nur uEber eine Memberfunktion zugreifen oder mir diese ueber eine Funktion zurrueckgeben lAssen und diese dann einer Variablen in CGame Klasse zuweisen. Das ist aber zu kompliziert.

Spaeter bei der Implementierung eins Highscores und Levels wird es bestimmt nochmal schwieriger ...

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

23

08.04.2013, 19:12

Du kannst natürlich die Variable m_alive public machen und in alive umbenennen, dann kannst du über ItAsteroid->alive = false; den Zustand verändern

TigerClaw25

unregistriert

24

08.04.2013, 19:39

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
// SetAlive
//
// Aufgabe: -
//
void CAsteroid::SetAlive (bool bIsAlive) 
{
    
    if (bIsAlive == false)
    {
        if (m_HitCount==2)
        {
            m_bIsAlive = false;
        }
        else if (m_HitCount<2)
        {
            m_HitCount++;
        }
    }
    else
    {
        m_bIsAlive = true;

    }
    
}
// SetAlive


meine Asteroiden gehen nach einem treffer kaputt, klappt irgendwie nicht ...

Und eigentlich kann das auch garnicht funktionieren, denn wenn ich richtig überlege, wird die HitCount Variable immer auf NULL gesetzt. Ich müsste das ganze schon in der void CGame::CheckCollisions () abfangen, und nicht in der Funktion SetAlive

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »TigerClaw25« (08.04.2013, 20:16)


Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

25

08.04.2013, 20:10

Deine Klammersyntax ist falsch ;)

Das else gehört bei dir nicht zum if(bIsAlive == false) sondern zu if(m_HitCount==2)
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

TigerClaw25

unregistriert

26

08.04.2013, 20:12

Funktioniert trotzdem nicht

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

27

08.04.2013, 20:19

Schon mit dem Debugger drüber gegangen?
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

TigerClaw25

unregistriert

28

08.04.2013, 20:30

joa, aber irgendwie klappts nicht ... rufe die Funktion auf und der läuft dann einfach weiter, wie vorher bei einem Schuss auch ...

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

29

08.04.2013, 20:34

Kann es sein, dass du noch ein Cooldown einbauen musst? Es kann sein, dass der Klick in zwei Frames hintereinander gezählt wird und deshalb der Asteroid sofort kaputt geht.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

30

08.04.2013, 20:55

Du kannst natürlich die Variable m_alive public machen und in alive umbenennen, dann kannst du über ItAsteroid->alive = false; den Zustand verändern

WTF, bloß nicht!

Ein Breakpoint in der Funktion würde das Problem übrigens sehr einfach aufzeigen. Den Callstack gibt's ja nämlich auch noch.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige