gpt4 book ai didi

c++ - SFML 从模板派生类调用父函数

转载 作者:行者123 更新时间:2023-11-28 01:45:33 25 4
gpt4 key购买 nike

我正在做一个自定义项目来学习 SFML,但我遇到了问题。我想做一个“可点击”类,我可以在其中添加一些奇特的功能,我的第一个目标是编写一个“onMouseOver”功能,它可能与 Javascript 中的功能几乎相同。这是类:

template <class object>
class clickable: public object{
private:
sf::Vector2i mouse;
object& aim;
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const{ target.draw(aim, states); }
public:
clickable(sf::Vector2i mouse,object& aim):mouse(mouse),aim(aim){}
bool onMouseOver(sf::Vector2i mouse) {
float width = aim.getLocalBounds().width;
float height = aim.getLocalBounds().height;
if ((mouse.x >= aim.getPosition().x) && (mouse.x <= aim.getPosition().x + width) && (mouse.y >= aim.getPosition().y) && (mouse.y <= aim.getPosition().y + height))
return true;
else return false;
}
};

这是我的主要内容:

    int main()
{
sf::Font font;
if (!font.loadFromFile("arial.ttf")) {
std::cout << "Error!";
}
sf::RenderWindow window(sf::VideoMode(800, 600), "Title", sf::Style::Default);
sf::Vector2i mouse = sf::Mouse::getPosition(window);
vector<sf::Text> objects;
objects.push_back(sf::Text("Test text.", font, 14));
objects[0].setPosition(20, 20);
clickable<sf::Text> stuff(mouse,objects[0]);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
{
window.close();
}
if (event.type == sf::Event::MouseMoved) {
eger = sf::Mouse::getPosition(window);
}
}
window.clear();
window.draw(stuff);
if (stuff.onMouseOver(mouse)) objects[0].setFillColor(sf::Color::Red);
else objects[0].setFillColor(sf::Color::White);
window.display();
}
return 0;}

我测试了这段代码(使用不同的变量名,因为我来自匈牙利)并且它有效。我的问题是,如果我想将“objects[0].setFillColor(sf::Color::Red)”更改为“stuff.setFillColor(sf::Color::Red)”,屏幕上什么也不会发生。我假设问题是我想从子类调用继承的父函数,但我不确定我能做些什么来解决这个问题。我希望这是可以理解的,并对可能出现的语法错误感到抱歉,但正如我上面提到的,我不是母语人士。任何帮助将不胜感激!

提前致谢!

最佳答案

对于您的问题,我有一个非常快速且简单的快速修复方法。只需将这行代码添加到您的 draw可点击类的成员函数,在调用 target.draw(aim, states); 之前:

aim.setFillColor(this->getFillColor());

像这样:

virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const {
aim.setFillColor(this->getFillColor());
target.draw(aim, states);
}

或者你可以同时重载 setFillColorgetFillColor成员函数:

void setFillColor(const sf::Color& c) {
aim.setFillColor(c);
}

const sf::Color& getFillColor() {
return aim.getFillColor();
}

说明:

您声明了一个变量 stuff像这样:clickable<sf::Text> stuff(mouse, objects[0]);

根据您的模板类定义,这意味着 stuff 是一个 clickable继承自 sf::Text , 所以它是 clickable sf::Text , 它也是一个 sf::Text .

查看您的 clickable 的字段类:

  • 一个sf::Vector2i mouse;
  • 一个object& aim; , 目标是 referenceobject类型,其中 object是你的模板参数

因此,您的变量 stuff保存 sf::Text 的所有数据object 会成立,因为 stuff 是 sf::Text , 一个 sf::Vector2i ,以及对 sf::Text 的引用对象,不是他自己。所以在这里,你的东西对象可以访问 2 个不同的 sf::Text对象。他自己和目标所引用的人。

draw成员函数代码显示它绘制字段aim , 所以 sf::Text引用的,而不是他自己持有的数据

什么时候,在你的代码中,你这样做

objects[0].setFillColor( sf::Color::Red );

你调用setFillColor aim 引用的对象上的方法东西对象的字段,而那个:

stuff.setFillColor(sf::Color::Red);

更改 stuff对象本身。并且您的绘制函数将绘制由填充对象引用的对象,但完全不知道应用于填充对象的所有修改

所以解决方案很简单:所有修改都应用到您的 stuff object 需要应用在被引用的对象上

当您想要绘制对象时(在 draw 方法中)或当您要求应用修改时(例如当您调用 setFillColor 方法时),您可以这样做。

顺便说一下,亚历克斯是对的,你的类(class)设计得并不好。您也可以不保留对 sf::Text 对象的引用并为 (*this) 调用 sf::Text draw 方法(或者只是不要在可点击对象中重载 draw 方法并正确复制 sf::Text在你的对象中)

关于c++ - SFML 从模板派生类调用父函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45291885/

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