我正在尝试写一个按钮类。它需要2个纹理m_texture
和m_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()
中的矩形值似乎是正确的。
不幸的是,我没有足够的声誉来发布截图。
答案 0 :(得分:1)
光标位置应转换为正确的坐标系。基本上您需要使用sf::RenderTarget::mapPixelToCoords
(通过继承在sf::Renderwindow
中提供)。有关更多详细信息,请查看官方教程的文档和§Coordinates conversions。
另外,您可能需要考虑让您的按钮类继承自sf::Transformable
,这样您就不必自己管理位置/旋转/缩放/ ...看看Creating a SFML-like entity