Правильно ли я понимаю идею скролинга игрового мира?

Пусть у нас есть изначально квадрат (окно игры). Есть герой позиция по координате x которого равна половина ширины окна игры. То есть герой постоянно стоит посередине, не двигаясь. Нажимая кнопки вправо или влево, тем самым мы даем смещение по координате х нашей игре. Соответсвенно после этого все остальные объекты мы смещаем следующим образом : someObj.x -= offsetX; (offsetX может быть как отрицательным, так и положительным).
Правильно ли я рассуждаю? Есть ли пример кода, где это все правильно делается?
  • Вопрос задан
  • 1234 просмотра
Решения вопроса 3
@Mercury13
Программист на «си с крестами» и не только
1. Проще изменять координаты объекту Camera или Viewport. И уже на ходу, при рендеринге, вычислять someObject.x - viewport.x.
Ведь отображение объектов — малая часть игровой логики: объектам надо жить своей жизнью, взаимодействовать друг с другом и героем, заранее отсекаться, если они далеко от камеры.
А если — вдруг — будут несколько окошек, например, для игры вдвоём, можно сделать несколько viewport’ов.

2. Это лишь простейший алгоритм скроллинга (т.н. «привязанная камера»):
viewport.x = clamp(player.x - viewport.width / 2, 0, world.width - viewport.width);

clamp(x, y, z) = max(min(x, z), y); при y>z можно (но не обязательно) наладить своё хитрое поведение, взяв, например, (y+z) / 2.
Если игра динамичная, а окно обзора невелико, можно усложнить поведение камеры.
У меня есть на этот счёт прекрасный перевод.
https://habrahabr.ru/post/272933/
https://habrahabr.ru/post/273397/

P.S. Платформеры писал профессионально, правда, не на холсте HTML 5, а на Java ME.
Ответ написан
lazalu68
@lazalu68
Salmon
На вопрос я ответить не смогу, но вот вам выдержка из книжки O'Reilly HTML5 Canvas, в которой очень детализированно и со всеми объяснениями повествуется о том, как можно создать простенькую игру на Canvas. Пример игры там не идеальный, но там тоже есть статичные элементы относительно которых движется все полотно. Тут лежит архив с кодом.
Ответ написан
abyrkov
@abyrkov
JavaScripter
Mercury13 дал вам дельный совет - используйте viewport, потом легче будет "отцепить" экран от персонажа.

Что касается формулировки... для мелкой игры она сойдет. Для крупной - нет. Почему? Да потому, что если у вас 10 объектов, то нужно пройтись в цикле 10 раз. Пусть даже у вас будет 1 мс на каждый проход, все вместе займет 10-15 мс, т.е. где-то уровень стандартных фпс. Не критично, конечно, но что если у вас 100, а то и 1000 объектов?
Поэтому чаще делают viewport + изменение позиции персонажа. А потом по viewport'у(экран) смотрите, что рендерить, а что - нет
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы