Плавное движение сетки - PullRequest
0 голосов
/ 14 апреля 2009

Я работаю над клоном Java Bomberman, использую систему сетки, и сейчас я не очень доволен движением. Когда игрок нажимает клавишу движения, персонаж начинает двигаться (со скоростью 0,25). Игрок теряет контроль, и персонаж продолжает двигаться, пока не переместит полную плитку. Игрок восстанавливает контроль, только когда персонаж попадает в центр следующей плитки.

Это делает его слишком "медленным". Если я хочу изменить направление сейчас , я не могу.

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

Спасибо!

Ответы [ 5 ]

1 голос
/ 18 апреля 2009

Не отключать пользовательский ввод. Когда-либо. Постоянно опрашиваю.

Имеют функцию Tick () или OnFrameEnter (), которая выполняет следующие действия:

Опрашивать клавиатуру / джойстик / что угодно и кэшировать последнее направление, введенное пользователем.

Проверьте положение персонажа.

Если персонаж бездействует в центре квадрата сетки, установите его скорость в правильном направлении и увеличьте скорость движения на один шаг, если на пути нет объекта стены / столкновения. Также очистите последнее нажатие клавиши до некоторого недопустимого значения.

В противном случае, если персонаж уже движется, обновите положение персонажа, проверив наличие столкновения со стеной или близость к изменяющему направление узлу (пересечение). Если он сталкивается со стеной, остановите персонажа. Если он находится близко к узлу, меняющему направление, и может двигаться в направлении кэширования, измените направление и очистите направление кэширования. В противном случае, если направление ввода противоположно текущему направлению (оно находится в коридоре, и игрок хочет повернуть вспять), измените направление и затем нажмите клавишу. Все это предполагает, что персонаж должен продолжать двигаться, всегда, пока не достигнет стены и не остановится. Если вы хотите, чтобы персонаж остановился где-либо, клавиша обратного направления должна просто остановить его на месте.

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

1 голос
/ 14 апреля 2009

Я только что играл Bomberman несколько минут назад :) Вы можете двигаться довольно плавно, там нет сетки расчетов. Я не так много использовал Java. Я часто использую Flash. Сетка для проверки столкновений? Для чего именно?

Имеет ли смысл иметь что-то вроде (попробую набросать):

float vx,vy = 0;//velocity on x and y 
Character bomberman

void keyDownHandler(KeyboardEventSomething event){
 if(key is Left && ! Right ) vx -= .5;
else if(key is Right && !Left ) vx += .5;
//idem for Y axis
}

void keyUpHandler(KeyboardEventSomething event){
vx = vy = 0;
}

void updateLoop(){
  bomberman.x += vx;
  bomberman.y += vy;
}

Я могу быть немного не в себе, потому что я не уверен, насколько ты хочешь клонировать Бомбермана или нет. То, что вы описываете с помощью движения сетки, кажется ближе к hopmon

0 голосов
/ 09 сентября 2009

Звучит так, как будто вы обновляете положение игроков (начало анимации), изменяя ячейку сетки, в которой она содержится.

Чтобы достичь желаемого эффекта, позиция рендера спрайтов должна быть независимой от того, где на сетке находится объект, представленный этим спрайтом. И позволить пользователю перемещаться внутри этой сетки в пределах диапазона центра ячейки, не меняя ячейки. Если этот диапазон выбран неправильно, вы можете столкнуться с проблемой «doh! Im в этой (визуально) ячейке», но она говорит о проблеме «im в будущей ячейке» или «мой аватар перекрывает стену».

Не меняйте ячейку игрока, пока он не окажется в пределах диапазона (скажем, 1/3 от ограничивающей сферы спрайта) от границ / границ ячейки, в которой он находится. Вам также придется изменить процесс анимации, чтобы он был прерываемым.

Это не зависит от степени свободы, которую вы предоставляете игроку (например, он может двигаться только вверх, вниз, влево, вправо и по диагонали против 360 градусов)

Еще одна вещь, на которую следует обратить внимание, если спрайт больше размера ячейки. Например, Толстый монстр или Змеиный босс, который охватывает X-клетки, но не обязательно в прямоугольной форме.

0 голосов
/ 14 апреля 2009

Я думаю, это зависит от того, как вы хотите, чтобы он вел себя.

Скажем, вы движетесь вверх и нажимаете вправо ... Вы хотите, чтобы он прекратил движение вверх и пошел направо? Я бы сохранил предыдущее местоположение сетки, когда вы делаете движение. таким образом, если вы щелкнете, чтобы переместиться в другое место, вы можете прыгнуть назад и изменить направление движения.

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

Трудно ответить, не зная, как вы хотите, чтобы он вел себя.

0 голосов
/ 14 апреля 2009

Вы должны быть в состоянии избавиться от текущего спрайта и загрузить новый именно тогда, когда вам это нужно - то есть, если персонаж переместился на полпути к следующей плитке, и игрок нажимает клавишу для возврата, отмените спрайт и загрузите новый, начиная с 0,5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...