2017-07-13 5 views
0

SFMLチュートリアルに続いて。このコードは、スクリーンの周りにシアンの円を動かすことを可能にするはずです。 mPlayer.move(ムーブメント)を使わずに円を描くとうまくいきますが、この行がgame.updateで実行されると、シェイプは画面から消えて決して再描画されません。私は何が欠けていますか?SFMLシェイプが移動後に描画されない

Game.cpp 

    Game::Game() 
    :mWindow(sf::VideoMode(1440, 900, 32),"yeeboi1!!!!!") , mPlayer() 
    { 
    mPlayer.setRadius(20.f); 
    mPlayer.setPosition(100.f, 110.f); 
    mPlayer.setFillColor(sf::Color::Cyan); 
    } 


    Game::~Game() 
{ 
} 

    void Game::run() { 
    while (mWindow.isOpen()) { 
     processEvents(); 
     update(); 
     render(); 
    } 
} 

    void Game::processEvents() 
    { 
     sf::Event event; 
     while (mWindow.pollEvent(event)) 
    { 
      switch (event.type) 
     { 
     case sf::Event::KeyPressed: 
      HandleInput(event.key.code, true); 
      break; 
     case sf::Event::KeyReleased: 
      HandleInput(event.key.code, false); 
      break; 
     case sf::Event::Closed: 
      mWindow.close(); 
      break; 
     } 

    } 
} 

    void Game::update() { 
    sf::Vector2f movement(0.f, 0.f); 
    if (mMoveUp) 
     movement.y -= 1.f; 
    if (mMoveDown) 
     movement.y += 1.f; 
    if (mMoveLeft) 
     movement.x-= 1.f; 
    if (mMoveRight) 
     movement.x += 1.f; 

    mPlayer.move(movement); 




} 

    void Game::render() { 
    mWindow.clear(); 
    mWindow.draw(mPlayer); 
    mWindow.display(); 
} 

    void Game::HandleInput(sf::Keyboard::Key key, bool isPressed) { 
    if (key == sf::Keyboard::W) 
     mMoveUp = isPressed; 
    if (key == sf::Keyboard::S) 
     mMoveDown = isPressed; 
    if (key == sf::Keyboard::A) 
     mMoveLeft = isPressed; 
    if (key == sf::Keyboard::D) 
     mMoveRight = isPressed; 
} 



Game.h 

    #pragma once 
    #include <SFML/Graphics.hpp> 
    class Game 
    { 
    public: 
    Game(); 
    ~Game(); 


    void run(); 

    private: 
    void processEvents(); 
    void update(); 
    void render(); 
    void HandleInput(sf::Keyboard::Key key, bool isPressed); 
    bool mMoveUp, mMoveDown, mMoveLeft, mMoveRight = false; 

    private: 
    sf::RenderWindow mWindow; 
    sf::CircleShape mPlayer; 
}; 




Main.cpp 

#include "Game.h" 


    int main() 
    { 
    Game game; 
    game.run(); 

    return 0; 
    } 
+0

Eeek恐ろしいくぼみ。読みにくい。 –

+0

スタックOVerflowに入れようとしていたのですが、その後私はちょうどctrl + kとすることができました – ZNelson1989

+0

スプライトを使った更新版のペーストビンです...移動後も同じ問題があります(https:///pastebin.com/s1EYJ3LC) – ZNelson1989

答えて

0

あなたのゲームは可能な限り速く実行されています(つまり、あなたのサークルは少しの入力で画面から飛んでいます)。フレームレートを制限してみてください。

mWindow.setFramerateLimit(60); 

その後mWindow.display()のすべての呼び出しは、少し待ちます。

編集:オブジェクトがフレームレートに依存しないことを確認します。これはsf::Clockを使用して行うことができます。時間ベースの処理に移行しないのはなぜ

void Game::update(sf::Time dt) { 
    sf::Vector2f movement(0.f, 0.f); 
    if (mMoveUp) 
     movement.y -= 1.f * dt.asSeconds(); 
    ... 
    mPlayer.move(movement); 
} 

//Now you can call the function 
update(mClock.restart()); 
+0

を追加しました。mWindow.setFramerateLimit(60); をゲームコンストラクタに追加しても、同じ問題が発生します。 – ZNelson1989

+0

私は 'sf :: Clock'とそれを使ってフレームレートの依存関係を取り除くことについて忘れました。私はそれに応じて私の応答を更新しました。 –

3

あなたの更新機能で次に
class Game { 
... 
sf::Clock mClock; 
} 

は、deltaTimeによって出力を乗算? http://gameprogrammingpatterns.com/game-loop.htmlも必ずお読みください。

私は現在、列車に座っていますので、この短い回答をお詫び申し上げます。 Game :: runおよびupdate(dtAsSeconds)の変更点を参照してください。

Game.cpp 
#include "Game.h" 

Game::Game() 
:mWindow(sf::VideoMode(1440, 900, 32),"yeeboi1!!!!!") , mPlayer() 
{ 
mPlayer.setRadius(20.f); 
mPlayer.setPosition(100.f, 110.f); 
mPlayer.setFillColor(sf::Color::Cyan); 
} 


Game::~Game() 
{ 
} 

void Game::run() { 
    sf::Clock m_Clock = sf::Clock(); 

while (mWindow.isOpen()) { 
    sf::Time dt = m_Clock.restart(); 

    // Count seconds since last process 
    float dtAsSeconds = dt.asSeconds(); 

    processEvents(); 
    update(dtAsSeconds); 
    render(); 
} 
} 

void Game::processEvents() 
{ 
    sf::Event event; 
    while (mWindow.pollEvent(event)) 
{ 
     switch (event.type) 
    { 
    case sf::Event::KeyPressed: 
     HandleInput(event.key.code, true); 
     break; 
    case sf::Event::KeyReleased: 
     HandleInput(event.key.code, false); 
     break; 
    case sf::Event::Closed: 
     mWindow.close(); 
     break; 
    } 

} 
} 

void Game::update(float dtAsSeconds) { 
sf::Vector2f movement(0.f, 0.f); 
if (mMoveUp) 
    movement.y -= 1.f * dtAsSeconds * 100; 
if (mMoveDown) 
    movement.y += 1.f * dtAsSeconds * 100; 
if (mMoveLeft) 
    movement.x-= 1.f * dtAsSeconds * 100; 
if (mMoveRight) 
    movement.x += 1.f * dtAsSeconds * 100; 

mPlayer.move(movement); 




} 

void Game::render() { 
mWindow.clear(); 
mWindow.draw(mPlayer); 
mWindow.display(); 
} 

void Game::HandleInput(sf::Keyboard::Key key, bool isPressed) { 
if (key == sf::Keyboard::W) 
    mMoveUp = isPressed; 
if (key == sf::Keyboard::S) 
    mMoveDown = isPressed; 
if (key == sf::Keyboard::A) 
    mMoveLeft = isPressed; 
if (key == sf::Keyboard::D) 
    mMoveRight = isPressed; 
} 

Game.h 

#pragma once 
#include <SFML/Graphics.hpp> 
class Game 
{ 
public: 
Game(); 
~Game(); 


void run(); 

private: 
void processEvents(); 
void update(float dtAsSeconds); 
void render(); 
void HandleInput(sf::Keyboard::Key key, bool isPressed); 
bool mMoveUp, mMoveDown, mMoveLeft, mMoveRight = false; 

private: 
sf::RenderWindow mWindow; 
sf::CircleShape mPlayer; 
}; 

main.cpp 

#include "Game.h" 

int main() 
{ 
Game game; 
game.run(); 

return 0; 
} 
関連する問題