2017-12-02 17 views
0

遅いですAまたはD少し移動してから停止し、再び移動して続行します。SFML画面の動きは、私が最近SFMLを学ぶために始めていると私はそれが簡単にする必要がありますので、ポンクローンを作りたかったのですが、コーディングしながら、私はこの問題になった

#include <SFML/Graphics.hpp> 
#include "bat.h" 
int main() 
{ 
int windowWidth=1024; 
int windowHeight=728; 
sf::RenderWindow window(sf::VideoMode(windowWidth, windowHeight), "SFML window"); 

bat Bat(windowWidth/2,windowHeight-20); 



while (window.isOpen()) 
{ 

    sf::Event event; 
    while (window.pollEvent(event)) 
    { 

      if(sf::Keyboard::isKeyPressed(sf::Keyboard::A)) 

       Bat.batMoveLeft(); 

      else if(sf::Keyboard::isKeyPressed(sf::Keyboard::D)) 

      Bat.batMoveRight(); 

      else if (event.type == sf::Event::Closed) 
      window.close(); 
    } 


    window.clear(); 

Bat.batUpdate(); 

window.draw(Bat.getShape()); 

    window.display(); 
} 


return 0; 
} 

bat.h

#ifndef BAT_H 
#define BAT_H 
#include <SFML/Graphics.hpp> 

class bat 
{ 
private: 
      sf::Vector2f position; 

    float batSpeed = .3f; 

    sf::RectangleShape batShape; 

public: 
    bat(float startX, float startY); 

    sf::FloatRect getPosition(); 

    sf::RectangleShape getShape(); 

    void batMoveLeft(); 

    void batMoveRight(); 

    void batUpdate(); 



}; 

#endif // BAT_H 

bat.cpp

#include "bat.h" 
using namespace sf; 
bat::bat(float startX,float startY) 
{ 
position.x=startX; 

position.y=startY; 

batShape.setSize(sf::Vector2f(50,5)); 
batShape.setPosition(position); 

} 
FloatRect bat::getPosition() 
{ 
    return batShape.getGlobalBounds(); 
} 

RectangleShape bat::getShape() 
{ 
    return batShape; 
} 
void bat::batMoveLeft() 
{ 
    position.x -= batSpeed; 
} 
void bat::batMoveRight() 
{ 
    position.x += batSpeed; 
} 
void bat::batUpdate() 
{ 
    batShape.setPosition(position); 
} 

答えて

0

あなたの問題は、あなたが戦略(現在の状態をチェック対ポーリングイベント)を取り扱う入力しているです。

さらに、今すぐこの方法を実装したことは、キューに5つのイベントがあると仮定すると、描画間でバットを5回移動させることを意味します。イベントが1つしかない場合(「キーダウン」など)、バットを1回移動します。

あなたは一般的にやりたいだろうが、それらを反復処理しながら、イベントをチェックしている:

while (window.pollEvent(event)) { 
    switch (event.type) { 
     case sf::Event::Closed: 
      window.close(); 
      break; 
     case sf::Event::KeyDown: 
      switch (event.key.code) { 
       case sf::Key::Left: 
        bat.moveLeft(); 
        break; 
       // other cases here 
      } 
      break; 
    } 
} 

(これは、メモリからそのテストされていないと、タイプミスが含まれることがあります。)私が得た

+0

感謝の男それ! –

関連する問題

 関連する問題