SFML sf :: Mouse :: getPosition方法无法写入正确的参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SFML sf :: Mouse :: getPosition方法无法写入正确的参数相关的知识,希望对你有一定的参考价值。

我的问题是我在Game::HandleInput()方法中编写了这段代码,但我无法使sf::Mouse::getPosition()方法获得相对于窗口的鼠标坐标。没有争论,我没有得到错误。但是,船舶无法正常旋转。我试过getPosition(m_window)getPosition(&m_window)。我收到此错误:

no instance of overloaded function "sf::Mouse::getPosition" matches the argument list

编辑:更新WINDOW.H

在window.h:

class Window{
    //Constructers
public:
    Window();
    Window(const std::string& l_title, const sf::Vector2u& l_size);

    ...
private:
    sf::RenderWindow m_window;
    ...
}

编辑:添加完整的WINDOW.CPP代码:

Window.cpp:

#include "Window.h"

Window::Window() {
    Setup("Window", sf::Vector2u(640, 480));
}
Window::Window(const std::string& l_title, const sf::Vector2u& l_size) {
    Setup(l_title, l_size);
}
Window::~Window() {
    Destroy();
}

void Window::Setup(const std::string& l_title,
    const sf::Vector2u& l_size)
{
    m_windowTitle = l_title;
    m_windowSize = l_size;
    m_isFullscreen = false;
    m_isDone = false;
    Create();
}
void Window::Create() {
    auto style = (m_isFullscreen ? sf::Style::Fullscreen
        : sf::Style::Default);
    m_window.create({ m_windowSize.x, m_windowSize.y, 32 },
        m_windowTitle, style);
}
void Window::Destroy() {
    m_window.close();
}
void Window::Update() {
    sf::Event event;
    while (m_window.pollEvent(event)) {
        if (event.type == sf::Event::Closed) {
            m_isDone = true;
        }
        else if (event.type == sf::Event::KeyPressed &&
            event.key.code == sf::Keyboard::F5)
        {
            ToggleFullscreen();
        }
    }
}
void Window::ToggleFullscreen() {
    m_isFullscreen = !m_isFullscreen;
    Destroy();
    Create();
}
void Window::BeginDraw() { m_window.clear(sf::Color::Black); }
void Window::EndDraw() { m_window.display(); }

bool Window::IsDone() { return m_isDone; }
bool Window::IsFullscreen() { return m_isFullscreen; }
sf::Vector2u Window::GetWindowSize() { return m_windowSize; }

void Window::Draw(sf::Drawable& l_drawable){
    m_window.draw(l_drawable);
}

编辑:更新了游戏.H

Game.h:

class Game{
public:
    Game();
    ~Game();
    void HandleInput();
    void Update();
    void Render();
    Window* GetWindow();
private:
    ...
    Window m_window;
    ...
}

编辑:更新了游戏.CPP

Game.cpp:

Game::Game() : m_window("Multiplayer Space Shooter Game", sf::Vector2u(800, 600)) {
    // Setting up class members.
    m_shipText.loadFromFile("C:\Users\AliTeo\Desktop\Piksel çalışmaları\ship_pixel2.png");
    m_ship.setTexture(m_shipText);
    m_ship.setOrigin(m_shipText.getSize().x / 2, m_shipText.getSize().y / 2);
    m_ship.setPosition(320, 240);
}
void Game::HandleInput() {
    ...
    //Get the angle between ship and mouse.
    //Error if there is an argument in getPosition()
    m_angle = atan2(sf::Mouse::getPosition().y - m_ship.getPosition().y, sf::Mouse::getPosition().x - m_ship.getPosition().x); //TO DO: getPosition(&Relative To)
    m_angle *= 180 / m_PI;
    ...
}
Window* Game::GetWindow() { return &m_window; }

编辑:添加MAIN.CPP

Main.cpp的

int main() {
    Game game;
    while (!game.GetWindow()->IsDone()) {
        game.HandleInput();
        game.Update();
        game.Render();
    }
}
答案

首先让我告诉你我所假设的是一个复制你的问题的最小例子:

#include <SFML/Graphics.hpp>

class MyWindow {
public:
    MyWindow()
    : m_window({800, 600, 32}, "my window title") {}

private:
    sf::RenderWindow m_window;
};

int main() {
    MyWindow window;
    sf::Mouse::getPosition(window);
}

这段代码不能编译(并且在编译时肯定不会做任何有趣的事情,但这不是重点)。我怀疑如果你试图编译它会给你同样的错误。

请注意,这是我们在讨论MCVE时所期望的:这段代码简短,显示错误,如果不是因为它会编译。

此外,它会让错误变得非常清楚,如果你想自己想出一个MCVE,你可能已经解决了你的问题,而不必在这里发一个问题,这肯定会节省你的时间。


与您的代码对比:

m_angle = atan2(sf::Mouse::getPosition().y - m_ship.getPosition().y
               ,sf::Mouse::getPosition().x - m_ship.getPosition().x
               );
//TO DO: getPosition(Relative To)

这段代码是合法的,但你解释说它是不正确的,你想把它变成这样的东西:

m_angle = atan2(sf::Mouse::getPosition(m_window).y - m_ship.getPosition().y
               ,sf::Mouse::getPosition(m_window).x - m_ship.getPosition().x
               );
//TO DO: getPosition(Relative To)

......不编译。

然而,在这个范围内m_windowWindow而不是sf::RenderWindow

问题是你传递了一个对象的引用(在我的例子中是MyWindow,在你的例子中是Window),它封装了一个sf::RenderWindow,但是不能转换为sf::Window&本身。因此,你不能把它传递给sf::Mouse::getPosition,它要么什么都没有或者sf::Window&,但肯定不是Window&MyWindow&


有很多方法可以解决这个问题。其中两个如下:

#include <SFML/Graphics.hpp>

class MyWindow {
public:
    MyWindow()
    : m_window({800, 600, 32}, "my window title") {}

    // you could add an accessor
    const sf::Window& getSfmlWindow() const { return m_window; }

    // you may also expose a method to get the mouse position
    // relatively to this window
    const sf::Vector2i getMousePosition() const {
        return sf::Mouse::getPosition(m_window);
    }

private:
    sf::RenderWindow m_window;
};

int main() {
    MyWindow window;
    sf::Vector2i mouse_position;
    // this won't work! window isn't convertible to sf::Window&
    // mouse_position = sf::Mouse::getPosition(window);

    // using the accessor
    mouse_position = sf::Mouse::getPosition(window.getSfmlWindow());

    // or the exposed method
    mouse_position = window.getMousePosition();
}

以上是关于SFML sf :: Mouse :: getPosition方法无法写入正确的参数的主要内容,如果未能解决你的问题,请参考以下文章

SFML不适用于Windows上的CLion

SFML“未能创建字体”问题

尝试使用switch语句来移动与鼠标位置相关的图像c ++ SFML

用sfml(c++)写消消乐游戏(三消)

从精灵表中以 sfml 动画精灵

如何在 Windows 上修复 VS 2019 中的 SFML 错误?