奇怪SFML行为(Strange SFML behavior)

2019-10-20 15:36发布

目前,我想写一个按钮类。 需要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()返回真,似乎要移动40个像素的子画面的上方。 在从矩形的值getGlobalBounds()在控制台打印时似乎是正确的。

不幸我没有足够的声誉发布的屏幕截图。

Answer 1:

光标位置应转换为正确的坐标系。 基本上你需要使用sf::RenderTarget::mapPixelToCoords (可在sf::Renderwindow通过继承)。 欲了解更多详情,看看文档和§Coordinates转换的官方教程。

此外,你可能要考虑让您的按钮类继承sf::Transformable ,这样你就不必管的位置/旋转/缩放/ ...你自己。 看一看创建SFML类似实体上



文章来源: Strange SFML behavior
标签: c++ sfml