Pygame не будет бить списки изображений - PullRequest
1 голос
/ 22 марта 2020

Я начал создавать простое окно в python с pygame, чтобы перебирать список изображений и перетаскивать их.

import pygame

pygame.init()

Window = pygame.display.set_mode((800, 600))
bg = pygame.image.load("/Users/luke.redwine/Documents/Python/PyGame/Examples/pygame lesson spaceinvaders/space.jpg")
clock = pygame.time.Clock()

animateNeutral = [pygame.image.load("/Users/luke.redwine/Documents/Python/PyGame/Space Shooter Game/Plasma T Neutral %s.png"% frame)for frame in range (1,3)] 
animateFiring = [pygame.image.load("/Users/luke.redwine/Documents/Python/PyGame/Space Shooter Game/plasma T fire %s.png"% frame)for frame in range (1,7)]

running = True
while running:
    events = pygame.event.get()
    keys = pygame.key.get_pressed()
    for event in events:             
        if event.type==pygame.QUIT or keys[pygame.K_ESCAPE]:
            pygame.quit()

    Window.blit(bg, (0,0))
    clock.tick(10)
    Window.blit(animateNeutral)
    Window.blit(animateFiring)
pygame.quit()

Я попытался быстро сделать так, чтобы я мог просто увидеть его одушевленным, но он вывел эту ошибку:

 Traceback (most recent call last):
  File "/Users/luke.redwine/Documents/Python/PyGame/Space Shooter Game/space rpg.py", line 22, in <module>
    Window.blit(animateNeutral)
TypeError: argument 1 must be pygame.Surface, not list

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Для функции blit требуется аргумент поверхности.

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

Вот некоторый непроверенный код, основанный на вашем образце:

import itertools
import pygame
pygame.init()

Window = pygame.display.set_mode((800, 600))
bg = pygame.image.load("/Users/luke.redwine/Documents/Python/PyGame/Examples/pygame lesson spaceinvaders/space.jpg")
clock = pygame.time.Clock()

animateNeutral = [pygame.image.load("/Users/luke.redwine/Documents/Python/PyGame/Space Shooter Game/Plasma T Neutral %s.png"% frame)for frame in range (1,3)] 
animateFiring = [pygame.image.load("/Users/luke.redwine/Documents/Python/PyGame/Space Shooter Game/plasma T fire %s.png"% frame)for frame in range (1,7)]

neutral_animations = itertools.cycle(animateNeutral)
firing_animations = itertools.cycle(animateFiring)

neutral_dest = (50, 50)
firing_dest = (200, 50)

running = True
while running:
    events = pygame.event.get()
    keys = pygame.key.get_pressed()
    for event in events:             
        if event.type==pygame.QUIT or keys[pygame.K_ESCAPE]:
            pygame.quit()

    Window.blit(bg, (0,0))
    clock.tick(10)
    Window.blit(next(neutral_animations), neutral_dest)
    Window.blit(next(firing_animations), firing_dest)
pygame.quit()

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

РЕДАКТИРОВАТЬ: добавить места назначения в соответствии с surface.blit ()

0 голосов
/ 23 марта 2020

https://www.pygame.org/docs/ref/surface.html?highlight=blit#pygame .Surface.blit

не забудьте проверить ссылку выше, для некоторой документации, однако может быть трудно найти ответы

Ответ Попробуйте использовать блиты, если вы пытаетесь блит в последовательностях

для

animateNeutral = [pygame.image.load("/Users/luke.redwine/Documents/Python/PyGame/Space Shooter Game/Plasma T Neutral %s.png"% frame)for frame in range (1,3)] 
animateFiring = [pygame.image.load("/Users/luke.redwine/Documents/Python/PyGame/Space Shooter Game/plasma T fire %s.png"% frame)for frame in range (1,7)]

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

...