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

21

09.03.2009, 20:18

Zitat von »"JoNnY"«

Ich habe jetzt noch eine Instanz von CPlayer einfach in die Init-Funktion von CAsteroid geschrieben.


Wie soll ich das verstehen? Hast du jetzt zwei verschiedene Instanzen von CPlayer erzeugt? Falls ja, dann ist das der falsche Weg.

Poste mal am besten alles an Code das mit dem zu tun hat bzw du geändert hast

22

09.03.2009, 21:06

Ja das habi ich jetzt im Nachhinein auch wieder geändert.

CPlayer.hpp:

C-/C++-Quelltext

1
2
3
4
5
6
public:
    void SetLevel  (int Level)    {m_Level = Level;}
    int GetLevel()                {return m_Level;}

private:
    int m_Level;              //Aktuelles Level


CPlayer.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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
    m_Level = 1;  // in Init Funktion


void CPlayer::UpdateLevel()
{
  //Level je nach Punktestand erhöhen

  if (m_Points < 300)
  {
      m_Level = 1;
  }
  if (m_Points >= 300)
  {
      m_Level = 2;
  }
  if (m_Points >= 800)
  {
      m_Level = 3;
  }
  if (m_Points >= 1200)
  {
      m_Level = 4;
  }
  if (m_Points >= 2000)
  {
      m_Level = 5;
  }
  if (m_Points >= 2500)
  {
      m_Level = 6;
  }
  if (m_Points >= 3000)
  {
      m_Level = 7;
  }
  if (m_Points >= 4000)
  {
      m_Level = 8;
  }
  if (m_Points >=5500)
  {
      m_Level = 9;
  }
  if (m_Points >= 8000)
  {
      m_Level = 10;
  }

}


CAsteroid.hpp:

C-/C++-Quelltext

1
2
3
#include "Player.hpp"
private:
    CPlayer *m_pPlayer;


CAsteroid.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
void CAsteroid::Update ()
{
  m_pPlayer->UpdateLevel();

  if (m_pPlayer->GetLevel() < 2)
  {
  m_fYPos += 200.0f * g_pTimer->GetElapsed ();

  m_Rect.y = static_cast<int>(m_fYPos);

  //Animieren

  m_fAnimPhase += 10.0f * g_pTimer->GetElapsed ();

  //Prüfen, ob die Animation am Ende angelangt ist

  if (m_fAnimPhase >= 20.0f)
    m_fAnimPhase = m_fAnimPhase - 20.0f;

  //Deaktivieren, falls außerhalb des Bildschirms

  if (m_fYPos > 590.0f)
  {
    m_bIsAlive = false;
  } 
  }

  else
  { 
       ....
   }

} // Update



Vielleicht bringt euch ja die Run-Funktion aus CGame noch etwas:

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

//

// Aufgabe: Hauptschleife des Spiels

//

void CGame::Run ()
{
  // Hauptschleife des Spiels durchlaufen

  //

  while (m_bGameRun == true)
  {
    // Events bearbeiten

    ProcessEvents ();

    // Framework updaten und Buffer löschen

    g_pFramework->Update ();
    g_pFramework->Clear ();

    // Hintergrundbild rendern

    m_pSpriteBackground->Render ();

    //Level aktualisieren

    m_pPlayer->UpdateLevel ();

    // Neue Asteroiden hinzufügen

    SpawnAsteroids ();

    // Kollisionen prüfen

    CheckCollisions ();

    //Spieler-Kollisisonen prüfen

    CheckPlayerCollisions();


        //Hier werden noch Texte gerendert, habe ich aber rausgelassen, 

        //daran wirds wohl eher nicht liegen... kürzerer Source


    // Asteroiden rendern

    RenderAsteroids ();

    // Spieler updaten und rendern

    m_pPlayer->Update ();
    m_pPlayer->Render ();

    //Explosionen rendern

    RenderExplosions1 ();
    RenderExplosions2 ();

    // Buffer flippen

    g_pFramework->Flip ();

  }

} // Run
------------------

Jonny :)

23

09.03.2009, 21:53

Hmm die Stelle an der du m_pPlayer aus CAsteroid einen Wert zuweist währ schön zu sehen. Wird wahrscheinlich in der Init funktion sein..
Weil ich vermute du bist ein wenig auf dem falschen Weg

24

09.03.2009, 22:20

Wie einen wert zuweist?
Ich hatte ja mal m_pPlayer = NULL; aber das soll ich ja nicht, da der Zeiger dann uungültig wird.
Mhh ich verstehe nicht ganz was du meisnt tschuldigung.

Und hättest du einen Vorschlag wie ich anders an mein Ziel komme?
Mir fällt da jetzt spontan nicht so wahnsinnig viel ein :)

LG,
Jonny
------------------

Jonny :)

25

09.03.2009, 22:35

Lieg ich wohl mit meiner Vermutung richtig =) Ich lege dir zu herzen die sache mit den Zeiger nochmal ein wenig anzugucken..

Folgendes:
Du hast in der klasse CGame einen Zeiger auf CPlayer.. m_pPlayer. Dann erstellst du per new eine neue Instanz der Klasse und speicherst die Adresse auf diese INstanz in deinem Zeiger...

Was du jetzt glaubst:
Wenn du irgendwo ganz anderes (in dem Fall CAstroid) einen zweiten Zeiger des Types CPlayer* erstellst heißt das nicht automatisch das dieser auf die gleiche Adresse zeigt wie das Orginal. Das sind komplett zwei unterschiedliche Variablen und dein zweiter Zeiger zeigt irgendwo hin je nach dem was gerade im Speicher steht.. aber nicht dahin wo du willst...
Auch das neu erstellen von CPlayer im neuen Zeiger wird nichts nützen weil du dann zwei verschiedene Instanzen im Speicher hast...


Mein Vorschlag:
Füge der Init funktion der Astroiden noch einen Parameter den du Level nennst... zusätzlich noch einen privaten int (oder float) den du m_Speed nennen kannst...
Nun berechnest du beim erstellen des Astroiden die Geschwindigkeit die er haben sollte (also in der INIT funktion) und speicherst dies in m_Speed ab...
Die Move funktion des Astroiden änderst du so ab das der Astroid jeweils um m_Speed fortbewegt wird..


In etwa so:

Die Init Funktion des Astroiden:

C-/C++-Quelltext

1
2
3
4
void CAstroid::Init(int Level) {
if(Level==1) m_Speed=15;
if(Level==2) m_Speed=17;
//.... besser eine switch abfrage oder allgemeine formel (m_Speed=Level*5)

Der Astroid wird ja in CGames erstellt... da hast du auch den richtigen Zeiger zum CPlayer deshalb kannst du dort einfach zur Init funktion das m_pPlayer->GetLevel() einbauen


Kannst du mir folgen? =/

26

10.03.2009, 13:46

Wow :shock:
Da sitze ich tagelang da und verstehe nicht wieso das nicht funktioniert...
Und dabei ist es so simpel :)

Vielen Dank, und ja, das mit den Zeigern ist wirklich nicht so meins :)

Das muss ich mir in der Tat nochmals zu Gemüte führen :)
------------------

Jonny :)

Werbeanzeige