SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › Интерфейсы управления textbox, button
В этой теме 9 ответов, 4 участника, последнее обновление boni9 3 мес., 4 нед. назад.
-
АвторСообщения
-
Ставлю на рассмотрение важный вопрос об Интерфейсах управления!
При создании меню игры возникли трудности, есть ли в SFML такие визуальные интерфейсы как Кнопка, Поле для ввода текста?
Что касается кнопки можно обойтись создание прямоугольника и в него подогнать текст, или даже объединить это в класс.
А что делать с информацией которую нужно ввести? Например ввести имя игрока: name, или ввести ip адрес к которому хочешь подключиться по network?
Про кнопки норм вариант и вполне стандартен. Что касается ввода текста, то тут надо извратиться. Быть может можно связать с компонентами ide. вывести sfml на форму, надо гуглить этот вопрос. вот что нашел:
http://en.sfml-dev.org/forums/index.php?topic=8432.0
И может есть какие то библиотеки добавляющие эту возможность.
Крайний случай можно извратиться и сделать двумя способами:
1. как на сеге/сони раньше вводили текст из алфавита , буквы в алфавите это кнопки.
2. сделать функцию, которая превратит каждую кнопку клавиатуры в символ. s=”s” и тд, и добавлять в строку.Вообщем вот тот необходимый примитив для реализации Libel, Button, Input:
C++1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495#include <SFML/Graphics.hpp>#include <SFML/Network.hpp>#include <iostream>#include <windows.h>#include "FormSFML.h"using namespace std;using namespace form;using namespace sf;/*char bufRus[256];char* Rus(const char* text) {CharToOem(text, bufRus);return bufRus;}*/int main(){IpAddress ip = IpAddress::getLocalAddress(); //Считывайем локальный ip адрессRenderWindow window(sf::VideoMode(800, 600), "Form");Button button(30, 30);Label label(30, 80, "Привет kychka-pc.ru");Button button2(230, 30, 150, 30, "Заменить текст");Input input(230, 80, 200, 30);Label label2(230, 150, "Гав");Label label3(30, 350, "Введите IP-адресс:");Input input2(30, 400, 200, 30, "192.168.1.64");Button button3(280, 350, 150, 150, "Connect");while (window.isOpen()){sf::Event event;while (window.pollEvent(event)){if (event.type == sf::Event::Closed)window.close();if (event.type == sf::Event::MouseButtonPressed){if (event.mouseButton.button == sf::Mouse::Left){Vector2i mouse = Mouse::getPosition(window); // Считываем координаты мыши(если че обратиться можно будет mouse.x mouse.y)if( button.select(mouse)){label.text = "Нажата кнопка!" ;}if( button2.select(mouse)){label2.text = input.readText() ;}if( button3.select(mouse)){ip = input.readText();}input.select(mouse); //поле вводаinput2.select(mouse); //поле ввода}}if(event.type == sf::Event::TextEntered){if(input.select()){input.reText(event.text.unicode);}if(input2.select()){input2.reText(event.text.unicode);}}}window.clear();window.draw(label.displayText());window.draw(label2.displayText());window.draw(label3.displayText());window.draw(button2.displayButton());window.draw(button2.displayText());window.draw(button.displayButton());window.draw(button.displayText());window.draw(button3.displayButton());window.draw(button3.displayText());window.draw(input.displayButton());window.draw(input.displayText());window.draw(input2.displayButton());window.draw(input2.displayText());window.display();sleep(milliseconds(1000/60));//Задержка}return 0;}А вот подключаемый класс FormSFNL:
C++1234567/** FormSFML.h** Created on: 02 мая 2015 г.* Author: Fedor* Специально для kychka-pc.ru*/C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173#include <string>using namespace std;using namespace sf;namespace form {Font None; // Шрифт первичная инициализацияclass Label {public:string text; //Текстprotected:double x; //Координата xdouble y; //Координата yText TXT; //Отображаемый текстpublic:Label(double _x = 0, double _y = 0, string _text ="Текст"){None.loadFromFile("ttf/None.ttf"); //передаем нашему шрифту файл шрифтаx = _x;y = _y;text = _text; // загружает текстTXT.setFont(None); // загружаем фрифтTXT.setCharacterSize(20); // в пикселях, а не точках!TXT.setColor(Color::White); // устанавливаем цвет выводимого текстаTXT.setPosition(x,y); // позиция текста}Text displayText(){TXT.setString(text); // загружаем в выводимый текст загружаемый текстreturn TXT;}};class Button : public Label {protected:double width; // Ширина Кнопкиdouble height; // Высота КнопкиRectangleShape BOX; // Создаем прямоугольник с размером width, heightpublic:Button(double _x = 0, double _y = 0, double _width = 150, double _height = 30, string _text ="Кнопка"){None.loadFromFile("ttf/None.ttf"); //передаем нашему шрифту файл шрифтаx = _x;y = _y;width = _width;height = _height;text = _text; // загружает текстTXT.setFont(None); // загружаем фрифтTXT.setCharacterSize(20); // в пикселях, а не точках!TXT.setColor(Color::White); // устанавливаем цвет выводимого текстаTXT.setPosition(x,y); // позиция текстаBOX.setSize(Vector2f(width, height)); // размер кнопкиBOX.setPosition(x,y); // координаты кнопкиBOX.setFillColor(sf::Color(133, 133, 133)); // цвет кнопкиBOX.setOutlineThickness(2); // Контур X пикселейBOX.setOutlineColor(Color(66, 66, 66)); // Цвет контура}//Проверка нажатия на кнопкуbool select(Vector2i _mouse){if((_mouse.x > x && _mouse.x < x + width) && (_mouse.y > y && _mouse.y < y + height)){return true;} else {return false;}}//Вывод ТекстаText displayText(){TXT.setString(text); // загружаем в выводимый текст загружаемый текстreturn TXT;}//Вывод кнопкиRectangleShape displayButton(){return BOX;}};class Input : public Button{protected:bool focus;public:Input(double _x = 0, double _y = 0, double _width = 150, double _height = 30, string _text =""){x = _x;y = _y;width = _width;height = _height;text = _text; // загружает текстfocus = false; // фокус поля вводаTXT.setFont(None); // загружаем фрифтTXT.setCharacterSize(20); // в пикселях, а не точках!TXT.setColor(Color::Black); // устанавливаем цвет выводимого текстаTXT.setPosition(x,y); // позиция текстаBOX.setSize(Vector2f(width, height)); // размер поля вводаBOX.setPosition(x,y); // координаты поля вводаBOX.setFillColor(Color::White); // цвет кнопки}//метод .reText( char ) изменяет текст внутри класса Типа данных Inputvoid reText(char _tmp){text.erase(text.size()-1);if(_tmp != 8){text += _tmp;} else {if(text.size() > 0){text.erase(text.size()-1);}}text += "|";TXT.setString(text);}// Проверка Фокуса Inputbool select(){return focus;}// Установка Фокуса Inputbool select(Vector2i _mouse){if((_mouse.x > x && _mouse.x < x + width) && (_mouse.y > y && _mouse.y < y + height)){ //Если нажат клаиша над объектом Input...focus = true; // Фокус truetext += "|"; // В конец строки добаляем | (что бы понимать что input в фокусе)} else { //...Иначе если нажатие произошло не над объектом, то...if(text.size() > 0){ // проверка последнего символа(иначе вылетает)if(text[text.size()-1] == 124){ // если символ | ...text.erase(text.size()-1); // ... то удаляем его}}focus = false; // устанавливаем фокус false}return focus;}//Вывод ТекстаText displayText(){TXT.setString(text); // загружаем в выводимый текст загружаемый текстreturn TXT;}//Вывод фона InputRectangleShape displayBOX(){return BOX;}//Для того, что бы считать текст с поля Ipnut необходимо пременить readText() который возвращает stringstring readText(){if(text[text.size()-1] == 124){ // удаляем (если есть) символ |text.erase(text.size()-1);}return text;}};} /* namespace form */////////////////////////////////////////////////////////////////////////
Прошу обратить внимание на метод
C++1readText()он позволяет считывать данные с поля Input без лишних знаков и занести в ip адрес и это будет работать!
P.S. Русские символы не вводятся хз как решить проблему(
P.S.S. я создал class с минимальным набором необходимым для работы с Интерфейсом вы же можете расширить так как вам необходимо…
Вложения:
You must be logged in to view attached files.Ах да чуть не забыл вот мой шрифт:
Я мельком просмотрел код и заметил массив символов думаю лучше все же использовать
std::string или String
И ввод текста в игре к примеру чата или что то ешё – выводить на отдельный поток.
Надеюсь по поводу Threads будут уроки.
А насчет алгоритма ввода если я не ошибся то у SFML есть некое sf::Event::TextEntered .
C++12345678/*char bufRus[256];char* Rus(const char* text) {CharToOem(text, bufRus);return bufRus;}*/Ты про это?)) ахах это я пытался русский ввод символов организовать
Насчет отдельного потока так и есть ты можешь создать n количество Input и вводить туда текст.
Threads это распараллеливание?
sf::Event::TextEntered я это и применял)
Сори ) мельком смотрел не заметил.
Про Threads я сам не чего не знаю но думаю да, это распараллеливание.
Пока я не могу передать нормально аргументы функции в этот поток threads. Могу передать значение числа (int ,double, итд…), могу передать хендл окна (RenderWindow &window), но кода дело доходить до аргумента типо (int x, RenderWindow &window, Sprite &sprite)- то есть не один а несколько аргументов, возникают не понятные мне ошибки.
Отличная работа, Fedor! Спасибо большое!
Я думаю можно будет сделать урок про ускорение работы программы, в том числе и потоки. Это после основного курса sfml можно делать уже такие штукиКак я понял – сломалась подсветка кода. Сегодня вроде сделал.
Прошу хотя бы назвать шрифт, о котором писали.
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.