Как исправить дрожь при перемещении по диагонали?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как исправить дрожь при перемещении по диагонали?

Сообщение Anonymous »

В моей игре (C ++ /raylib), когда я перемещаю игрока по диагонали, существует много дрожания для остальных элементов
, когда я перемещаю персонаж, который я «прокручивает». Уровень (добавляет смещение к математическому 2D -вектору), а затем уровень наносит все элементы, когда он содержит, что на спинном, так что он по -прежнему, он по центру, по центру, я подходит к сцене, он по -прежнему. Гладкий без дрожания, но при перемещении по диагонали он сильно дрожит, прокрутка обновляется перед рисунком, а не в то время как он не может быть слишком связан с тем, как применяется прокрутка, вектор, представляющий смещение прокрутки, состоит из 2 удвоений, которые представляют x и y < /p>
, представляющий смещение прокрутки, состоит из 2 удвоений, которые представляют x и y < /p>

Код: Выделить всё

//the move function
inline bool DynamicLevelObject::move(const dvec2 amt, bool should_scroll) {
//returns true if we moved at all
rect future = collision;
future.x += amt.x;
collision_hit hit;
moving = false;
if (amt.x != 0 && (hit = Level->colliding(future, &collision)).max_collider_status != collisionType::BLOCK_ALL) {
moving = true;
on_ground = hit.walkable;
collision.x += amt.x;
last_movement.x = amt.x;
} else {
moving = false;
future.x -= amt.x;
last_movement.x = 0;
}
future.y += amt.y;
if ((amt.y != 0) && (hit = Level->colliding(future, &collision)).max_collider_status != collisionType::BLOCK_ALL) {
moving = true;
on_ground = hit.walkable;
collision.y += amt.y;
last_movement.y = amt.y;
} else {
last_movement.y = 0;
}
move_dir = vtod(last_movement);

if (on_ground) {
last_valid_pos = collision.pos();
}

if (should_scroll) Level->focusScroll(collision.center());

return moving;
}

//in the level class
void draw(dvec2 offset) override {
for (const auto& obj: objects) {

obj->draw(scroll);

}
}

//the player draw function, most of the other object draw functions are very similar
//to this, I severely doubt it has anything to do with the animations

void draw(const dvec2 offset) override {
sprite::drawShadow({collision.center().x-offset.x-1, collision.y+collision.h-offset.y}, collision.w/2.5f, 0.8f*collision.h);
DrawAnimation(*current_animation, collision.pos()-offset-dvec2{5, 25});
}
Я пробовал округлить свиток, округлить позицию игроков, округлить все и в основном все, что связано с округлением, с различным успехом и многими дополнительными проблемами, которые связаны с округлением (например, массово медленное движение, злобное игрок, странное поведение движения и т. Д.)

Подробнее здесь: https://stackoverflow.com/questions/795 ... diagonally
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»