Я новичок в этом форуме (как кто-то задает вопросы на нем), и в настоящее время я работаю над игрой 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просто я не привык задавать вопросы на этом форуме, поэтому я, скорее всего, облажусь, когда поделюсь своим кодом.
Итак;это моя проблема.Есть ли другой способ исправить это?Или я что-то не так делаю?С, прокручивающей частью, может быть?
Если я случайно ошибусь в этом посте, не стесняйтесь, сообщите мне, и я исправлю это как можно скорее.