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

1

16.05.2015, 11:39

SFML Position vom Spieler nur einmal speichern

Hallo liebe Spieleprogrammierer

Ich habe ein PausenMenü entwickelt und wenn der Spieler 'Escape' drückt, kommt er in das Pausenmenü und das Spiel wird pausiert.
Jetzt habe ich ein kleines Problem und zwar wenn ich das PausenMenü verlasse, spawnt der Spieler immer wieder am setPosition, dass eigentlich nur für den Anfang galt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
Player::Player(sf::Vector2f position)
{
    loadTexture(pPlayerTexture);

    pPlayerSprite.setPosition(position);
    pPlayerSprite.setOrigin(pPlayerTexture.getSize().x / 2, pPlayerTexture.getSize().y / 2);
    pPlayerSprite.setScale(0.6f, 0.6f);
}


Und so sieht der Pausenbefehl im Spieler aus:

C-/C++-Quelltext

1
2
3
4
5
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Escape))
        {
            game.changeState(Game::gameStates::PAUSE);
            game.setPaused(true);
        }


Ich dachte zuerst irgendwie an eine Funktion zb. getLatestPosition aber ich kenne keinen Befehl mit dem man das nur 1mal abfragt.
Kann mir da jemand helfen?

Freundlich Grüsst SlyGamer72HD

Evourak

unregistriert

2

16.05.2015, 12:19

Ruf den Konstruktor von Player einfach nicht auf wenn das Pausenmenü verlassen wird.

3

16.05.2015, 12:36

Und wie soll ich das abfragen?
Wenn ich den Konstruktor gar nicht mehr aufrufe nachdem ich das Pausenmenü verlasse, setzt er die Textur vom Sprite gar nicht mehr.

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

4

16.05.2015, 12:40

Wie regelst du denn den Wechsel von einem in den anderen GameState? Also was passiert da? Beim Pause-State solltest du den Play-State (oder wie du ihn halt nennst) ja nicht löschen, sondern lediglich seine update()(und ggf. render()) Funktion nicht mehr aufrufen.
WIP Website: kevinheese.de

5

16.05.2015, 12:49

Hallo KeksX

Die Gamestate Klasse ist virtuell und alle anderen ..State Klassen erben von ihr. Die Wechselfunktion findet in der Game Klasse statt.

Game.hpp

C-/C++-Quelltext

1
2
3
enum class gameStates { MAINMENU, OPTION, PLAY, PAUSE };
void changeState(gameStates newState);
std::unique_ptr<GameState> CurrentState;


Game.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Game::changeState(gameStates newState)
{
    switch (newState)
    {
    case(gameStates::MAINMENU) :
        CurrentState = std::make_unique<MainMenuState>();
        break;

    case(gameStates::OPTION) :
        CurrentState = std::make_unique<MainOptionState>();
        break;

    case(gameStates::PLAY) :
        CurrentState = std::make_unique<PlayState>(*this);
        break;

    case(gameStates::PAUSE) :
        CurrentState = std::make_unique<MainPauseState>(*this);
    }
}


Und die anderen Sachen also Update, Render und ProcessEvents werden ganz normal in der Game Klasse aufgerufen

C-/C++-Quelltext

1
CurrentState->Update(*this, deltaTime);


Und wenn man vom einten Gamestate in den anderen wechseln will ruft man einfach nur die Funktion auf

C-/C++-Quelltext

1
game.changeState(Game::gameStates::PAUSE);

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

6

16.05.2015, 13:22

Und das Problem ist, dass jedes Mal, wenn der Zustand von "Pause" zu "im Spiel" wechseln soll, der "im Spiel"-Zustand gänzlich neu erzeugt wird. Das einfachste und sinnvollste wäre es, den Spielzustand nicht wegzuschmeißen, wenn das Spiel pausiert wird, wofür es unterschiedliche mögliche Herangehensweisen gibt. Wichtig ist jedoch, dass der "Pause"-Zustand als ein "Unterzustand" des "im Spiel"-Zustands gehandhabt wird. dafür könnte der Statemanager um einen Stack erweitert werden, oder das Pausieren wird nicht über diesen StateManager sondern innerhalb des "im Spiel"-Zustands gehandhabt, oder durch spezielle Abfragen im StateManager, oder...
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

7

16.05.2015, 13:27

Genau das was Sacaldur sagt. Deine changeState() Methode ist in Wirklichkeit eine "create new state" Methode.

Erstelle die States an anderer Stelle. Stichwort "Factories". changeState() setzt dann einfach nur den Pointer auf den laufenden State.
WIP Website: kevinheese.de

8

16.05.2015, 14:02

Habt ihr da ein Beispiel? Ich kann mir gerade darunter nicht vorstellen wie ich das machen soll

9

16.05.2015, 18:23

Irgendjemand?

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

10

16.05.2015, 19:40

Hier, so sieht das bei mir aus.
Guck dir "Game" und "State" an.

Werbeanzeige