Как приблизиться к 360 градусам змеи

8

Я недавно вошел в XNA и должен сказать, что мне это нравится. Как своего рода игра «Привет, мир», я решил создать классическую игру «Змейка». 90-градусная версия была очень простой и легкой в ​​реализации. Но когда я пытаюсь сделать его версию, которая позволяет вращаться на 360 градусов, используя стрелки влево и вправо, я столкнулся с некоторой проблемой.

То, что я делаю сейчас, проистекает из 90-градусной версии: перебирая каждую часть тела змеи, начиная с хвоста и заканчивая прямо перед головой. Это прекрасно работает при движении каждые 100 миллисекунд. Проблема заключается в том, что это создает нестабильный стиль игры, так как технически игра развивает скорость всего 6 кадров в секунду, а не потенциальные 60.

Я хотел бы перемещать змею каждый игровой цикл. Но, к сожалению, поскольку змея движется со скоростью головы, она идет слишком быстро. Это будет означать, что голова должна двигаться с гораздо меньшим шагом, таким как (2, 2), в направлении, а не то, что у меня сейчас (32, 32). Поскольку я несколько недель работал над этой игрой, руководя школой, я думаю, что слишком много думал о том, как этого добиться. Это, вероятно, простое решение, я просто не догоняю его.

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

for(int i = SnakeLength - 1; i > 0; i--){
    current = SnakePart[i], next = SnakePart[i - 1];

    current.x = next.x - (current.width * cos(next.angle));
    current.y = next.y - (current.height * sin(next.angle));

    current.angle = next.angle;
} 

SnakeHead.x += cos(SnakeAngle) * SnakeSpeed;
SnakeHead.y += sin(SnakeAngle) * SnakeSpeed;

Это производит что-то вроде этого: Код в действии . Как видите, каждая часть всегда остается за головой и не создает эффекта «следа».

Прекрасный пример того, чего я добиваюсь, можно найти здесь: Data Worm . Не вращение области просмотра, но эффект следа треугольников.

Спасибо за любую помощь!

Остин Брунхорст
источник

Ответы:

5

С помощью этого алгоритма вы устанавливаете каждый сегмент под тем же углом, что и перед ним. Вот почему они все попадают прямо за голову, в конечном итоге все они смотрят под одним углом. Как вы можете видеть в игре Data Worm, которую вы связали, каждый сегмент просто направлен к сегменту перед ним . Определите угол от текущего сегмента до его nextи укажите точку сегмента таким образом, вместо того, чтобы устанавливать его на next.angle.

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

В прошлом я использовал похожую идею для прототипа проекта ( ссылка на Unity WebPlayer ). Я использовал аналогичный (хотя и 3D) код, чтобы заставить каждый сегмент поворачиваться к сегменту перед ним и оставаться на заданном расстоянии. Работал как шарм.

chaosTechnician
источник
Замечательно! Я читал блог, который использует концепцию, похожую на эту, но не думал об итерациях от начала до конца. Я сделаю попытку и отмечу это как ответ, если это будет успешно.
Остин Брунхорст
Обновление: все заработало! Потребовалось некоторое время, чтобы понять концепцию и понять, что на самом деле происходит. Еще раз спасибо за руководство меня в правильном направлении! Вот видео с рабочим кодом :) screenr.com/Fhn8 . Не берите в голову столкновение с едой, не потратили на это много времени.
Остин Брунхорст
1
Рад, что смог помочь!
ChaosTechnician
Ваша ссылка мертва.
Джефф
1
@Jeff Очевидно, Dropbox решил, что я каким-то образом привлекаю слишком много трафика, что странно ...
chaosTechnician