С Новым годом! Форум программистов, компьютерный форум, киберфорум
SFML
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 16.10.2019
Сообщений: 106
1

sf::Time как работает?

12.10.2020, 14:10. Показов 3180. Ответов 10
Метки c++, sfml (Все метки)

Author24 — интернет-сервис помощи студентам
Как работает этот sf::Time? "sf::Time определяет временной интервал. Иными словами, не представляет какое-то конкретное значение даты и времени (год/месяц/день/час/минута/секунда), а просто показывает количество времени, и то как оно будет истолковываться, зависит уже от контекста."

C++
1
2
3
Clock clock;
float time = static_cast<float>(clock.getElapsedTime().asMilliseconds());
         clock.restart(); //возвращает время, прошедшее с момента запуска часов, обнуляет часы
Если вывести значение time то получим:
// asMilliseconds() => 0, 1, 2
// asMicroseconds() => 600, 1200, 3200
// asSeconds() => 0.0009, 0.001278, 0.0031

Как теперь это всё применить к движению персонажа?У нас же есть начальные координаты отрисовки Х и У и пусть Х = 32, а У = 120. Везде вижу пример как сделать перемещение персонажа вот такой:


C++
1
2
3
4
5
6
7
8
9
10
11
if (Keyboard::isKeyPressed(Keyboard::Left))
        {
            player.move(-0.1f * time, 0); // то есть х = -0.1f * time, у = 0
                
        }
 
        if (Keyboard::isKeyPressed(Keyboard::Right))
        {
            player.move(0.1f * time, 0); // то есть х = 0.1f * time, у = 0
 
        }
В результате получаю непонятное изменение координат Х, которое даже близко не отталкивается от моих изначальных Х = 32 и при этом все работает, но как и почему? И для чего вообще умножать на 0.1 нужно?

Я пробовал задать вот так, чтоб было более логично как мне кажется:

C++
1
2
3
4
5
float playerX = 32.0f;
 
...
playerX += -0.1f*time; // для чего это умножение на 0.1?
player.move(playerX, 0);
И мой персонаж пропадает с экрана
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.10.2020, 14:10
Ответы с готовыми решениями:

Как работает модуль time
Решил за вечер этот разобраться с модулем time, есть разные задачи для таких новичков, как я , что...

Как работает команда time?
Добрый день. Недавно начал пользоваться компилятором gcc версии 4.3.3. и столкнулся с вопросом...

то работает, а то не работает (run time error 800a0005)
Ситуация такая: сделал приложение, используя DTC, разместил его на сервере (далеко). Приложение...

Не могу разобраться с заданием "Создайте класс Time с конструкторами Time(), Time( int hour)......"
/* Создайте класс Time с конструкторами Time(), Time( int hour), Time(int hour, int min),...

10
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
12.10.2020, 14:37 2
DessanM,
равномерное движение

Линейная алгебра для разработчиков игр
1
1 / 1 / 0
Регистрация: 16.10.2019
Сообщений: 106
12.10.2020, 16:46  [ТС] 3
Цитата Сообщение от zayats80888 Посмотреть сообщение
DessanM,
равномерное движение
Линейная алгебра для разработчиков игр
вектора, скаляры - это все отлично.

Я не понимаю каким образом мы от координат Х = 32 У = 120 переходим к координатам Х = 0 или 1 или 2 или 3, то есть если сделать 1 клик движения вправо/влево и вывод playerX из player.move(playerX, 0); то я вижу там штук десять значений:
0
1
0
2
1
3
2
0
1
2
1
1
1
0
0
3
2

Почему их так много и как это работает?Каким образом эти значения взаимодействуют с изначальными координатами?Как узнать на сколько пикселей двигается игрок?Какое именно значение подставляется в движение?
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
12.10.2020, 17:20 4
Цитата Сообщение от DessanM Посмотреть сообщение
вектора, скаляры - это все отлично
Без них никак.

Цитата Сообщение от DessanM Посмотреть сообщение
Я не понимаю каким образом мы от координат Х = 32 У = 120 переходим к координатам Х = 0 или 1 или 2 или 3, то есть если сделать 1 клик движения вправо/влево и вывод playerX из player.move(playerX, 0); то я вижу там штук десять значений
Где вы там что видите, мне отсюда не видно. Но вангую, что вы видите не координаты, а изменение координат.
Цитата Сообщение от DessanM Посмотреть сообщение
Почему их так много и как это работает?
...
Цитата Сообщение от DessanM Посмотреть сообщение
Каким образом эти значения взаимодействуют с изначальными координатами?
Вы знаете, что делает метод player.move?
Цитата Сообщение от DessanM Посмотреть сообщение
Как узнать на сколько пикселей двигается игрок?
Как узнать, сколько метров пройдёт человек за одну секунду, если он движется со скоростью 2 м/с?
И как потом узнать его координату через эту секунду, если предыдущая координата была 123 м (считаем, что движение вдоль одной оси).
Цитата Сообщение от DessanM Посмотреть сообщение
Какое именно значение подставляется в движение?
Вы статью по второй ссылке прочитали, или как увидели слово вектор, сразу глаза зажмурили?

Добавлено через 1 минуту

Не по теме:

Я не "токсичный", просто манера такая :)

0
1 / 1 / 0
Регистрация: 16.10.2019
Сообщений: 106
12.10.2020, 18:43  [ТС] 5
Цитата Сообщение от zayats80888 Посмотреть сообщение
Вы знаете, что делает метод player.move?
Пытаюсь найти что-то полезное, но пока что только 1000 страниц каких-то обрезков форумов выдаёт гугл.

Цитата Сообщение от zayats80888 Посмотреть сообщение
Как узнать, сколько метров пройдёт человек за одну секунду, если он движется со скоростью 2 м/с?
И как потом узнать его координату через эту секунду, если предыдущая координата была 123 м (считаем, что движение вдоль одной оси).
Расстояние = скорость * время => за 1 секунду человек пройдёт 2 метра, за 2 секунды пройдёт 4 метра и т.д. или же ( 2, 0).
Если нашу точку отсчёта принять за вектор ( 123, 0 ), то сложим их и получим получим (123, 0) + (2,0) = (125, 0). Вот связь новых координат со старыми. Верно?
А если верно, то "Почему их так много и как это работает?"
Код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <iostream> // ключевая библиотека например для cout 
#include <SFML/Graphics.hpp>
 
using namespace sf; // иначе нужно писать std::cout << "hello" << endl;
using namespace std;
 
float playerX = 32.0f;
float playerY = 120.0f;
float playerwidth = 32.0f;
float playerheight = 64.0f;
 
int main() {
 
    RenderWindow window(VideoMode(1120, 384), "TEST!");
    
    RectangleShape player;
    player.setSize(Vector2f(playerwidth, playerheight));
    player.setFillColor(Color::Green);
    
    player.setPosition(playerX, playerY);
    cout << "First position " << playerX << " , " << playerY << endl;
    
    Clock clock; // создать объект clock
    
    
    while (window.isOpen())
    {
        //записываем в переменную прошедшее время в микросекундах
 
        float time = static_cast<float>(clock.getElapsedTime().asMilliseconds());
        clock.restart(); //возвращает время, прошедшее с момента запуска часов, обнуляет часы
        // asMilliseconds() = 0, 1, 2
        // asMicroseconds() = 600, 1200, 3200
        // asSeconds() = 0.0009, 0.001278, 0.0031
        //cout << time << endl;
        
        // Обрабатываем очередь событий в цикле
        Event event;
        while (window.pollEvent(event))
        {
            // Пользователь нажал на «крестик» и хочет закрыть окно?
            if (event.type == Event::Closed)
                window.close(); // тогда закрываем его
        }
 
        
        if (Keyboard::isKeyPressed(Keyboard::Left))
        {
            
            playerX = -0.1f * time;
            player.move(playerX, 0);
            cout << playerX << endl; // Почему их так много и как это работает?
            
        }
 
        if (Keyboard::isKeyPressed(Keyboard::Right))
        {
            player.move(time, 0); //Почему их так много и как это работает?
 
        }
 
        if (Keyboard::isKeyPressed(Keyboard::Up))
        {
            
        }
 
        if (Keyboard::isKeyPressed(Keyboard::Down))
        {
            
        }
 
        window.clear(Color::Black);
        //window.clear(); очищаем экран чтоб картинка не рисовалась поверх себя при движении,
        //черный фон по умолчанию
 
 
        window.draw(player); // отрисовать объект
        window.display(); // Отрисовка окна
        //system("pause"); // чтоб окно консоли не закрывалось
    }
    return 0;
}

Не по теме:

Глаза я зажмурил начиная с матриц. Решал я их в своё время очень легко, но сейчас я застрял вроде как на элементарных вещах, куда мне координаты через матрицы считать. И мы не в штатах, чтоб про токсичность думать

0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
12.10.2020, 20:06 6
Цитата Сообщение от DessanM Посмотреть сообщение
Пытаюсь найти что-то полезное, но пока что только 1000 страниц каких-то обрезков форумов выдаёт гугл.
Просто добавляет вектор смещения к текущему положению
C++
1
2
3
4
Vector2f offset;
//...
player.move(offset); // это то же самое,
player.setPosition(player.getPosition() + offset); //  что и это.
Цитата Сообщение от DessanM Посмотреть сообщение
Вот связь новых координат со старыми. Верно?
Верно.

А если верно, то "Почему их так много и как это работает?"
Потому что у вас частота кадров не ограничена, а ввод обрабатывается каждый кадр.
Ваш код с небольшими правками:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream> // ключевая библиотека например для cout 
#include <SFML/Graphics.hpp>
 
using namespace sf; // иначе нужно писать std::cout << "hello" << endl;
using namespace std;
 
float playerX = 32.0f;
float playerY = 120.0f;
float playerwidth = 32.0f;
float playerheight = 64.0f;
 
float playerSpeed = 0.1f;  //<--------раз вы измеряете время в миллисекундах, то это скорость пиксели/мс (!при дефолтном виде!)
 
int main() {
 
    RenderWindow window(VideoMode(1120, 384), "TEST!");
    window.setFramerateLimit(60);  //<--------!!!!!
 
    RectangleShape player;
    player.setSize(Vector2f(playerwidth, playerheight));
    player.setFillColor(Color::Green);
 
    player.setPosition(playerX, playerY);
    cout << "First position " << playerX << " , " << playerY << endl;
 
    Clock clock; // создать объект clock
 
 
    while (window.isOpen())
    {
 
        float time = static_cast<float>(clock.restart().asMilliseconds());
 
        // Обрабатываем очередь событий в цикле
        Event event;
        while (window.pollEvent(event))
        {
            // Пользователь нажал на «крестик» и хочет закрыть окно?
            if (event.type == Event::Closed)
                window.close(); // тогда закрываем его
        }
 
 
        if (Keyboard::isKeyPressed(Keyboard::Left))
        {
            float dx = -playerSpeed * time; //перемещение = скорость * время
                                            //минус, потому что влево
            player.move(dx, 0);
            cout << "dx " << dx << endl;
 
        }
 
        if (Keyboard::isKeyPressed(Keyboard::Right))
        {
            float dx = playerSpeed * time;
            player.move(dx, 0);
            cout << "dx " << dx << endl;
        }
 
        if (Keyboard::isKeyPressed(Keyboard::Up))
        {
 
        }
 
        if (Keyboard::isKeyPressed(Keyboard::Down))
        {
 
        }
 
        window.clear(Color::Black);
        window.draw(player); // отрисовать объект
        window.display(); // Отрисовка окна
    }
    return 0;
}
0
1 / 1 / 0
Регистрация: 16.10.2019
Сообщений: 106
12.10.2020, 20:41  [ТС] 7
Цитата Сообщение от zayats80888 Посмотреть сообщение
Ваш код с небольшими правками:
Спасибо, теперь понятней.

window.setFramerateLimit(60); //<----Синхронизируем частоту обновления приложения с вертикальной частотой монитора, чтоб не было наложения картинок.

То есть если у меня частота обновления приложения 60 кадров в секунду, то я получу 60 значений dx за каждую секунду удержания кнопки влево/вправо? То что я сейчас вижу 3-5 значений означает, что я слишком медленно отжимаю клавиши движения?
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
12.10.2020, 21:00 8
Цитата Сообщение от DessanM Посмотреть сообщение
Синхронизируем частоту обновления приложения с вертикальной частотой монитора
Не совсем. Для vsync есть метод window.setVerticalSyncEnabled(true);
А это просто ограничение кадров( != синхронизация ).
Главное не используйте и то и другое одновременно, что нибудь одно.

Цитата Сообщение от DessanM Посмотреть сообщение
То есть если у меня частота обновления приложения 60 кадров в секунду, то я получу 60 значений dx за каждую секунду удержания кнопки влево/вправо?
Не факт, это ограничение макс. fps. В зависимости от "оптимизации" кода можно получить и 2 fps

Цитата Сообщение от DessanM Посмотреть сообщение
То что я сейчас вижу 3-5 значений означает, что я слишком медленно отжимаю клавиши движения?
Всмысле при однократном нажатии? Ну да.

Добавлено через 3 минуты
DessanM, у SFML есть неплохая онлайн документация.
SFML
0
1 / 1 / 0
Регистрация: 16.10.2019
Сообщений: 106
12.10.2020, 21:01  [ТС] 9
window.clear(Color::Black);
window.draw(player); // отрисовать объект
window.display(); // Отрисовка окна

Или же функция main () и все эти команды отрисовки вызываются с максимальной скоростью процессора?То есть процессор обрабатывает весь код так быстро как может и потом высчитывает период отображения всего содержимого экрана, чтоб получилось 60 кадров в секунду?
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
12.10.2020, 21:11 10
Цитата Сообщение от DessanM Посмотреть сообщение
То есть процессор обрабатывает весь код так быстро как может и потом высчитывает период отображения всего содержимого экрана, чтоб получилось 60 кадров в секунду?
Типа того. У окна есть свой таймер, поток просто усыпляется. Вот как это реализовано:
https://github.com/SFML/SFML/b... w.cpp#L215
1
1 / 1 / 0
Регистрация: 16.10.2019
Сообщений: 106
12.10.2020, 21:38  [ТС] 11
Вот теперь вообще всё встало на свои места)

Спасибо огромное!
0
12.10.2020, 21:38
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.10.2020, 21:38
Помогаю со студенческими работами здесь

Time, it needs time. Или: "Как установить системное время?"
Привет всем! Собственно %субж%. Долблюсь уже целый день и не могу найти решение. Как Изменить...

Time.sleep(1) работает не корректно
Есть граф, есть массив path, в котором хранятся ребра, ни образуют путь. Нужно визуализировать...

Не работает Where . Between переменная типа Time
Есть задание вывести значения строк с переменной Date_order между двух значений. Попробовал...

SELECT не работает с полями DATE/TIME...
Пытаюсь подключиться к БД Access через ODBC. Когда выдаю SELCT * FROM Table WHERE Time &gt; $q;...

Не работает макрос (Run-time error '5941')
Создал макрос (не написал через VBA , просто создал через функцию запись макроса).Все работало , на...

Не работает автофильтр, run-time error 1004
Здравствуйте. В моей программе мне нужно выдать счет каждому клиенту. Я ввожу на форме1 дату...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru