Пигмея:Теория анимации спрайтов - Нужна обратная связь

StackOverflow https://stackoverflow.com/questions/737303

  •  09-09-2019
  •  | 
  •  

Вопрос

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

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

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

Например:"Беги налево" - это спрайт 3.Итак, после того, как мы обозначим этот столбец, можно ли будет зациклить сколько угодно кадров анимации запуска (скажем, 4), чтобы создать анимацию?

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

Это было полезно?

Решение

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

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

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
    )

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top