Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2020, 11:32   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию Почему так?

Здравстуйте.
Не уверен, к какому разделу относятся вопросы про OpenGL. Обычно OpenGL используется для написания игр. Но у меня не игра, а просто программа. Играть в нее нельзя.
В общем, вопрос в том, как сделать прыжок в этой недоигре?
Сразу оговорюсь, что всякие продвинутые умноженя матриц , GLM и т.п. не используются. Используются по-старинке функции glRotate() и glTranslate().
По-идее, алгоритм такой:
1) ввести переменную, отвечающую за вектор движения по вертикали
2) при нажатии клавиши присваивать этому вектору некое значение больше нуля (это значение будет как-бы тянуть камеру по вертикальной оси)
3) в процедуре обработки движения прибавлять этот вектор к текущей позиции камеры.
4) там же отнимать от вектора некое маленькое число, тем самым имитируя гравитацию.

Но если делать это в цикле, то ничего хорошего не получается. При прибавлении вектора к позиции камеры, она перемещается мгновенно. И скорость прыжка зависит от FPS. Умножение на deltatime, почему-то, не помегает. Всё-равно получается хрень.
Адекватный прыжок получается сделать только если вызывать все процедуры по таймеру.
Например, следующий код вызывается примерно 30 раз в секунду. SetTimer(wnd, 0, 1000 / 30, nullptr);
Код:
//обработка клавишь
    if (<нажали клавишу> && onGround){
        onGround = false;
        motionY = jumpHeight * motionCoef;
        timerJump->Reset(); //засекаем время
        timerJump->enabled = true;
    }
	
//обработка перемещения
    motionY -= 0.1f;
    player.positionY += motionY;
    motionY *= 0.98f;

    onGround = player.positionY <= 0.0f;
    if (player.positionY < 0.0f){
        player.positionY = 0.0f;
        motionY = 0.0f;
        if (timerJump->enabled) {
            std::cout << timerJump->ElapsedTime() << std::endl;
            timerJump->enabled = false;
            timerJump->Reset();
        }
    }
При этом получается практически идеальный прыжок. Если у нас больше чем 25 FPS, то таймер timerJump выдаёт примерно 0.6. То есть, прыгаем мы всегда с одинаковой скоростью.
Но если FPS падает ниже, то скорость прыжка тоже падает. Прыжок получается как у америкосов на Луне. Но при этом, вроде как, скорость перемещения вперёд/назад/влево/вправо остаётся неизменной.
Почему так?
BLACK_RAIN вне форума Ответить с цитированием
Старый 28.02.2020, 12:06   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Почему так
Потому что используете константы.
Если очень хотите их использовать, тогда подбирайте их для нужного FPS.

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Умножение на deltatime, почему-то, не помегает.
Где тут deltatime?
waleri вне форума Ответить с цитированием
Старый 28.02.2020, 13:07   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Потому что используете константы.
Если очень хотите их использовать, тогда подбирайте их для нужного FPS.
Не понял, а почему? Какая разница, константы или нет? Это ведь в любом случае одно и тоже число. Как это влияет на математику? Почему разница ощутима только при FPS ниже 25?
Цитата:
Сообщение от waleri Посмотреть сообщение
Где тут deltatime?
Сейчас тут нету deltatime. Эта хрень выполняется в таймере.
Но если выполнять код в цикле, а не в таймере, то тогда нужно умножать на deltatime. Но это не дает желаемого результата. Перемещение получается сделать очень просто (и FPS не влияет), а прыжок - нет. И я не пойму, что не так.
Понятно что всё не так. Вроде всё просто, но работает не так как надо.
Если делать без таймера, то перемещение камеры на прыжок вообще не похоже.
BLACK_RAIN вне форума Ответить с цитированием
Старый 28.02.2020, 13:34   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Не понял, а почему?
Ну посчитайте ручками для 10ФПС и для 100 ФПС и сравните результаты...
waleri вне форума Ответить с цитированием
Старый 28.02.2020, 13:54   #5
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Ну посчитайте ручками для 10ФПС и для 100 ФПС и сравните результаты...
Не понял.Сейчас ведь оно по таймеру выполняется. Или вы хотите сказать, что при низком FPS таймер не успевает выполняться? Если так, то при чем здесь тогда константы?
BLACK_RAIN вне форума Ответить с цитированием
Старый 28.02.2020, 16:08   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

FPS напрямую зависит от таймера...
waleri вне форума Ответить с цитированием
Старый 29.02.2020, 10:47   #7
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Или вы хотите сказать, что при низком FPS таймер не успевает выполняться? Если так, то при чем здесь тогда константы?
Именно так. У вас FPS падает из-за того что процессор занят. Он объясняет видео карте как и что надо нарисовать. А раз процессор занят, то таймер не будет успевать выполняться. И плюс к тому же неравномерность хода таймера. Поэтому на каждом кадре надо вычислять разницу.

Вообще в интернете полно статей как сделать прыжок в игре.

Код:
motionY -= 0.1f;
    player.positionY += motionY;
    motionY *= 0.98f;
Это ещё что за финт ушами?

Напоминаю как выглядит формула перемещения
V:=V-g*t;
y:=y+V*t-g*t*t/2;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 29.02.2020, 15:33   #8
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
FPS напрямую зависит от таймера...
Ну а константы здесь тогда при чем? Вы объяснять так и не научились. Кидаетесь всегда какими-то короткими загадочными фразами и сиди потом вангуй. Зато темы переименовывать умеете.
Теперь название темы совершенно не отражает ее сути.
Тему переименовали в "почему так?", а почему так, так толком и не объяснили.
Цитата:
Сообщение от Pavia Посмотреть сообщение
Вообще в интернете полно статей как сделать прыжок в игре.
Я честно пытался найти, но не нашел. Да и что там нового? Алгоритм-то я и так знаю. У меня реализовать его в коде не получалось. Сейчас уже получилось. Сегодня весь день тестировал. Я просто одну из переменных забыл на дельту умножить и не замечал этого. Если бы еще один день потыкался, то нашел бы косяк.
Цитата:
Сообщение от Pavia Посмотреть сообщение
Это ещё что за финт ушами?
Это симуляция гравитации. Если по таймеру, то вполне работоспособно Хотя последняя строчка явно лишняя.

Цитата:
Сообщение от Pavia Посмотреть сообщение
Напоминаю как выглядит формула перемещения
V:=V-g*t;
y:=y+V*t-g*t*t/2;
V - скорость, Т - время.
а G - это притяжение?
BLACK_RAIN вне форума Ответить с цитированием
Старый 29.02.2020, 18:14   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
темы переименовывать умеете
Я к переименовыванию тем отношения не имею.


Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
всегда какими-то короткими загадочными фразами и сиди потом вангуй
Не "вангуй" а "гугли", хотя иногда это одно и тоже.
Вся идея в том, чтоб вы сами пришли к решению - тогда материал усваивается лучше.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему так... Hermeneticus Общие вопросы C/C++ 2 22.07.2017 17:20
почему-то таблица "неперспективные товары" пустая получается, не понимаю почему chet chou Microsoft Office Access 1 11.05.2017 19:19
Почему 0.01+0.06 не 0.07 SeRhy JavaScript, Ajax 2 30.05.2015 19:48
Здравствуйте ! в чем проблема,почему почему время исполнения операций не работает ? ion leahu Помощь студентам 6 23.11.2014 19:36