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

TigerClaw25

unregistriert

21

30.04.2013, 21:10

Den Artikel habe ich bereits gefunden. Duerfte sich auf das Sdl Spiel uebertragen lassen. Melde mich, falls ich es nicht hinbekomme.

Edit: Hab den Artikel soweit durch. Aber ich glaube, dass meine Erfahrungen nicht ausreichen, um das Ganze auf mein Spiel zu übertragen :(

Müsste einiges Ändern und verliere jetzt schon die Übersicht.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TigerClaw25« (30.04.2013, 22:49)


22

30.04.2013, 23:11

Wenn du noch Schwierigkeiten mit Vererbung und Polymorphie hast, macht der Ansatz für dich keinen Sinn. Zwei Möglichkeiten hast du: Entweder du überlegst dir ne eigene Methode, eine, wo du mit deinem bisherigen Kenntnissen Durchblickst. Oder du liest dir noch mal was über die o.g. Themen durch, dann erschließt sich der Sinn von allein. Das ist der Wahrheit. :(

TigerClaw25

unregistriert

23

01.05.2013, 10:28

Dieser Lazy Foo Artikel ist sehr gut, aber ich komme da durcheinander, da dieser eine Klasse namens Gameengine verwendet. Dieser sieht irgendwie so aus wie eine Kombination der beiden Klassen aus dem Buch Framework und Sprite ... :(

24

01.05.2013, 12:06

Dieser Lazy Foo Artikel ist sehr gut, aber ich komme da durcheinander, da dieser eine Klasse namens Gameengine verwendet. Dieser sieht irgendwie so aus wie eine Kombination der beiden Klassen aus dem Buch Framework und Sprite ... :(

Das ist ja letztendlichegal. Es geht ja eigentlich darum: Du hast die abstrakte Klasse "Gamestate" mit den Funktionen wie Render und Update. Für jeden Zustand, den du haben willst (also zB Menü, Spiel, Credits), implementierst du eine Klasse, die sich von Gamestate ableiten. In der Game-Loop rufst du nun immer das aktuelle Gamestate-Objekt auf.
Es kommt halt darauf an, dass du das Prinzip verstanden hast und es dann auf dein eigenes Spiel überträgst.

TigerClaw25

unregistriert

25

01.05.2013, 19:55

Bekomme es irgendwie nicht hin zu implementieren.

Habe daher als Übung erst einmal verrsucht, dass Spiel zu pausieren. Habe mir dazu als kleine Übung eine bool Pause erzeugt, die ich in meinen Events auf false setze, sobald die taste P gedrückt wurde:

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// Run
//
// Aufgabe: Hauptschleife des Spiels
//
void CGame::Run ()
{   
    // Hauptschleife des Spiels durchlaufen
    //
    while (m_bGameRun == true)
    {
        // Timer nächste Objektgruppe
        m_fNextTimer += g_pTimer->GetElapsed();

        // Events bearbeiten
        ProcessEvents ();

        if (Pause != false)
        {
        // Framework updaten und Buffer löschen
        g_pFramework->Update ();
        g_pFramework->Clear ();
        // Hintergrundbild rendern
        m_pSpriteBackground->Render ();

        // Spieler updaten und rendern
        m_pPlayer->Update ();
        m_pPlayer->Render ();

        // Lebensenergie
        int m_HitCount = m_pPlayer->GetHealth();
        
        if (m_HitCount>=5)
        {       
            m_pFontNumb->WriteFont("Energie: ", 530, 550, 255, 20, 50);
            m_pFontNumb->WriteNumber(m_HitCount, 610, 550, 255, 20, 50);
        }
        else if (m_HitCount<=5)
        {
            m_pFontNumb->WriteFont("Energie: ", 530, 550, 255, 20, 50);
            m_pFontNumb->WriteFont("Kritischer Zustand", 610, 550, 255, 20, 50);
        }
            
        // Neue Asteroiden hinzufügen
        if (m_fNextTimer <= 10.0)
        SpawnAsteroids ();  

        if (m_fNextTimer >= 12.0)
        // Neue Gegner hinzufügen
        SpawnEnemy ();  

        // Kollisionen prüfen
        CheckCollisions ();

        // Anzahl zerstörter Asteroiden
        m_pFontLive->WriteFont("Zerstoerte Asteroiden:", 10, 550, 255, 20, 50);
        m_pFontNumb->WriteNumber(m_HitAsteroid, 210, 550, 255, 20, 50);

        // Explosion rendern
        RenderExplosion ();
    
        // Asteroiden rendern
        RenderAsteroids ();

        // Gegner rendern
        RenderEnemy ();

        // Buffer flippen
        g_pFramework->Flip ();
        }
    }

} // Run


Inmeine Events baue ich jetzt ein if else konstrukt, der jedes mal abfragt, ob Pause true oder falls ist ... Merke jetzt nur, dass das Spiel im Hintergrund trotzdem weiter läuft :(

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

26

01.05.2013, 20:15

Das Schlüsselwort "continue" und Methoden könnten die Leserlichkeit Deines Codes deutlich steigern. Den Rest wirst Du wohl debuggen müssen. Ich dachte eigentlich es sei mittlerweile klar geworden, dass das Forum *nicht* Deinen Debugger ersetzt. Wir helfen ja gern, aber man muss doch auch mal allein machen können. Breakpoints zu setzen und Step by Step den Code durchzugehen ist nun wirklich kein Hexenwerk.
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]

TigerClaw25

unregistriert

27

01.05.2013, 20:24

Manchmal läd der nicht oder erst nach ein paar Minuten ... das nervt dann, wenn man den debugger benutzt ...

TigerClaw25

unregistriert

28

01.05.2013, 20:30

C-/C++-Quelltext

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


Dieser Teil darf nicht innerhalb der if-Abfrage stehen, deshalb lief es im Hintergrund weiter ...


Stoße aber mittlerweile an meine Grenzen ... auch was die Formation der Spieler angeht. SOll ich da jedes Mal nach ein paar Sekunden neue gegner mit neuen Positionen erzeugen???

Ein weiteres Problem ist das Aufrufen einer HitAsteroid-Variablen ...Hab in meine Asteroidenklasse eine Variable, die die zerstörten Asteroiden zählen soll. Aber wie um Himmeslwillen baue ich diese in meine CGame Klasse ein, ohne mir in der Run()-Funktion von CGame eine neue Instanz oder Iterator zu erzeugen?

In der Kollisionsfunktion von CGame habe ich eine Iterator zu Asteroiden, da ich dort Kollisionen überprüfe, Aber die Ausgabe erfolgt bei mir in der CGame::Run().

Eine Möglichkeit wäre, in der Kollisionsfunktion den Wert zu holen und in eine Variable in CGame zu speichern. Aber dann kann ich das gleich so machen:

m_HitAsteroid++; eine Variable in CGame. Muss dann nicht umständlich über die Asteroidenklasse gehen oder?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TigerClaw25« (01.05.2013, 20:41)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

29

01.05.2013, 21:31

Das Erzeugen neuer Instanzen wird Dir ohnehin nicht dabei helfen eine "HitAsteroid-Variable" zum Leben zu erwecken. Du weißt scheinbar noch immer nicht so richtig, was eigentlich passiert, wenn man neue Instanzen anlegt.
Dein letzter Satz macht dagegen eher Sinn. Ein Asteroid sollte ja schließlich wohl kaum zählen wie viele Asteroiden schon getroffen wurden. Davon hat ein Asteroid immerhin ja gar keine Ahnung und dafür ist er sicherlich auch nicht zuständig.
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]

TigerClaw25

unregistriert

30

01.05.2013, 21:48

Eventuell wuerde da eher Sinn machen, eine Klasse fuer den Highscore zu erzeugen bzw eine Klasse, die sich nur um das Management der Leben, Punkte etc. Kuemmert.

Was auch sinn machen wuerde ist eine Variable fuer die Asteroiden, die aber nur die Trefferanzahl bzw (ollisionen zaehlt. Wobei ich das ebenfalls mit einer Variablen in CGame realisieren koennte. Und erst, wenn ein Asteroid mehrmals getroffen wird, wird dieser gelöscht.

Du hast natuerlich Recht, ganz 100% ist mir das noch nicht klar. Vielleicht erwarte ich zu Beginn auch noch zu viel. Ein Menü ist nicht unbedingt fuer anfaenger geeignet.

Werbeanzeige