Анимация в pygame

Здравствуйте , господа программисты, подскажите пожалуйста как в pygame добавить анимацию игрока. Пробовал pyganim вместо анимации отображался только квадрат.

Так а в коде что?

import pygame
import pyganim
from pygame import *
import os
from os import path
from random import randint

# задаём цвета
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

game_folder = os.path.dirname(__file__)
img_dir = path.join(path.dirname(__file__), 'img')
img_folder = os.path.join(game_folder, 'img')
player_img = img = pygame.image.load(path.join(img_dir, 'player.png'))
background = pygame.image.load(path.join(img_dir, 'fon.png'))
background_rect = background.get_rect()
background2 = pygame.image.load(path.join(img_dir, 'sky.png'))
background_rect2 = background.get_rect()
anim_delay = 1
player_anim = [('1.png'),('2.png'),('3.png'),('4.png'),
               ('5.png'),('6.png'),('7.png'),('8.png'),
               ('9.png'),('10.png'),('11.png'),('12.png'),
               ('13.png'),('14.png'),('15.png'),('16.png'),('17.png'),]

WIDTH = 550  # ширина игрового окна
HEIGHT = 600  # высота игрового окна
FPS = 60  # частота кадров в секунду

pygame.init()  # запускаем pygame

pygame.mixer.init()  # запускаем звук
screen = pygame.display.set_mode((WIDTH, HEIGHT))  # открываем окно с заданными размерами
pygame.display.set_caption("flippy birds")  # задаём название окну
mob_position = randint(10, 440)

clock = pygame.time.Clock()

class PLayer(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = player_img
        self.rect = self.image.get_rect()
        self.size = self.image
        self.rect.centerx = 75
        self.rect.centery = HEIGHT / 2
        self.speedy = 0
        self.image.set_colorkey(BLACK)
        player_anim2 = []
        for anim in player_anim:
            player_anim2.append((anim, anim_delay))
        self.player_anim1 = pyganim.PygAnimation(player_anim2)
        self.player_anim1.play()

    def update(self):
        self.rect.centery += self.speedy
        if self.rect.top < 0:
            self.rect.top = 1
        if self.rect.bottom > 600:
            self.rect.bottom = 599

class mobup(pygame.sprite.Sprite):

    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((60, HEIGHT))
        self.image.fill(BLACK)
        self.rect = self.image.get_rect()
        self.rect.left = 550
        self.rect.bottom = mob_position
        self.speedx = -5

    def update(self):
        self.rect.left += self.speedx
        if self.rect.left < 0:
            self.rect.left = 550
            self.rect.bottom = mob_position
            self.speedx = -5

class mobdown(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((60, HEIGHT))
        self.image.fill(BLACK)
        self.rect = self.image.get_rect()
        self.rect.left = 550
        self.rect.top = mob_position + 160
        self.speedx = -5

    def update(self):
        self.rect.left += self.speedx
        if self.rect.left < 0:
            self.rect.left = 550
            self.rect.top = mob_position + 160
            self.speedx = -5

all_sprites = pygame.sprite.Group()  # создаём групу спиритов
player = PLayer()
all_sprites.add(player)
windows = pygame.sprite.Group()
mobs = pygame.sprite.Group()

m = mobup()
all_sprites.add(m)
mobs.add(m)

m2 = mobdown()
all_sprites.add(m2)
mobs.add(m2)

animCount = 0


def Window():
    global animCount
    screen.blit(background2, background_rect2)
    screen.blit(background, background_rect)
    all_sprites.draw(screen)  # нарисовать все спириты


running = True
while running:  # пока running=true происходит:
    # Держим цикл на правильной скорости
    clock.tick(FPS)  # держит FPS
    mob_position = randint(10, 440)

    for event in pygame.event.get():  # сохранение последних событий игры
        if event.type == pygame.QUIT:  # если тип события равен pygame.QUIT(закрвтие pygame) то:
            running = False  # running=false (окно закрывается)

        keys = pygame.key.get_pressed()

        if keys[pygame.K_SPACE]:
            player.speedy = -6
            player.image.fill(BLUE)
            player.player_anim1.blit(player.image, (0, 0))

        elif event.type == pygame.KEYUP:
            player.speedy = 4

        else:
            animCount = 0

    # Обновление
    all_sprites.update()  # положение спиритов обновляется

    hits = pygame.sprite.spritecollide(player, mobs, False)
    if hits:
        running = False

    # Рендеринг(отрисовка)
    Window()

    # После отрисовки всего, переворачиваем экран
    pygame.display.flip()

pygame.quit()  # выходим

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

А в консоль выводится что-нибудь? (ошибки, …)

По-моему тут что-то не то получится.

https://pyganim.readthedocs.io/en/latest/basics.html#quick-start

В списке должны быть (frame, delay), а не ((frame), delay).

Рисовать скорее всего надо всегда, а не только на том кадре, где нажали кнопку. Там скорее всего надо просто вызывать play, stop и т.п.

1 лайк

спасибо