2016-11-14 31 views
0

我无法绘制自定义的sf::Drawable派生对象。SMFL - 仅绘制了2个对象中的1个

//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没有。我确信这一点,因为我仍然可以编辑文本,但不显示。

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

+0

m_textbox是不是呈现或它呈现在屏幕之外?我们可以有截图吗? – Fefux

+1

与问题无关:使用'一次编译指示'**或**包括警卫,但不能同时使用。你的包括守卫应该是文件中的第一件事(在#include之前)。 –

+1

在'draw()'方法内部放置一个断点并检查'Text'对象的字体是否仍然有效。 “文字”麻烦最常见的原因是字体对象超出了范围。 –

回答

1

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

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