2017-07-13 68 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

这是一个使用精灵更新版本的pastebin ...移动[链接]后仍然是相同的问题(https:/ /pastebin.com/s1EYJ3LC) – ZNelson1989

回答

0

您的游戏运行速度尽可能快(这意味着您的圈子将在最轻微的输入时从屏幕飞出)。尝试限制帧率:

mWindow.setFramerateLimit(60); 

然后每次拨打mWindow.display()都会等一会儿。

编辑:确保您的对象不依赖于帧率。你可以使用sf::Clock来做到这一点。

class Game { 
... 
sf::Clock mClock; 
} 

然后在你的更新功能,通过乘的DeltaTime输出:

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

为什么不迁移到基于时间处理? 请确保你阅读了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; 
}