SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Class Text
В этой теме 5 ответов, 3 участника, последнее обновление vproject57 6 года/лет, 9 мес. назад.
-
АвторСообщения
-
Здравствуйте!
Перейду сразу к сути.
Есть класс Text, чтобы создать новый текст приходится писать каждый раз такие строки как:
Text text1(“your text”, font, size);
text1.setStyle(Text::Bold);
text1.setPosition(x, y);И так далее.
К примеру создание Player(Игрока) в видео решалась путем создания класса. Я тоже пытался таким путем сделать, но есть ограничения которые не дают.
К примеру я делал так:
C++1234567891011121314151617181920class setText {public:Font font;setText(String sText, String sFont, int iSize,int iColor,float x, float y){font.loadFromFile("fonts/" + sFont);Text text1(sText, font, iSize);text1.setStyle(Text::Bold);switch (iColor){case 1: text1.setFillColor(Color::Red);case 2: text1.setFillColor(Color::Green);case 3: text1.setFillColor(Color::Blue);case 4: text1.setFillColor(Color::Yellow);case 5: text1.setFillColor(Color::Black);default: text1.setFillColor(Color::White);}text1.setPosition(x, y);}};Я понимаю(вроде как) что Text text1 должен быть рядом с Font font – это не возможно с class Text. В общем говоря – я не догнал что мне делать.
Надеюсь есть решение на эту тему, так как не хотелось бы иметь такое количество кода от class Text. Pss: посмотрите во вложениях!Вложения:
You must be logged in to view attached files.C++1234567891011121314151617181920class setText {public:Font font;setText(String sText, String sFont, int iSize,int iColor,float x, float y){font.loadFromFile("fonts/" + sFont);Text text1(sText, font, iSize);text1.setStyle(Text::Bold);switch (iColor){case 1: text1.setFillColor(Color::Red);case 2: text1.setFillColor(Color::Green);case 3: text1.setFillColor(Color::Blue);case 4: text1.setFillColor(Color::Yellow);case 5: text1.setFillColor(Color::Black);default: text1.setFillColor(Color::White);}text1.setPosition(x, y);}};Ну а собственно, как ты собрался тут обращатся к text1 если в конце конструктора класса будет автоматически вызван его деструктор так как он окажется вне поля видимости всей программы? Если ты хочешь просто использовать конструктор текста достаточно обьявить статический метод. Так же желательно Font так же обьявить статическим (Или держать его обьявление в начале int mani() дабы не терять его из поля видимости на протяжении всего жизненого цикла программы)
C++12345678910111213141516171819202122static Font publicFont//В int Mmain() просто добавляемpublicFont.loadFromFile("путь");static Text setText(String sText, int iSize,int iColor,float x, float y){Text text1(sText, publicFont, iSize);text1.setStyle(Text::Bold);switch (iColor){case 1: text1.setFillColor(Color::Red);case 2: text1.setFillColor(Color::Green);case 3: text1.setFillColor(Color::Blue);case 4: text1.setFillColor(Color::Yellow);case 5: text1.setFillColor(Color::Black);default: text1.setFillColor(Color::White);}text1.setPosition(x, y);return text1;}///Что бы получить доступ к методу в любом место просто после объявления инклудов дописываешьextern static Text setText(String sText, String sFont, int iSize,int iColor,float x, float y)Не совсем понял, в чём именно проблема. По сути всё верно, можно создать свой класс текста и туда передавать все необходимые параметры. Например, так:
C++12345678910111213class My_text{public:sf::Text text;My_text(const std::string &s, const sf::Font &font, unsigned int font_size,const sf::Color &text_color, const sf::Uint32 &text_style, float pos_x, float pos_y){text.setString(s);text.setFont(font);text.setCharacterSize(font_size);text.setFillColor(text_color);text.setStyle(text_style);text.setPosition(sf::Vector2f(pos_x, pos_y));}};Теперь любой текст можно создать с помощью одной команды.
C++1My_text mission_text("Mission 1", my_font, 14, sf::Color::Black, sf::Text::Bold, 100.0, 150.0);Вобще, если пытаешься делать под себя обёртки для упрощения своей жизни, конструктор можно подгонять под любое количество аргументов. К примеру в своём коде я буду всегда по умолчанию использовать один и тот же шрифт который был статически где-то объявлен, соответственно в конструкторе я могу упустить передачу файла шрифта и уже сразу задавать строку и позицию, либо что-то ещё.
К примеру на C# мой класс Text который я старался сделать похожим на аналог из SFML имеет уже зарание объявленую ссылку на шрифт которая присваивается ещё до вызова конструктора(Main.Font объявлен статично)C++12345678910111213141516171819202122232425262728293031323334353637class Text : ISFDrawable{#region FieldsSpriteFont font = Main.Font;///Поскольку я знаю, что программа не запустится если XNA не обнаружит в папке Content данного шрифта,///я могу со спокойной совестью выгружать специально заранее загруженый экземпляр шрифта который я использую во всей программе не передавая///его через параметры конструктора/*...*/public Text(){}public Text(SpriteFont TextFont){font = TextFont;}public Text(string rawString){RawString = rawString;}public Text(string rawString, Vector2 position, Color color = Color.White){RawString = rawString;Position = position;Colro = color;}public Text(string rawString, Vector2 position, Color color , float fontSize = 12){RawString = rawString;Position = position;Colro = color;CharacterSize = fontSize;}}tobidashi, ваше решение прям то что надо.
Спасибо!Решил добавить свой изменённый фрагмент кода:
C++1234567891011121314class MainText {public:Text text;MainText(const string &sText, const Font &font, unsigned int iSize, const Color &cColor,const Uint32 &uStyle, float x, float y){text.setString(sText);text.setFont(font);text.setCharacterSize(iSize);text.setFillColor(cColor);text.setStyle(uStyle);text.setPosition(Vector2f(x, y));}}; -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.