SFML и C++ Уроки \ Разработка игр › Форумы › SFML Начало работы (подключение и настройка) › не вижу изменения значений в реальном времени
В этой теме 14 ответов, 4 участника, последнее обновление Dikoy 7 года/лет назад.
-
АвторСообщения
-
Не могу видеть изменения значений в реальном времени. Точнее могу, но только когда я двигаю мышь. А ещё если я записываю видео через ОБС, то значения обновляются раз в секунду. Но если я не записываю видео и не трогаю мышь, то они застывают. Не могу понять что не так. Для наглядного примера записал видео:
Вот код, если нужно:
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778#include <SFML/Graphics.hpp>// SF:://#include <math.h>// srand???#include <ctime>// time#include <iostream>// std::#include <sstream>// ostringstreamusing namespace sf;// Что бы больше не писать sf::using namespace std;// Что бы больше не писать std::int main()// Главная функция{RenderWindow window(VideoMode(1024, 720), "My Game");// Создаём окно игрыFont font;// Создаём переменную шрифтаfont.loadFromFile("Tahoma.ttf");// Передаем нашему шрифту файл шрифтаText text("", font, 30);// Создаем объект текст. закидываем в объект текст строку, шрифт, размер шрифта(в пикселях);//сам объект текст (не строка)text.setColor(Color::Red);// покрасили текст в красный. если убрать эту строку, то по умолчанию он белыйtext.setStyle(sf::Text::Bold);// Жирный текст. по умолчанию он "худой"Texture background;// Создаём текстуру бгbackground.loadFromFile("images/BG.png");// Откуда взять картинку для текстуры бгSprite bg1;// Создаём спрайт для бгbg1.setTexture(background);// Цепляем текстуру бг на спрайтbg1.setPosition(0,0);// Устанавливаем положение спрайтаfloat GameTime = 0;// Создаём переменную для времени всей игрыfloat ZZCurrentFrame = 0;// Создаём переменную которая хранит номер текущего кадраint rnd = 0;// Создаём переменную в которой хранится значение случайного числаClock clock;// Создаём переменную для времени SFMLwhile (window.isOpen())// Главный цикл(пока окно открыто){Event event;// Создаём основной ивентwhile (window.pollEvent(event))// Проверяем значение ивента{GameTime = clock.getElapsedTime().asMicroseconds();// Создаём переменную времени и считаем его в микросекундахclock.restart();// Обновляем времяGameTime = GameTime / 800;// Придаём времени плавностиZZCurrentFrame += 0.0007 * GameTime;// Фрейм увеличивается со временем и с определённой скоростьюsrand(time(NULL));// Случайное число меняется с истечением времениrnd = rand() % 101;// Случайное число может быть от 0 до 100if (event.type == Event::Closed)// Когда ивент равен "Закрытию окна игры" ...window.close();// Окно игры закрывается}window.clear();// Очищаем окно игрыwindow.draw(bg1);// Рисуем спрайт с текстурой бгostringstream RndShown;// Создаём новую переменнуюRndShown << rnd;// Передаём новой переменной значение случайного числаtext.setString("Random value: " + RndShown.str());// Придаём вид строке текстаtext.setPosition(500, 300);// Задаем позицию текстаwindow.draw(text);// Рисуем этот текстostringstream GameTimeShown;// Создаём новую переменнуюGameTimeShown << GameTime;// Передаём новой переменной значение времени игрыtext.setString("Время игры: " + GameTimeShown.str());// Придаём вид строке текстаtext.setPosition(500, 350);// Задаем позицию текстаwindow.draw(text);// Рисуем этот текстostringstream CurrentFrameShown;// Создаём новую переменнуюCurrentFrameShown << ZZCurrentFrame;// Передаём новой переменной значение текущего фреймаtext.setString("CurrentFrame: " + CurrentFrameShown.str());// Придаём вид строке текстаtext.setPosition(500, 400);// Задаем позицию текстаwindow.draw(text);// Рисуем этот текстwindow.display();// Рисуем всё в окне игры}return 0;// Закрыть программу корректно, когда основной цикл игры завершён}Насколько я понял проблема в том что обновления значиний происходит только когда метод window.pollEvent(event) == true . То есть когда ты ничо не делаешь window.pollEvent(event) = false и обновление не происходит. Попробую код :
C++123456GameTime = clock.getElapsedTime().asMicroseconds();// Создаём переменную времени и считаем его в микросекундахclock.restart();// Обновляем времяGameTime = GameTime / 800;// Придаём времени плавностиZZCurrentFrame += 0.0007 * GameTime;// Фрейм увеличивается со временем и с определённой скоростьюsrand(time(NULL));// Случайное число меняется с истечением времениrnd = rand() % 101;// Случайное число может быть от 0 до 100выполнить в не цыкла while (window.isOpen()).
Так и есть. Самое смешное что я уже пробовал так сделать, но видимо забыл нажать перестроить решение. Спасибо за ответ.
Хорошо описал проблему, только заголовок теме на форуме в след раз дай похожий на “краткую суть проблемы”. типа “не вижу изменения значений в реальном времени”.
Хорошо. Чувствую вопросов будет ещё много. Например можете посоветовать мне шрифт с которым меньше всего проблем? Испробовал уже tahoma.ttf, arial.ttf, calibri.ttf и русский язык не отображается. CyrilicOld.TTF из урока отображается нормально, но мне бы что-то стандартное.
Если новый вопрос далек от этой темы – надо создать новую тему))) Шрифты ищи с кириллицей такого же формата. я только этот использовал. попробуйна форуме в поиске вбить шрифты кириллица
Подойдёт любой шрифт из -Windows\Fonts только текст нужно записывать в формате юникода(добавть L перед ” ” ) text.setString(L”Уровень”);
Вот спасибо! Вчера долго искал как заставить визуалку отображать кириллицу правильно, чего только не советовали. А оказывается всё очень просто.
Такое тоже надо в SFML Wiki в раздел FAQ записать)
Префикс L”…” относится к языку в целом, а не к SFML.
Как использовать префикс L”…” в такой ситуации?
MyGame.cpp
C++12345678910111213141516171819202122232425262728293031323334#include "stdafx.h"#include "Text.h"int main (){RenderWindow window(VideoMode(1024, 768), "MyGame");float GameTime;Clock clock;CText gametime("Время Игры: ", 380, 10);while (window.isOpen()){Event mainEvent;while (window.pollEvent(mainEvent)){if (mainEvent.type == Event::Closed)window.close();}GameTime = clock.getElapsedTime().asMicroseconds();clock.restart();GameTime = GameTime / 800;window.clear();window.draw(gametime.GetText());window.display();}return 0;}Text.cpp
C++1234567891011121314151617181920#include "Text.h"CText::CText(string name, int x, int y){font.loadFromFile("Tahoma.ttf");text.setFont(font);text.setString(name);text.setPosition(x, y);text.setColor(Color::Red);text.setStyle(Text::Bold);}CText::~CText(void){}Text CText::GetText(){return text;}Text.h
C++123456789101112131415#pragma once#include "stdafx.h"class CText{public:CText(string name, int x, int y);~CText(void);Text GetText();private:Font font;Text text;};stdafx.h
C++1234567#pragma once#include <SFML/Graphics.hpp>#include <iostream>using namespace sf;using namespace std;CText gametime(L”Время Игры: “, 380, 10);
Если бы всё было так просто, кажется префикс понимает только “text.setString”…
Или подскажите как мне теперь лучше склеить gametime и GameTime в одну строчку? Что бы было в таком виде “Время игры: GameTime”.
Вложения:
You must be logged in to view attached files.std:: string не совместим с форматом юникода используй sf::String.
Благодарю ещё раз
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.