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

11

23.02.2009, 23:15

Hach es funktioniert jetzt alles super :)
Danke für eure Hilfe.
Ihr seid suuupiiiii :p
------------------

Jonny :)

12

07.03.2009, 23:26

Verschiedene Level

So ich bin jetzt dabei verschiedene Level zu machen.
Ich habe schon in der Game.cpp, dass ab einem bestimmten Level mehr Asteroiden kommen. Das funktioniert auch prima.

Doch jetzt möchte ich auch, dass ab bestimmten Leveln die Asteroiden schneller fliegen.
Ich erhöhe in der Update Funktion von CPlayer nach einem bestimmten Punktestand das Level.

Dazu habe ich noch folgende Funktionen und Zeiger in CPlayer:

C-/C++-Quelltext

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

        private: 
        int m_Level;              //Aktuelles Level

        CPlayer *m_Player;   //Zeiger auf Spieler-Klasse


Jetzt dachte ich mir halt, dass ich das einfach mit if-Bedingungen in CAsteroid mache:

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

//

//Aufgabe: Asteroid bewegen und Position prüfen

//

void CAsteroid::Update ()
{

    if (m_Player->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;
             } 

    }
  
       if (m_Player->GetLevel() == 2)
       { 
           .....
        }

}



Der Compiler gibt keine Fehlermeldungen oder Warnungen aus.
Ich habe bereits den Debugger drüberlaufen lassen, aber auch er findet nichts. Jedoch wenn ich die Exe öffne, komme ich für eine halbe Sekunde etwa ins Spiel und dann stürzt es ab.
Das finde ich schon etwas mysteriös.
Es denke, es liegt an dieser Funktion...
Weis jemand von euch woran das liegen könnte?

[/cpp]
------------------

Jonny :)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

13

07.03.2009, 23:36

Ist es Absicht, dass du das hier anderst hast?

C-/C++-Quelltext

1
if (m_pPlayer->GetLevel() == 2) 


Ansonsten würde ich den Fehler mal bei dem Zeiger vermuten. Ist der auch immer gültig?

14

08.03.2009, 11:29

Nein das war keine Absicht, war ein Tippfehler.

Wann ist ein Zeiger nicht gültig?
Ich habe ja den Zeiger in der CAsteroid.hpp deklariert, und in der Init-Funktion dann auf NULL gesetzt.
Und dann kommt diese Funktion. Ich denke schon, dass der Zeiger funktioniert, da wenn ich eingebe:

m_Player->

kommen die ganzen Variablen und Funktionen aus CPlayer zur Auswahl.
Heißt das nicht, dass der Zeiger auf die Klasse funktioniert?
------------------

Jonny :)

15

08.03.2009, 20:43

Moment.. du hast den Zeiger auf NULL gesetzt und benutzt ihn dann auch so?
Oder hab ich das falsch verstanden?

Solltest du nicht eher den Zeiger auf die Adresse der Spielerklasse setzen?

16

08.03.2009, 20:47

Ein Zeiger ist ungültig, wenn er auf kein Objekt seines Typs zeigt. Einen Zeiger auf NULL zu setzen markeiert ihn als ungültig.
Und die DropDown-Liste hat nix zu bedeuten, die ist von intellisense, 1. geht das nur nach den Typen, einen Wert hat der zeiger ja zu diesem Zeitounkt noch gar nicht; 2. bauts sowieso gerne schonmal ziemlichen mist.

17

09.03.2009, 17:01

Ich habe jetzt ein bisschen rumprobiert.
Funktionieren tut es zwar immer noch nicht, aber immerhi stürzt das Programm nicht mehr ab. :lol:

Ich habe jetzt noch eine Instanz von CPlayer einfach in die Init-Funktion von CAsteroid geschrieben.
Jetzt funktioniert es auch soweit, nur dass wenn dann eben Level 2 ist,
das nicht realisiert wird von CAsteroid, und die Asteroiden bewegen sich immer noch mit der gleichen Geschwindigkeit.

Hat da jemand irgendeinen Tipp?
------------------

Jonny :)

18

09.03.2009, 17:05

wie/wann erhöhst du denn die Geschwindkeit der asteroiden?

19

09.03.2009, 17:15

Na wenn des Level höher wird, sollen sich die Asteroiden schneller bewegen.

Das Level wird bei ner bestimmten Punktzahl erhöht in der Funktion UpdateLevel() in CPlayer.

Diese Funktion wird in CGame::Run() aufgerufen, bevor die Asteroiden geupdatet und gerendert werden. Von da an müsste CAsteroid ja eigentlich wissen welches Level gerade ist.
------------------

Jonny :)

20

09.03.2009, 18:52

was genau tut UpdateLevel()? gib mal UpdatePlayer(), von dieser aufgerufene eigene funktionen und die stelle, wo die geschwindigkeit des asteroiden berechnet wird.

Werbeanzeige