Ciao a tutti, sono un principiante in Python e sto seguendo un corso online per imparare ad utilizzare Python e Pygame.
Come ultima lezione è stato realizzato un semplice giochino per sparare agli alieni con un'astronave, e venivano richieste alcune modifiche da effettuare per migliorarlo e per esercitarsi con quanto appreso: tutto ok all'inizio, ma all'ultima richiesta, implementare le vite dell'astronave... un disastro! E siccome il corso è testuale e il docente irreperibile, non ho la più pallida idea di come capire dove ho sbagliato!
Le ho tentate tutte, ma o il gioco continua all'infinito, o non va oltre la prima vita, o si incanta per ragioni ignote; allo stesso tempo, non riesco a caricare con la blit() le immagini del numero di vite sulla Surface apposita. Sarò grato a chiunque riesca a spiegarmi quale cavolo di errore ho commesso e come rimediare.
Non so per quale motivo, ma il mio computer non mi sta consentendo di caricare il file del programma in allegato, quindi stampo qui sotto il codice:
import pygame, random
from pygame.locals import *
from os.path import join
import animimage
# --- Definizione di funzioni
def vertical_scroll(surf, dy):
rect1 = pygame.Rect(0, 0, surf.get_width(), surf.get_height() - dy)
rect2 = pygame.Rect(0, surf.get_height() - dy, surf.get_width(), dy)
surf_temp = surf.copy()
surf.blit(surf_temp, (0, 0), rect2)
surf.blit(surf_temp, (0, dy), rect1)
# --- Inizializzazione
pygame.init()
screen = pygame.display.set_mode()
pygame.display.set_caption("Aliens")
clk = pygame.time.Clock()
# --- Risorse grafiche
surf_back = pygame.image.load(join("Backgrounds", "Space.png")).convert()
surf_ship = pygame.image.load(join("Sprites", "SpaceArt", "player.png")).convert_alpha()
surf_ship_left = pygame.image.load(join("Sprites", "SpaceArt", "playerLeft.png")).convert_alpha()
surf_ship_right = pygame.image.load(join("Sprites", "SpaceArt", "playerRight.png")).convert_alpha()
surf_alien = []
for i in range(1, 4):
filename = join("Sprites", "SpaceArt", "enemyShip{}.png".format(i))
img = pygame.image.load(filename).convert_alpha()
surf_alien.append(img)
surf_alien1 = pygame.image.load(join("Sprites", "SpaceArt", "enemyShip1.png")).convert_alpha()
surf_alien2 = pygame.image.load(join("Sprites", "SpaceArt", "enemyShip2.png")).convert_alpha()
surf_alien3 = pygame.image.load(join("Sprites", "SpaceArt", "enemyShip3.png")).convert_alpha()
surf_bullet = pygame.image.load(join("Sprites", "SpaceArt", "laserGreen.png")).convert_alpha()
surf_title = pygame.image.load(join("Sprites", "Aliens_text.png")).convert_alpha()
surf_play = pygame.Surface(surf_back.get_size())
surf_info = pygame.Surface((250, surf_play.get_height()))
fnt = pygame.font.SysFont("Arial", 48)
anim_expl = []
for i in range(32):
filename = join("Sprites", "Animations", "expl_06_{:0>4}.png".format(i))
img = pygame.image.load(filename).convert_alpha()
anim_expl.append(pygame.transform.scale2x(img))
anim_big_expl = []
for i in range(32):
filename = join("Sprites", "Animations", "expl_10_{:0>4}.png".format(i))
img = pygame.image.load(filename).convert_alpha()
anim_big_expl.append(pygame.transform.rotozoom(img, 0, 4.0))
game_over = pygame.image.load(join("Sprites", "gameover3.gif")).convert()
game_over.set_colorkey(game_over.get_at((0, 0)))
game_over_rect = game_over.get_rect()
game_over_rect.center = screen.get_rect().center
life = pygame.image.load(join("Sprites", "SpaceArt", "life.png")).convert_alpha()
life_rect = life.get_rect()
# --- Risorse sonore
sound_laser = pygame.mixer.Sound(join("Effects", "smc-wwvi", "synthetic_laser.ogg"))
sound_expl = pygame.mixer.Sound(join("Effects", "smc-wwvi", "synthetic_gunshot_2.ogg"))
sound_end = pygame.mixer.Sound(join("Effects", "smc-wwvi", "big_explosion.ogg"))
pygame.mixer.music.load(join("Music", "SoundImage", "Techno-Gameplay_Looping.ogg"))
sound_laser.set_volume(0.5)
sound_expl.set_volume(0.5)
sound_end.set_volume(0.5)
# Costanti
TIMERSHOT = pygame.event.custom_type()
BACKCOLOR = (10, 160, 10)
TEXTCOLOR = (255, 255, 40)
SHIP_TOPLEFT = (320, 500)
PLAY_TOPLEFT = (20, 40 + surf_title.get_height())
INFO_TOPLEFT = (40 + surf_play.get_width(), 40 + surf_title.get_height())
# --- Altre variabili
pressed = None
all_sprites = pygame.sprite.Group()
bullets = pygame.sprite.Group()
aliens = pygame.sprite.Group()
spr_ship = pygame.sprite.Sprite(all_sprites)
spr_ship.image = surf_ship
spr_ship.rect = spr_ship.image.get_rect()
spr_ship.rect.topleft = SHIP_TOPLEFT
score = 0
animations = pygame.sprite.Group()
# QUESTO E' L'INIZIO DEL CICLO DELLE VITE:
lifecount = 3
while lifecount > 0:
# --- Inizio del gioco
pygame.mixer.music.play(-1)
pygame.time.set_timer(TIMERSHOT, random.randrange(400, 1501))
screen.fill(BACKCOLOR)
rect_title = surf_title.get_rect()
rect_title.midtop = (surf_play.get_width() // 2 + 20, 20)
screen.blit(surf_title, rect_title)
# --- Ciclo principale
done = False
while not done:
# --- Ciclo degli eventi
for ev in pygame.event.get():
if ev.type == pygame.QUIT:
pygame.quit()
elif ev.type == KEYDOWN and ev.key in (K_n, K_m):
pressed = ev.key
elif ev.type == KEYUP and ev.key == pressed:
pressed = None
spr_ship.image = surf_ship
elif ev.type == KEYDOWN and ev.key == K_SPACE and len(bullets) < 8:
bullet = pygame.sprite.Sprite(all_sprites, bullets)
bullet.image = surf_bullet
bullet.rect = surf_bullet.get_rect()
bullet.rect.midbottom = spr_ship.rect.midtop
sound_laser.play()
elif ev.type == TIMERSHOT:
pygame.time.set_timer(TIMERSHOT, random.randrange(400, 1501))
alien = pygame.sprite.Sprite(all_sprites, aliens)
alien.image = surf_alien[random.randrange(len(surf_alien))]
alien.rect = alien.image.get_rect()
alien.rect.bottomleft = (random.randrange(0, surf_play.get_width() - alien.rect.width + 1), -1)
# --- Logica del gioco
if pressed == K_n and spr_ship.rect.left > 0:
spr_ship.rect.x -= 5
spr_ship.image = surf_ship_left
elif pressed == K_m and spr_ship.rect.right < surf_play.get_width():
spr_ship.rect.x += 5
spr_ship.image = surf_ship_right
for bullet in bullets:
bullet.rect.y -= 4
if bullet.rect.bottom < 0:
bullet.kill()
for alien in aliens:
alien.rect.y += (surf_alien.index(alien.image) + 1)
if alien.rect.top > surf_play.get_height():
sound_end.play()
expl = animimage.AnimSprite(animations, all_sprites)
expl.set_images(anim_big_expl)
expl.rect.center = alien.rect.midtop
expl.set_rate(3.5)
done = True
collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
for i in collisions.keys():
for alien in collisions:
score += 10
sound_expl.play()
expl = animimage.AnimSprite(animations, all_sprites)
expl.set_images(anim_expl)
expl.rect.center = alien.rect.midbottom
expl.set_rate(3.5)
if pygame.sprite.spritecollide(spr_ship, aliens, True):
sound_end.play()
spr_ship.kill()
expl = animimage.AnimSprite(animations, all_sprites)
expl.set_images(anim_big_expl)
expl.rect.center = spr_ship.rect.midtop
expl.set_rate(3.5)
done = True
# --- Aggiornamento dello schermo
animations.update()
vertical_scroll(surf_back, 1)
surf_play.blit(surf_back, (0, 0))
all_sprites.draw(surf_play)
screen.blit(surf_play, PLAY_TOPLEFT)
surf_info.fill(BACKCOLOR)
surf_info.blit(fnt.render("Score: " + str(score), True, TEXTCOLOR), (0, 0))
for y in range(lifecount):
surf_info.blit(life, (y * life_rect.x, 200))
screen.blit(surf_info, INFO_TOPLEFT)
pygame.display.flip()
clk.tick(30)
# DECREMENTO DEL CONTATORE DELLE VITE:
lifecount -= 1
# --- Uscita
pygame.mixer.music.stop()
while pygame.mixer.get_busy():
animations.update()
surf_play.blit(surf_back, (0, 0))
all_sprites.draw(surf_play)
screen.blit(surf_info, INFO_TOPLEFT)
pygame.display.flip()
clk.tick(30)
pygame.mixer.music.load(join("Music", "Avgvsts_midi", "Darkness Approaches.mid"))
pygame.mixer.music.play(-1)
screen.fill(BACKCOLOR)
screen.blit(game_over, game_over_rect)
pygame.display.flip()
pygame.time.wait(4000)
pygame.quit()
Grazie a tutti
Fabio