SFML Window 没有响应输入

SFML Window not responding to inputs

我最近开始研究 SFML。我刚刚创建了一个 window 然后开始分离我的主要代码。首先我写了一个window class.

没什么特别的,只是绘制我的 window 并打印鼠标坐标。

#include "Window.hpp"
#include <iostream>

Window::Window()
{
    SetWindow(800,600, "JUST SFML");
}

void Window::SetWindow(unsigned int width, unsigned int height, sf::String title)
{
    m_sfmlWindow.create(sf::VideoMode(width, height), title);
}

void Window::StartDrawing()
{
    m_sfmlWindow.clear();
}

void Window::EndDrawing()
{
    m_sfmlWindow.display();
}

bool Window::isClosed()
{
    return !m_sfmlWindow.isOpen();
}

void Window::EventControl()
{
    sf::Event event;
    while (m_sfmlWindow.pollEvent(event))
    {
        if (event.type == sf::Event::Closed)
        {
            m_sfmlWindow.close();
        }
        if (event.type == sf::Event::MouseMoved)
        {
            std::cout << event.mouseMove.x << " , " << event.mouseMove.y << std::endl;
        }
    }
}

void Window::Draw(sf::Drawable& shape)
{
    m_sfmlWindow.draw(shape);
}

一切都很完美。 然后我想我需要一个 GameManager class,我可以在我的主要 class.

中使用它
#include "GameManager.hpp"

GameManager::GameManager()
{
    m_shape.setRadius(30.0f);
    m_shape.setFillColor(sf::Color::Magenta);
    m_incVal = 1.0f;
    m_posX = 10.0f;
    m_frameRate = 1.0f / 60.0f;
}

GameManager::~GameManager()
{
}

void GameManager::InputControl()
{
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
    {
        m_incVal = 1.0f;
    }
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
    {
        m_incVal = -1.0f;
    }
}

void GameManager::UpdateScene()
{
    if (m_deltaTime.asSeconds() >= m_frameRate)
    {
        m_posX += m_incVal;
        m_shape.setPosition(m_posX, 300);
        m_deltaTime -= sf::seconds(m_frameRate);
    }
}

void GameManager::DrawScene()
{
    m_window.StartDrawing();
    m_window.Draw(m_shape);
    m_window.EndDrawing();
}

void GameManager::RestartClock()
{
    m_deltaTime += m_clock.restart();
}

bool GameManager::isFinished()
{
    return m_window.isClosed();
}

当我使用 window 对象时,它工作得很好,后来我换成了 gamemanager,它开始没有响应。我可以得到键盘输入,但不能得到鼠标移动坐标。我哪里做错了?

#include <SFML/Graphics.hpp>
#include "GameManager.hpp"
#include "Window.hpp"

int main()
{
    GameManager gameManager;
    while (!gameManager.isFinished())
    {
        gameManager.InputControl();
        gameManager.UpdateScene();
        gameManager.DrawScene();
        gameManager.RestartClock();
    }

    /*
    sf::CircleShape shape(100.0f);
    shape.setFillColor(sf::Color::Magenta);
    shape.setOutlineThickness(5.0f);
    shape.setOutlineColor(sf::Color::White);

    Window window;
    while (!window.isClosed())
    {
        window.EventControl();
        window.StartDrawing();
        window.Draw(shape);
        window.EndDrawing();
    }
    */

    return 0;
}

为了接收事件(例如鼠标移动),您需要在window上调用pollEvents

在您的注释代码中,您是通过 Window::EventControl() 方法执行此操作的。但是,您的新 GameManager class 没有调用此方法,因此您没有收到任何事件。