Pygame: теория спрайтовской анимации - нужна обратная связь - PullRequest
3 голосов
/ 10 апреля 2009

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

Код перемещения персонажа + IMG

Лист Sprite работает только в продольном направлении, поэтому в основном каждый раздел спрайта - это отдельное действие. Теперь можно было бы сделать так, чтобы я мог сделать код, который будет функционировать с текущим, чтобы циклически переходить от набора 'action' для создания анимации?

Например: «Run Left» - это спрайт 3. Итак, после того, как мы определили этот столбец, можно было бы зациклить сколько кадров анимации выполнения (скажем, 4) для создания анимации?

Пример изображения: alt text http://animania1.ca/ShowFriends/dev/example.jpg

1 Ответ

4 голосов
/ 10 апреля 2009

Это должно быть легко.

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

frame_count = 0
animation_frames = 4
while quit == False:
    # ...
    # snip
    # ...
    area = pygame.Rect(
        image_number * 100,
        (frame_count % animation_frames) * 150,
        100,
        150
    )
    display.blit(sprite, sprite_pos, area)
    pygame.display.flip()
    frame_count += 1

Если разные действия имеют разное количество кадров, вам придется обновлять animation_frames при обновлении image_number.

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

    area = pygame.Rect(
        image_number * 100,
        ((frame_count - action_start_frame) % animation_frames) * 150,
        100,
        150
    )

Примечание о вашей обработке событий. Если вы удерживаете, скажем, влево и нажимаете вправо, но продолжаете удерживать влево, спрайт перестает двигаться, потому что последнее обработанное вами событие было событием keyup, несмотря на то, что я все еще удерживаю влево.

Если это не то, что вам нужно, вы можете обойти это, ведя запись состояний вверх / вниз интересующих вас клавиш или используя pygame.key.get_pressed интерфейс.

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

2D-экшн игры обычно должны работать предсказуемо. Если на вашем компьютере в фоновом режиме запускается некоторый процесс, который приводит к тому, что ваша игра перестает работать со скоростью 60 кадров в секунду, вероятно, предпочтительнее замедлять ее, а не заставлять ваши объекты пропускать огромные расстояния между кадрами. Представляете, если бы это произошло в 2D-игре, такой как Metal Slug, где вам нужно прыгать, избегая пуль?

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

...