Не работает set_colorkey

здравствуйте господа программисты. я добавил в свою игру анимацию, но при её работе появляется, но не игнорируется красный цвет.
вот такая картина(так до окнца игры):


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

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

# задаём цвета
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('1.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'),('7.png'),('8.png')]
player_anim2 = [('1.png'),('1.png'),('4.png'),('4.png'),('1.png'),('1.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 = pygame.Surface((40,40))
        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)
        boltAnim = []
        for anim in player_anim:
            boltAnim.append((anim, 60))
        self.boltAnimRight = pyganim.PygAnimation(boltAnim)
        self.boltAnimRight.play()

        for anim in player_anim2:
            boltAnim.append((anim, 60))
        self.boltAnim2 = pyganim.PygAnimation(boltAnim)
        self.boltAnim2.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
        if self.speedy == -6:
            self.image.fill(RED)
            self.image.set_colorkey(RED)
            self.boltAnimRight.blit(self.image, (0, 0))
        elif self.speedy != -6:
            self.image = player_img

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

class window(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((0.1,160))
        self.image.set_colorkey(BLACK)
        self.rect = self.image.get_rect()
        self.rect.left = 550
        self.rect.top = mob_position
        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
            self.speedx = -5

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



w = window()
all_sprites.add(w)
windows.add(w)
m = mobup()
all_sprites.add(m)
mobs.add(m)
m2 = mobdown()
all_sprites.add(m2)
mobs.add(m2)
new()


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

font_name = pygame.font.match_font('arial')
def draw_text(surf, text, size):
    font = pygame.font.Font(font_name, size)
    text_surface = font.render(text, True, RED)
    text_rect = text_surface.get_rect()
    text_rect.centery = 20
    text_rect.centerx = WIDTH/2
    surf.blit(text_surface, text_rect)

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 (окно закрывается)

        if event.type == pygame.KEYDOWN:
            if event.key == K_SPACE:
                player.speedy = -6
                player.image.fill(BLACK)
                player.boltAnim2.blit(player.image, (0, 0))

        elif event.type == pygame.KEYUP:
            player.speedy = 4
            player.image = player_img
            player.image.set_colorkey(BLACK)


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

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

    #hit = pygame.sprite.spritecollide(player, windows, False)
    #if hit:
        #score += randint(0.1,2 )

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

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

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

А зачем менять colorkey и цвет фона в разных местах? Он ж по идее все равно не должен отображаться.
Наверно с этим где-то и запутались.

Лучше ж всегда использовать какой-то один цвет для этого. И наверно лучше более редкий, чем красный и черный.

вот я изменил чтобы цвет всегда был одинаковым. ничего не изменилось.

class PLayer(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((30,30))
        self.rect = self.image.get_rect()
        self.size = self.image
        self.rect.centerx = 75
        self.rect.centery = HEIGHT / 2
        self.speedy = 0

        boltAnim = []
        for anim in player_anim:
            boltAnim.append((anim, 60))
        self.boltAnimRight = pyganim.PygAnimation(boltAnim)
        self.boltAnimRight.play()

        for anim in player_anim2:
            boltAnim.append((anim, 60))
        self.boltAnim2 = pyganim.PygAnimation(boltAnim)
        self.boltAnim2.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
        if self.speedy == -6:
            self.image.fill(BLACK) # если убрать этот пункт то получится это (рисунок внизу)
            self.image.set_colorkey(BLACK)
            self.boltAnimRight.blit(self.image, (0, 0))
        elif self.speedy != -6:
            self.image = player_img

Снимок экрана (10)

А что на этом скриншоте не так?

Еще это

по-моему не будет работать так, как задумано (+ непонятно зачем это делать в двух местах).

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

Но наверно проще вместо этого всего использовать play/stop из pyganim.

проблема на фото в том что предыдущий кадр остаётся и фото дублируется по многу раз

Это скорее всего потому что надо либо весь фон перерисовывать, либо смотреть тут https://www.pygame.org/docs/tut/newbieguide.html Dirty rect animation.

А, или это вроде и делает первое

Только там комментарий странный над этой строкой, куда переворачиваем, на бок что ли?)) И выше согласно комментариям какие-то духи создаются, а не спрайты :clkolvampire:


Тут что-то очень странное происходит, window зачем-то создается два раза. Надо либо убрать функцию new, либо переместить всё в нее убрав первые 3 строки.

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

        if self.speedy == -6:
            self.image.fill((250,78,88))
            self.image.set_colorkey((250,78,88))
            self.boltAnimRight.blit(self.image, (0, 0))

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

спасибо большое что помогаете.

Странно, по идее не должно ничего из старого оставаться если весь экран перерисовывается.

Вообще судя по оф. примеру pyganim fill/colorkey не нужны если картинки прозрачные: https://github.com/asweigart/pyganim/blob/master/examples/walking_demo.py

вот решил добавить фон изображению, но теперь set_colorkey не убирает фон у кадров анимации.

class PLayer(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((20,30 ))
        self.image.set_colorkey(BLACK)
        self.rect = self.image.get_rect()
        self.rect.centerx = 75
        self.rect.centery = HEIGHT / 2
        self.speedy = 0
        self.lives = 3
        self.hidden = False
        self.hide_timer = pygame.time.get_ticks()
        boltAnim = []
        for anim in player_anim:
            boltAnim.append((anim, 60))
        self.boltAnimRight = pyganim.PygAnimation(boltAnim)
        self.boltAnimRight.set_colorkey(WHITE)
        self.boltAnimRight.play()
        boltAnim3 = []
        for anim in player_anim2:
            boltAnim3.append((anim, 60))
        self.boltAnim2 = pyganim.PygAnimation(boltAnim3)
        self.boltAnim2.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

        if self.speedy == -6:
            self.image.set_colorkey(WHITE)#здесь я ставил место image boltAnimRight но всё равно не помогало.
            self.boltAnimRight.blit(self.image, (0, 0))

        elif self.speedy != -6:
            self.image.set_colorkey(WHITE)
            self.image = player_img

Так а на картинках что? Может проще сделать их прозрачными и убрать все эти colorkey как в примерах pyganim?