Есть ли реальный способ избавиться от черного фона, отображаемого на изображении в PyGame? - PullRequest
0 голосов
/ 07 мая 2019

Я новичок в этом форуме (как кто-то задает вопросы на нем), и в настоящее время я работаю над игрой PyGame, которая требует, помимо прочего;обрабатывать прозрачность спрайта.Эта игра о космическом корабле, избегающем метеоров, и игрок может стрелять и уничтожать их.Также стоит отметить, что все движение в игре (кроме движения игрока) обрабатывается бесконечной вертикальной прокруткой.Я не создал эту игру, однако.Если кто-нибудь из вас отправится на поиски игры, известной как «Хит камень», созданной «Анкур Аггарвал»;вы точно увидите, о какой игре я говорю.

До сих пор я был в состоянии сделать все это, но в настоящее время я не могу избавиться от одной вещи: все спрайты, используемые для обоих«стреляющие» метеоры и спрайт игрока почему-то имеют черный фон.И хотя мне еще предстоит решить еще несколько проблем, этот черный фон спрайтов в настоящее время является одной из моих главных целей в этом проекте.

Я перепробовал все, что знаю по этому вопросу: от инициализации изображений спрайтовс convert_alpha (), чтобы установить цветовой ключ на черный с setColorKey ((0,0,0)), чтобы даже вернуться к использованию convert () вместо convert_alpha ().Я взял все эти инструменты из ответов на вопросы других людей здесь, на Stackoverflow, и ни один из них, похоже, не работает для меня.

Это то, что я использую для загрузки фонового изображения:


pygame.init()
screen=pygame.display.set_mode([640, 480],0,24)
pygame.display.set_caption("Hit The Stone")

fondo = pygame.image.load("imagenes/nebula_640x5052.jpg").convert()

background=pygame.Surface(screen.get_size())
background=background.convert()
screen.blit(background,(0,0))

BLACK = (0, 0, 0)

Этот «ЧЕРНЫЙ» кортеж предназначен для настройки цветовых клавиш, как я уже упоминал выше.

Это классы, которые я использую для генерации 2 слоев, которые я хочу добавить в игру, чтобы в игре была вертикальная прокрутка параллакса:


# This variable handles the speed
# at which every non-controllable background layer has to scroll.
velocidad_fondo = 1


# This class manages a layer of "background" asteroids I just want to
# vertically scroll all over the game window.
class StoneField(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("imagenes/asteroid_field_con_transparencia_640x1916.png")
        self.rect = self.image.get_rect()
        self.rect.bottom = 0
        self.rect.left = 0

        global velocidad_fondo
        self.speed = velocidad_fondo * 2

    def update(self):
        self.rect.bottom += self.speed

# This class represents the player, and of course,
# the sprite it displays to let the player see where is he moving to.
class Plane(pygame.sprite.Sprite):
    def __init__(self, image=None):
        pygame.sprite.Sprite.__init__(self, self.containers)
        self.image = image or Plane._default_image

        self.image.set_colorkey(BLACK)

        self.cooldown=15
        self.rect=self.image.get_rect()
        self.rect.centerx = screen.get_width() / 2
        self.distancefromcenter=30
        self.rect.centery=screen.get_height()-self.distancefromcenter-40
        self.dx=3
        self.dy=3

        # This line is one of those goals I won't reach
        # until I solve the sprite black background issue.
        # Long story short, it is meant to generate a sprite
        # representing the spaceship's motor, propelling it while it's moving.
        self.propulsor = Propulsor()

    def update(self):
        self.pressed = pygame.key.get_pressed()
        if self.pressed[K_DOWN]:
            self.rect.centery+=self.dy
            propulsores.remove(self.propulsor)

        elif self.pressed[K_UP]:
            self.rect.centery-=self.dy
            propulsores.add(self.propulsor)

        if self.pressed[K_LEFT]:
            self.rect.centerx-=self.dx
        elif self.pressed[K_RIGHT]:
            self.rect.centerx+=self.dx

        if self.rect.bottom>=screen.get_height():
            self.rect.bottom=screen.get_height()
        elif self.rect.top<=0:
            self.rect.top=0

        if self.rect.centerx>=screen.get_width()-self.distancefromcenter:
            self.rect.centerx=screen.get_width()-self.distancefromcenter
        elif self.rect.centerx<=self.distancefromcenter:
            self.rect.centerx=self.distancefromcenter

        self.cooldown = max(0, self.cooldown-1)


# The following class is used to spawn meteors
# at random locations and sizes, which the player has to destroy
# to avoid losing a life.
class Stone(pygame.sprite.Sprite):
    def __init__(self, image=None):
        pygame.sprite.Sprite.__init__(self, self.containers)
        self.image = image or Stone._default_image
        self.rect = self.image.get_rect()
        self.rect.centerx = random.randint(5,630)
        self.rect.centery = 0
        self.dy = random.randint(1, 3)
        self.font = pygame.font.Font(None, 20)

    def update(self):
        self.rect.centery+=self.dy
        if self.rect.bottom>=screen.get_height():
            self.rect.centerx=random.randint(5,630)
            self.rect.centery=0


# These lines are the ones I use to convert the images into usable sprites.
Plane._default_image = pygame.image.load('plane.png').convert_alpha()
Bullet._default_image = pygame.image.load('geometrybullet.png').convert()
Stone._default_image = pygame.image.load('stone.gif').convert()



И, наконец, следующий цикл находится внутри моего основного игрового цикла.«камни», «маркеры» - это группы спрайтов PyGame, которые я использую для управления обнаружением столкновений между метеорами, и пули, которые стреляет пользователь:

for stone in stones:
      for bullet in bullets:
             if bullet.rect.colliderect(stone):
                    sonido_destruir_meteorito.play()
                    bullet.kill()

                    stone.cambiar_sprite_por_500_puntos()

                    #stone.kill()
                    stones.remove(stone)

                    SCORE += 500
                    if SCORE == 2000:
                        VIDAS += 1

                        allSprites.add(mensaje_1up)
                        clockMensajeVidaExtra.tick(2000)
                        #allSprites.remove(mensaje_1up)

            if stone.rect.colliderect(plane):
                VIDAS -= 1
                pygame.mixer.music.play()

                stone.kill()

                if VIDAS == 0:
                    exit()
                    plane.kill()

        stone_spawn_cooldown -= 1
        if len(stones) < max_stones and stone_spawn_cooldown <= 0:
            stones.add(Stone())
            #Stone()

            stone_spawn_cooldown = stone_spawn_delay

        allSprites.clear(screen, background)
        allSprites.update()
        allSprites.draw(screen)

        pygame.display.flip()
        clock.tick(60)
        y += velocidad_fondo


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

Итак;это моя проблема.Есть ли другой способ исправить это?Или я что-то не так делаю?С, прокручивающей частью, может быть?

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

...