c++ - SMFL - 仅绘制了 2 个对象中的 1 个

标签 c++ object drawable sfml

我在绘制自定义 sf::Drawable 派生对象时遇到问题。

//Textbox.h
#pragma once
#include "Header.h"

#ifndef TEXTBOX_H
#define TEXTBOX_H

class Textbox : public Drawable {
public:
    Textbox(int max_chars, bool numeric);
    Textbox(int max_chars);
    Textbox(bool numeric);
    Textbox();

    void setTextColor(Color color);

    void setPosition(float x, float y);

    Vector2f getPosition() {
        return m_gshape.getPosition();
    }

    Vector2f getSize();

    String getString();

    void setFocus(bool value);

    bool isFocused();

    void input(Uint32 text_char);

    void clear();



private:
    virtual void Textbox::draw(sf::RenderTarget& target, sf::RenderStates states) const {
        target.draw(m_gshape, states);
        target.draw(m_textbox, states);
    }


    unsigned int max_length;
    int min_ascii = 32;
    int max_ascii = 127;
    bool focus;
    string content;

    Text m_textbox;
    RectangleShape m_gshape;
};


#endif // !TEXTBOX_H

//Textbox.cpp
#pragma once
#include "Textbox.h"

Textbox::Textbox(int max_chars, bool numeric) {
    max_length = max_chars;
    m_gshape.setSize(Vector2f(6 + 15 * max_length, 30));
    m_gshape.setFillColor(Color::White);
    m_gshape.setOutlineThickness(2);
    m_gshape.setOutlineColor(Color(60, 60, 60));
    m_gshape.setPosition(0, 0);

    m_textbox.setFont(default_font);
    m_textbox.setCharacterSize(25);
    m_textbox.setFillColor(Color::White);

    if (max_chars > 1)
        m_textbox.setString(to_string((int)pow(10, max_chars - 1)));
    else
        m_textbox.setString("0");

    if (numeric) {
        min_ascii = 47;
        max_ascii = 58;
    }
}
Textbox::Textbox(int max_chars) : Textbox(max_chars, false) {}
Textbox::Textbox(bool numeric) : Textbox(2, numeric) {}
Textbox::Textbox() : Textbox(2, false) {}

void Textbox::setTextColor(Color color) {
    m_textbox.setFillColor(color);
}

void Textbox::setPosition(float x, float y) {
    FloatRect textbox_bounds = m_textbox.getGlobalBounds();

    m_gshape.setPosition(x, y);
    m_textbox.setPosition(m_gshape.getPosition().x + (m_gshape.getSize().x - textbox_bounds.width) / 2 - textbox_bounds.left,
        m_gshape.getPosition().y + (m_gshape.getSize().y - textbox_bounds.height) / 2 - textbox_bounds.top);
}

Vector2f Textbox::getSize() {
    return m_gshape.getSize();
}

String Textbox::getString() {
    return m_textbox.getString();
}

void Textbox::setFocus(bool value) {
    focus = true;
}

bool Textbox::isFocused() {
    return focus;
}

void Textbox::input(Uint32 text_char) {
    content = m_textbox.getString().toAnsiString();

    if (text_char == 13) {
        focus = false;
        return;
    }
    if (m_textbox.getString().getSize() < max_length) {
        if (text_char > min_ascii && text_char < max_ascii) {
            m_textbox.setString(m_textbox.getString() + text_char);
        }
    }
    if (text_char == 8 && m_textbox.getString().getSize() > 0) {
        content.resize(m_textbox.getString().getSize() - 1);
        m_textbox.setString(content);
    }
}

void Textbox::clear() {
    m_textbox.setString("");
}

除绘图部分外一切正常:而 g_shape 被绘制和渲染 m_textbox 没有。我确信这一点,因为我仍然可以编辑文本,但它不会显示。

我必须承认我没有完全理解 sf::Drawable 继承,因此我不确定我是否正确地覆盖了 draw()

最佳答案

感谢@AlexMeuer我找到了解决方案。

在我的头文件中,我将我的全局字体设置为 extern sf::Font default_font 但是在我的 main.cpp 中我从未声明过它。

关于c++ - SMFL - 仅绘制了 2 个对象中的 1 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40592111/

相关文章:

Android + 线性布局上的 setDividerDrawable?

c++ - 防止在C++中显示小数点前的零

c++ - 在Qt中集成一个Bullet简单demo

C++ Boost 读取 CSV 数据并向某些列添加双引号,然后重新写回文件

Android - 将图像名称 "package"抛出编译时错误

Android Studio - 缺少可绘制文件夹

c++ - 声明为 void 的变量或字段

javascript - 在 JavaScript 中加载和稍后引用纹理图 block 的最有效方法是什么?

javascript - 从对象数组创建树状 json 对象

c# - 如何检查对象的一个​​值是否为 null