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

Werwofl

Treue Seele

  • »Werwofl« ist der Autor dieses Themas

Beiträge: 100

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

1

27.09.2011, 08:13

SFML Event Handling

Hallo zusammen,

ich habe ein Problem mit dem Event-Handling der SFML. Ich habe schon mehrere Foren durchsucht konnte bis jetzt aber noch keine Hilf für mein Problem finden.

Mein Problem ist ich baue grade ein TileMap-basietes Spiel nach alter Zelda-Manier auf. Nun habe ich aber ziemliche Probleme mit dem Movement meines Players.
1. Wenn ich nach dieser Art das ganze realisere:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Game::run(){
init();
    while(gameWindow.IsOpened()){

       sf::Event event;

       if(gameWindow.GetEvent(event)){
           if(event.Type == sf::Event::Closed){
               gameWindow.Close();
           }
       }
       checkKeyEvents(event);
       player.stopAnimation();
       checkMouseEvents(event);
// hier ghets noch weiter 
}

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
void Game::checkKeyEvents(sf::Event event){
    player.calculateTilePosition();
    int x = player.getTileXPosition();
    int y = player.getTileYPosition();
    int steps = 4;
    if(gameWindow.GetInput().IsKeyDown(sf::Key::W)||
       gameWindow.GetInput().IsKeyDown(sf::Key::Up)){
       player.startAnimation(16,19);

       if( player.getTileYPosition()<=0 ||
           (y-1 >= 0 && world.getTileMap(currentXTileMap,currentYTileMap).getTile(x,y-1).isWalkAble())){
                for(float i = 0;i<128;i=i+steps ){
                    elapsedTime = gameWindow.GetFrameTime();
                    player.move(0,steps*(-1));                                             //oben
                    drawGame();
                }
       }
    }
    else if(gameWindow.GetInput().IsKeyDown(sf::Key::S) ||
            gameWindow.GetInput().IsKeyDown(sf::Key::Down)){
// usw.. blablba
    }

Kann ich mich zwar bewegen die MouseEvents werden auch richtig gedeutet, nur bewegt sich das Player-Sprite wenn man eine Bewegungstaste drückt ziemlich lange nach oben. Heißt drück ich zu lange die eine Bewegungs- oder Angriffstaste habe ich keine wirkliche Kontrolle mehr über das Sprite.

2. Wenn ich es so versuche:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void Game::run(){
init();
    while(gameWindow.IsOpened()){

       sf::Event event;

       if(gameWindow.GetEvent(event)){
           if(event.Type == sf::Event::Closed){
               gameWindow.Close();
           }
       }
       while(gameWindow.GetEvent(event)){
            if(event.Type == sf::Event::KeyPressed){
                checkKeyEvents(event);
            }
            player.stopAnimation();
            if(event.Type == sf::Event::MouseButtonPressed){
                checkMouseEvents(event);
            }
       }
}

Erkennt er hier nicht wirklich ob eine Taste gedrückt wurde. Nehme ich die if's raus erkennt er keine Pfeiltasten und keine Mausklicks mehr als Event.


So jetzt meine eigentlich Frage:Wwie bekomme ich am besten eine saubere Bewegung hin und Möglichkeit z.B. auch "gleichzeitig" eine MouseClick auf einem Button zu bemerken.

Gruß Wofl

2

27.09.2011, 11:56

Ich verweise mal auf den Forenbeitrag ich meine da war das selbe problem.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Werwofl

Treue Seele

  • »Werwofl« ist der Autor dieses Themas

Beiträge: 100

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

3

27.09.2011, 12:10

Aja danke, das hat mir schon mal weitergeholfen. NachherZuhause direkt mal probieren^^.

Werbeanzeige