Изменение происхождения анимации в Python и Pygame

#python #python-2.7 #animation #pygame

#python #python-2.7 #Анимация #pygame

Вопрос:

В настоящее время я работаю над 2D-платформером, и спрайты, которые у меня есть, анимируются из нижней левой точки анимации, и когда я рисую анимацию, используя точки x и y, она по-прежнему анимируется снизу слева, поэтому, когда я рисую анимацию на экране, спрайт должен становиться короче, но спрайтыноги просто отрываются от земли вот так https://www.dropbox.com/s/ofeggmlcp4f6qsk/Animation_probs_video.mp4 Я знаю, что видео не очень качественное, но что с того. Его голова должна подниматься и опускаться, а не ноги. Если вы, ребята, можете мне помочь, я был бы очень признателен. Я мог бы также использовать программу, которая исправляет, что у меня есть компьютер с Linux с виртуальным ящиком Windows xp, и я использую python 2.7 и pygame. Спасибо.

Комментарии:

1. Подумайте о геометрии — спрайт «сжимается», поэтому ноги поднимаются, вам нужно отрегулировать ось y вниз, чтобы ноги оставались на земле (y становится больше)

2. Я попробовал это, и это было слишком сложно

3. Спрайт будет перемещаться по всему экрану

4. Если бы вы могли привести мне пример, как это сделать, это было бы здорово @gkusner

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

Ответ №1:

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

Найдите высоту самого высокого спрайта только один раз:

   max_height = tallest_sprite.get_height()
 

Теперь, когда вы циклически просматриваете свои спринты, каждый кадр с current_sprite:

   screen.blit(current_sprite, (x, y (max_height - current_sprite.get_height())
 

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

Комментарии:

1. Большое спасибо, что сработало