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

little_Progger

Treue Seele

Beiträge: 188

Wohnort: Nähe Bielefeld

Beruf: Azubi

  • Private Nachricht senden

31

19.04.2010, 17:52

Also ich habe das Menü komplett abgetrennt vom gesamten Spielablauf aufgebaut.
Ich denke mal du willst, dass die mit esc oder so nur pausierst und dann ins menü kommst oder?!

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

32

19.04.2010, 17:57

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void CGame::Run ()
{
    while (m_bGameRun == true)
    {
        switch (m_GamePhase)
        {
        case (0):
            {
                ProcessEvents ();

                g_pMenu->RenderMenu ();

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


                g_pFramework->Flip ();

            }break;


Du renderst das Menü und leerst dann das Framework und flippst es dann... Die Reihenfolge ist verkehrt :P
Erst updaten, clearen, RENDERN, flippen, updaten, rendern, clearen...(...)
Ich denke, das ist das Problem.

EDIT: Was mir auch auffällt ... Du hast für das Menü eine eigene Methode für die Events etc. geschrieben.
Du kannst diese Verwirrung vermeiden wenn du die Events dem Framework überlasst und immer nur die rauspickst, die du willst!
WIP Website: kevinheese.de

ZIR

Frischling

  • »ZIR« ist der Autor dieses Themas
  • Private Nachricht senden

33

19.04.2010, 18:29

hm irgendwie versteh ich das nicht ganz wie du das meinst könntest du vielleicht mal an dem code zeigen in welcher reihenfolge das sein muss?

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

34

19.04.2010, 18:38

Damit etwas render kannst musst du das Framework ja erstmal wieder updaten & clearen.
Also die Renderfunktion des Menüs muss nach dem clearen und vor dem flippen kommen :P wird auch im Buch genauer erklärt, wieso!
WIP Website: kevinheese.de

ZIR

Frischling

  • »ZIR« ist der Autor dieses Themas
  • Private Nachricht senden

35

19.04.2010, 18:48

Also so?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
ProcessEvents ();

g_pFramework->Update ();

g_pFramework->Clear ();

g_pMenu->RenderMenu ();

g_pFramework->Flip ();

Wenn ja es stürzt trotzdem noch ab.

€:Falls es wem hilft sind hier nochmal alle dateien. http://www.filedropper.com/asteroids
€€: Hat sich gegessen, ich habe mal wieder meinen typischen Fehler gemacht-.-
Habe vergessen Speicher für den CSprite pointer zu allozieren und habe alles auf den Nullpointer angewendet. Ich sollte wirklich mal anfangen in meinen Code Fehlerabfragen einzufügen.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »ZIR« (19.04.2010, 21:01)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

36

19.04.2010, 22:32

das ziel der technik mit einer einzigen schleife ist es code zu sparen. das ist auch sicherer weil du das flippen und clearen in neuen gamestates nicht vergessen kannst.

bsp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 while (m_bGameRun == true)
    {
        ProcessEvents ();
        g_pFramework->Clear ();

        switch (m_GamePhase)
        {
        case (0):
            {
                //menü
            }break;
        case (1):
            {
                // spiel
            }break;
        }
       g_pFramework->Flip ();
    }


die sache mit dem enum ist wirklich praktisch. schau dir das mal an. wenn dein spiel noch größer wird platzt deine mainfunktion aus allen nähten.
also um deine frage zu beantworten: ja es ist ratsam für jeden gamestate ne eigene klasse zu schreiben. eine verwaltet das menü, die andere das spiel usw.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

ZIR

Frischling

  • »ZIR« ist der Autor dieses Themas
  • Private Nachricht senden

37

21.04.2010, 23:19

Ich werde mich irgendwann mal, wenn ich die Grundfunktionen des Spiels noch dazugefügt habe daran, mal den Code ein bisschen besser zu gestalten. Naja ich habe das nächste Problem. ich möchte mit TTF den Highscore auf dem Bildschirm ausgeben. Aufjedenfall erfordet die Funktion TTF_RenderText_Solid als Parameter für den auszugebenden text eine (char*) Variable, aber meine Highscore Variable ist ein int Wert. Ich habe nun versucht den int Wert in einen (char*) zu casten, was aber zu einem Absturz meines Programmes führt. Ich habe es auch versucht als erstes den int Wert in einen char zu casten und dann anschließend mit dem Adreesoperator * die Adresse zu überreichen, dadurch wird aber dann nur ein sich ändernder Zahlenwert ausgegeben, bisschen etwas aus Zahlen und Zeichen bestehendes.

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

38

21.04.2010, 23:30

Hatte damals auch das Problem XD.
Ich gib dir den selben Tipp, den ich bekommen habe:
stringstreams! ( Klick für Referenz )

Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
#include <sstream>

// ...
std::stringstream myText;
int myInt = 3;

myText.clear(); 
myText.str("");
myText << myInt; 

// ...
WIP Website: kevinheese.de

ZIR

Frischling

  • »ZIR« ist der Autor dieses Themas
  • Private Nachricht senden

39

22.04.2010, 07:32

So ich habe jetzt den Highscore in den stringstream geschrieben aber irgendwie muss ich den ja trotzdem noch casten.

little_Progger

Treue Seele

Beiträge: 188

Wohnort: Nähe Bielefeld

Beruf: Azubi

  • Private Nachricht senden

40

22.04.2010, 14:07

du kannst den string direkt so der funktion ttf_rendertext_solid übergeben.

Hier ein Auszug aus meiner Text.cpp:

C-/C++-Quelltext

1
2
3
4
5
6
std::stringstream Text; 

    Text << Number;

    // Fertigen Text in den Message Pointer laden
    m_pMessage = TTF_RenderText_Solid(m_pFont, Text.str().c_str(), m_FontColor);


So kannste das machen.

Werbeanzeige