Pacman Array — плавное движение

См. Некоторые проблемы с созданием Pacman, чтобы полностью понять этот вопрос. Просто посмотрите на первую часть принятого ответа. И это в джаве!

Я использую массив, как показано в ссылке выше. У меня есть мой персонаж pacman, который перемещается нормально, кроме того факта, что он перемещается на 21 пиксель каждые 100 мс, поэтому он совсем не плавный.

В настоящее время я просто умножаю x и y текущей позиции массива на 21. Мне интересно, как я могу сделать это гладко. Я пробовал несколько способов передвижения, но они не сработали, я не очень опытен и мои способы неэффективны, поэтому я пришел сюда в поисках хорошего способа плавного передвижения.

Некоторые вещи, которые вам, возможно, нужно знать: Pacman сначала проверяет точку в направлении нажатия клавиши. (пример: стрелка вправо вниз. Ясно?) Если ясно, он продолжит вызывать другой класс, который обрабатывает перемещение pacman до тех пор, пока не появится стена. или враг.


person ComputerLocus    schedule 27.11.2011    source источник


Ответы (2)


Вам нужно создать две петли. Игровой цикл, который отрабатывает логику игры и запускается каждые 100 мс, и цикл анимации, который запускается чаще, может быть, каждые 20 мс, и вычисляет, где должны быть все спрайты.

// in pseudo code
sleep 20 ms
if i++ % 5 == 0
    do game loop
do animation loop with i
// passing i to animation loop will allow you to easily calculate how far sprite is along path to destination
person Billy Moon    schedule 27.11.2011
comment
Хорошо, я попробую это. Но как бы я сделал движение pacman? Потому что он умножает массив прямо сейчас, чтобы просто ускорить движение. - person ComputerLocus; 27.11.2011
comment
может что-то вроде: (array_from - array_to) / 5 * i - person Billy Moon; 27.11.2011
comment
Я учусь только в первом семестре Java в старшей школе, поэтому я этого не понимаю. - person ComputerLocus; 27.11.2011
comment
Хорошо, в основном я имею в виду получение общего расстояния перемещения, которое вы можете рассчитать, вычитая начальную точку из конечной точки и получая абсолютное значение (убедившись, что оно положительное). Когда у вас есть это расстояние (расстояние, которое вы хотите переместить), вы можете разбить его на несколько шагов, разделив на любое количество шагов, которое вы хотите - здесь я использовал 5. Затем в цикле анимации вы знаете значение i (какой шаг вы включены), поэтому вы умножаете это, чтобы получить окончательное значение того, как далеко вы должны быть перемещены в любой момент времени. Это значение можно добавить к начальному значению, чтобы получить координату. - person Billy Moon; 27.11.2011

Человеческий глаз может видеть примерно один кадр каждые 100 мс, а некоторые люди могут видеть быстрее. Вы можете увеличить частоту кадров как минимум до 20 кадров в секунду (что эквивалентно одному кадру каждые 50 мс). Если вы хотите, чтобы Pac-Man двигался с той же скоростью, вы можете уменьшить вдвое расстояние и удвоить скорость (заставить его двигаться на 10 или 11 пикселей каждые 50 мс).

См. статью Википедии о частоте кадров, чтобы получить дополнительную базовую информацию и узнать, что другие успешно используют. .

person Jon Newmuis    schedule 27.11.2011
comment
Да, было бы неплохо сделать это, но я не знаю, как это сделать... при использовании такого массива. - person ComputerLocus; 27.11.2011
comment
Это должно быть совершенно не связано с тем, как хранится лабиринт или как выполняется движение. Скорее, это относится к коду, обновляющему пользовательский интерфейс. - person Jon Newmuis; 27.11.2011
comment
Даже средний человек заметит значительные изменения при скорости 10 кадров в секунду (если только это не очень небольшое изменение)! Я бы нацелился на ~30 кадров в секунду, и для такой игры, как Pacman, это вполне разумно! Поскольку разрешение таймера и скорость выполнения ЦП/JVM различаются, при выполнении анимации необходимо учитывать дельту времени, иначе то, что нормально для одного, будет слишком медленным или слишком быстро на другом. - person ; 27.11.2011