7.07.2015 / 10:17 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| Ксакеп, слишком много всего есть в языке, можно изучать бесконечно
|
23.07.2015 / 16:16 | |
Addlient_Shaym Пользователь Сейчас: Offline
Регистрация: 13.09.2012
| Ребят, такая проблема: Пишу менюшку с помощью SFML, хочу сделать так чтоб при наведении курсора на надпись она меняла цвет. Написал следующий код: Открыть спойлер Закрыть спойлер #include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
int main()
{
int SCRWIDTH = 800;
int SCRHEIGHT = 600;
// Create the main window
sf::RenderWindow window(sf::VideoMode(SCRWIDTH, SCRHEIGHT), "SLAVA PONYAM!");
window.setMouseCursorVisible(true);
// Load a sprite to display
sf::Font font;
if (!font.loadFromFile("NatashaFont.ttf"))
return EXIT_FAILURE;
sf::Text text("Hello SFML", font, 50);
sf::FloatRect textRect = text.getLocalBounds();
//text.setOrigin(textRect.left + textRect.width/2.0f, textRect.top + textRect.height/2.0f);
//text.setPosition(sf::Vector2f(SCRWIDTH/2.0f, SCRHEIGHT/2.0f));
text.setPosition(sf::Vector2f(SCRWIDTH/2.0f - textRect.width/2.0f, SCRHEIGHT/2.0f - textRect.height/2.0f));
text.setOrigin(textRect.left, textRect.top);
// Start the game loop
while (window.isOpen())
{
// Process events
sf::Event event;
while (window.pollEvent(event))
{
// Close window: exit
if (event.type == sf::Event::Closed)
window.close();
}
// Clear screen
window.clear();
sf::Vector2f textvector = text.getPosition();
sf::FloatRect textr = text.getLocalBounds();
if (sf::Mouse::getPosition(window).x<=textvector.x+textr.width &&
sf::Mouse::getPosition(window).x>=textvector.x &&
sf::Mouse::getPosition(window).y<=textvector.y+textr.height &&
sf::Mouse::getPosition(window).y>=textvector.y )
{
text.setColor(sf::Color::Red);
}else{
text.setColor(sf::Color::White);
}
// Draw the string
window.draw(text);
// Update the window
window.display();
}
return EXIT_SUCCESS;
}
Все работает, но медленно. Т.е. чтобы надпись сменила цвет нужно медленно навести курсор на нее. В чем может быть проблема? Как ускорить проверку? |
23.07.2015 / 17:25 | |
NaruTrey Пользователь Сейчас: Offline
Имя: Андрей K. Откуда: Тольятти Регистрация: 15.01.2010
| Addlient_Shaym, проверь, твоя программа сколько FPS выдаёт. Если вдруг больше 60, то нужно настраивать вертикальную синхронизацию. Сам с SDL работаю, подсказать точнее не могу.
__________________
Чёрные усы кричает этот свисть Изменено NaruTrey (23.07 / 17:25) (всего 1 раз) |
23.07.2015 / 18:06 | |
StarTek Пользователь Сейчас: Offline
Имя: StarTek Откуда: Навои Регистрация: 14.06.2014
| Addlient_Shaym, ты постоянно в данном цикле все это делаешь - естественно тормозить будет. Проследить надо за MouseEvent или что то связанное с ней. И воспользуйся функцией intersects у объекта rect.
|
23.07.2015 / 21:53 | |
Addlient_Shaym Пользователь Сейчас: Offline
Регистрация: 13.09.2012
| StarTek, спасибо, теперь вроде не тормозит. Только вот возникла другая проблема, даже две: 1. Цикл while(window.pollEvent()) останавливает работу программы. Т.е. пока двигаешь мышкой - pollEvent возвращает true, в итоге цикл с обработкой эвентов работает, а последующая перерисовка не выполняется. 2. Перерисовка происходит при наведении на Rect, который находится в левом верхнем углу экрана, а не при наведении на сам текст. Открыть спойлер Закрыть спойлер #include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include <string>
#include <iostream>
float getFPS(const sf::Time& time) {
return (1000000.0f / time.asMicroseconds());
}
int main()
{
int SCRWIDTH = 800;
int SCRHEIGHT = 600;
// Create the main window
sf::RenderWindow window(sf::VideoMode(SCRWIDTH, SCRHEIGHT), "SLAVA PONYAM!");
window.setMouseCursorVisible(true);
// Load a sprite to display
sf::Font font;
if (!font.loadFromFile("NatashaFont.ttf"))
return EXIT_FAILURE;
sf::Text text("Hello SFML", font, 50);
sf::FloatRect textRect = text.getLocalBounds();
//text.setOrigin(textRect.left + textRect.width/2.0f, textRect.top + textRect.height/2.0f);
//text.setPosition(sf::Vector2f(SCRWIDTH/2.0f, SCRHEIGHT/2.0f));
text.setPosition(sf::Vector2f(SCRWIDTH/2.0f - textRect.width/2.0f, SCRHEIGHT/2.0f - textRect.height/2.0f));
text.setOrigin(textRect.left, textRect.top);
std::string fpsstring = "FPS";
sf::Text textfps(fpsstring, font, 50);
sf::Clock FPSClock;
// Start the game loop
while (window.isOpen())
{
// Process events
sf::Event event;
while (window.pollEvent(event))
{
// Close window: exit
if (event.type == sf::Event::Closed)
window.close();
if (event.type == sf::Event::MouseMoved)
{
sf::Vector2f textvector = text.getPosition();
if (textRect.contains(event.mouseMove.x, event.mouseMove.y))
{
std::cout << "Contains!" << std::endl;
text.setColor(sf::Color::Red);
}else{
text.setColor(sf::Color::White);
}
//std::cout << "new mouse x: " << event.mouseMove.x << std::endl;
//std::cout << "new mouse y: " << event.mouseMove.y << std::endl;
}
}
// Clear screen
window.clear();
// Draw the string
window.draw(text);
fpsstring = std::to_string(getFPS(FPSClock.restart()));
textfps.setString(fpsstring);
window.draw(textfps);
// Update the window
window.display();
}
return EXIT_SUCCESS;
}
|
24.07.2015 / 10:30 | |
StarTek Пользователь Сейчас: Offline
Имя: StarTek Откуда: Навои Регистрация: 14.06.2014
| Addlient_Shaym, 1ая проблема - какая то странная. Так не должно быть. А 2ую проблему не решить, разве что немного уменьшить rect.
|
24.07.2015 / 14:02 | |
Addlient_Shaym Пользователь Сейчас: Offline
Регистрация: 13.09.2012
| StarTek, В смысле "не должно быть"? Циклы window.isOpen и window.pollEvent должны выполняться одновременно? Тогда что я делаю не так? А насчет второго - уменьшение Rect бессмысленно. Я имел в виду, что текст должен менять цвет при наведении на текст, а не на квадрат (который размерами равен размеру надписи и нужен только для отрисовки текста в середине окна). Или я что-то не так понял?
Изменено Addlient_Shaym (24.07 / 14:04) (всего 1 раз) |
25.07.2015 / 14:07 | |
StarTek Пользователь Сейчас: Offline
Имя: StarTek Откуда: Навои Регистрация: 14.06.2014
| 1) Не должно быть. Так как на сайте sfml именно такой пример. 2) Все правильно понял ты. Значит, просто не поддерживается эта функция. И ещё, почему ты выбрал именно c++. Java или python можно было бы брать.
|
25.07.2015 / 14:28 | |
DominaN Пользователь Сейчас: Offline
Имя: Кирилл Откуда: Смоленск Регистрация: 28.09.2011
| Цитата StarTek: И ещё, почему ты выбрал именно c++. Java или python можно былов твоем вопросе уже есть ответ |
25.07.2015 / 17:49 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| StarTek, или C++ + Qt
|