SMFL - 只绘制了2个对象中的1个

时间:2016-11-14 15:19:31

标签: 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()

1 个答案:

答案 0 :(得分:1)

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

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