奇怪的SFML行为

时间:2014-08-05 22:08:14

标签: c++ sfml

我正在尝试写一个按钮类。它需要2个纹理m_texturem_onHover及其标题,它应该自动居中。函数update()负责选择正确的纹理。

class button : public sf::Drawable
{
private:
    const sf::Texture *m_texture;
    const sf::Texture *m_onHover;
    sf::Sprite m_sprite;

public:
    button(); 

    sf::Text m_caption; // public to allow easy formating, see centerCaption()

    bool mouseIsOver() const;
    void update();

    void setPosition(sf::Vector2f position);
    void setPosition(float x, float y);

    void centerCaption();

    // Access functions
    void setTexture(const sf::Texture &texture) { m_texture = &texture;     m_sprite.setTexture(*m_texture); }
    void setonHoverTexture(const sf::Texture &texture) { m_onHover = &texture; }
    void setCaption(sf::String text)    { m_caption.setString(text);        centerCaption(); }
    void setFontSize(unsigned int size) { m_caption.setCharacterSize(size); centerCaption(); }
    void setFont(sf::Font& font) { m_caption.setFont(font); }

private:
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const;
};

bool button::mouseIsOver() const
{
    if (m_sprite.getGlobalBounds().contains(sf::Vector2f(sf::Mouse::getPosition())))    // creating a float vector for contains() because getPosition gives int vector
    {
        return true;
    }
    else
    {
        return false;
    }
}

一切似乎都有效,但mouseIsOver()返回true的鼠标位置似乎在精灵上方移动了40个像素。在控制台中打印时,getGlobalBounds()中的矩形值似乎是正确的。

不幸的是,我没有足够的声誉来发布截图。

1 个答案:

答案 0 :(得分:1)

光标位置应转换为正确的坐标系。基本上您需要使用sf::RenderTarget::mapPixelToCoords(通过继承在sf::Renderwindow中提供)。有关更多详细信息,请查看官方教程的文档和§Coordinates conversions

另外,您可能需要考虑让您的按钮类继承自sf::Transformable,这样您就不必自己管理位置/旋转/缩放/ ...看看Creating a SFML-like entity