gpt4 book ai didi

c++ - 奇怪的 SFML 行为

转载 作者:太空宇宙 更新时间:2023-11-04 11:29:59 25 4
gpt4 key购买 nike

我目前正在尝试编写一个按钮类。它需要 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 的鼠标位置似乎移动到 sprite 上方 40 像素处。来自 getGlobalBounds() 的矩形中的值在控制台中打印时似乎是正确的。

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

最佳答案

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

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

关于c++ - 奇怪的 SFML 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25149152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com