Войти
ПрограммированиеФорумИгровая логика и ИИ

Проблема с передвижением.

Страницы: 1 2 Следующая »
#0
16:21, 15 мар 2023

Проблема с передвижением. Да у float знаю что точность снижена и что в цикле его нельзя использовать, так как он начинает застревать. Что же делать? Мне нужны числа на минималках, есть ли возможность работать с этим? На видео на зажал кнопку и персонаж ушел вправо, кнопка нажата, а дальше не идет и координаты показаны в конце видео, что он не хочет увеличивать своё число.

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

#1
16:23, 15 мар 2023

хотя я прибавляю всего по 0.04f за шаг.

#2
16:23, 15 мар 2023

Если прибавлять по 1.f, то всё работает, но это слишком быстро.

#3
17:05, 15 мар 2023

Что бы там у тебя не происходило, если вдруг захочешь изложить суть, это можно сделать прямо здесь.

#4
17:43, 15 мар 2023

Для людей с другим типом мышления попробую сказать более понятно. Проблема с float арифметикой. Что происходит при прибавлении 0.04f к иксу, то видно на экране.

#5
19:39, 15 мар 2023

v7
> Проблема с float арифметикой.
Да не, чушь. Проблема между стулом и монитором.

#6
19:52, 15 мар 2023

v7
> Что происходит при прибавлении 0.04f к иксу
Если икс имеет величину десятки тысяч или больше, то будут проблемы. Если меньше - точности должно хватить.

#7
22:42, 15 мар 2023

v7
> Для людей с другим типом мышления ... Проблема с float арифметикой. Что происходит при прибавлении 0.04f к иксу,

Ты вообще вкурсе, какая точность у 32 bit-float? 1.1 E-38 ... 3.4 E38. Т.е. твои числа отстоят от этих точек  более чем на 30 десятичных разрядов.
И даже если твой ИКС близок к этим значениям, то что ты будешь прибавлять к нему хоть 0.04f, хоть 1.0f - роли не сыграет.

Как человек "с другим типом мышления" по твоему кино, твой код я восстановить не смогу, так что ты сам лови в отладчике, где у тебя nan inf и
другие чудеса типа деления на 0.

> то видно на экране.
Вот в этом и есть проблема: у тебя на экране нифига не видно.
Я уже не говорю про невидимый код, и никак непросматриваемую связь с ИИ.

#8
0:00, 16 мар 2023

Для начала стоило бы показать код.
Прибавлять надо не 0.4, а 0.4 * deltaTime
И скорее всего вы реагируете на событие когда клавиша нажалАСЬ, а не нажаТА. Это два разных события KeyDown и KeyPress.
Либо ваш компьютер считаешь клавишу залипшей и перестаёт на неё реагировать. (такое есть в Bolt для Unity)
deltaTime это разница во времени между кадрами.
Но, если вам надо именно по клеткам, то он должен сдвинуться лишь 1 раз, а не 3и как у Вас. В общем ошибка в логике и обработки событий.

#9
5:07, 16 мар 2023

MrShoor
Помню раньше шутки были такие, что типа надо прокладку между стулом и монитором поменять. хахаха.
А вообще я тебя знаю, я тебе недавно на twitch по directx писал и на стримы заходил. Я покопался в directx и даже что-то сделал, а потом понял, что всё можно и на opengl сделать и начал делать на нём.

Сейчас код покажу. Он вместе с SDL2. Кстати, камера нормально двигается, а персонаж не хочет.

void LevelForest::update ()
{
  Camera *camera = Camera::getInstance();

  const uint8_t *state = SDL_GetKeyboardState (NULL);
  if (state[SDL_SCANCODE_Q])
    exit (0);

  if (state[SDL_SCANCODE_UP])
    camera->move(0.f, -0.04f);

  if (state[SDL_SCANCODE_DOWN])
    camera->move(0.f, 0.04f);
    
  if (state[SDL_SCANCODE_LEFT])
    camera->move(-0.04f, 0.f);
    
  if (state[SDL_SCANCODE_RIGHT])
    camera->move(0.04f, 0.f);

  if (state[SDL_SCANCODE_D])
    human->move(1.04f, 0.f);

  if (state[SDL_SCANCODE_A])
    human->move(-1.04f, 0.f);
}

Вот код human.

void Object::move(float _x, float _z)
{
  x += _x;
  z += _z;
  printf ("-- %f %f\n", x, z);
  translate = glm::translate(model, glm::vec3{x, y, z});
}

Да, я пока не использую deltaTime, но я туда приделаю таймер и по таймеру будет одинаковое перемещение. Просто новый движок и еще мало что сделано.

Сейчас проснулся, включил и он двигается, но по выводу пишет что всегда нули, но он двигается в нужные стороны.

-- 0.000000 0.000000
-- 0.000000 0.000000
-- 0.000000 0.000000
-- 0.000000 0.000000
-- 0.000000 0.000000
-- 0.000000 0.000000
...
-- 0.000000 0.000000
#10
5:08, 16 мар 2023

А блин, я же human в передвижении поставил 1.04, тогда понятно почему он двигается.

#11
5:44, 16 мар 2023

Так, ребята, ребята, ребята. Я сменил float тип на glm::vec3 и всё заработало. Странно, но как? Короче теперь работает, ура.

#12
6:12, 16 мар 2023

Хотя по таймеру моделька какая-то дерганная получается, может действительно deltaTime сделать.

#13
9:09, 16 мар 2023

v7
>Да у float знаю что точность снижена и что в цикле его нельзя использовать, так как он начинает застревать. Что же делать?

Можно, просто нужно в цикле каждый раз считать заново, используя исходное значение переменной и пройденное время, а результат записывая в другую переменную, тогда неточности не суммируются.

#14
10:02, 16 мар 2023

Skvoznjak
> нужно в цикле каждый раз считать заново, используя исходное значение переменной
> и пройденное время, а результат записывая в другую переменную, тогда неточности
> не суммируются
Верно. Только это никак не влияет на неточности в каждом шаге, от того, что ты накапливаешь ошибку, может измениться общее время прохождения, но не рывки в каждом шаге.
v7
Я выше написал, но ты не среагировал. Какие типичные значения для X, в каком диапазоне? Если в пределах сотен или тысяч от нуля, то не должно такого быть, нужно в другом месте ошибку искать.

Страницы: 1 2 Следующая »
ПрограммированиеФорумИгровая логика и ИИ