Nov-16-2023, 04:16 AM
Kind regards, for the first time I'm trying to experiment with Python to create game situations, I get the black game window but apparently I get no errors, it could be an indentation error? what is the problem?
import pygame
import random
import pygame.mixer
# Definisci la larghezza e l'altezza della finestra
WIDTH = 1200
HEIGHT = 800
# Inizializza pygame
pygame.init()
# Crea una finestra di gioco di dimensione WIDTH x HEIGHT
screen = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.update()
# Crea un titolo per la finestra
pygame.display.set_caption("Bersagli mobili")
# Crea un orologio per gestire il tempo
clock = pygame.time.Clock()
# Carica l'immagine del mirino
mirino = pygame.image.load("C:\\ProgramData\\ProgramPy\\mirino.png")
# Crea uno sprite per il mirino
sprite_mirino = pygame.sprite.Sprite()
pygame.display.update()
# Assegna l'immagine allo sprite
sprite_mirino.image = mirino
# Assegna la posizione allo sprite
sprite_mirino.rect = mirino.get_rect()
# Crea un gruppo di sprite per il mirino
gruppo_mirino = pygame.sprite.Group()
# Aggiunge lo sprite al gruppo
gruppo_mirino.add(sprite_mirino)
# Crea una variabile per il punteggio
punteggio = 0
# Crea una variabile per il gioco attivo
gioco_attivo = True
# Nascondi il cursore del sistema
pygame.mouse.set_visible(False)
pygame.display.update()
# Crea una classe per il bersaglio
LASER_COLOR = (255, 0, 0)
ENEMY_SPEED = 2
LASER_TIME = 3
EXPLOSION_TIME = 0.5
# Crea una classe per il laser
pygame.display.update()
class Laser (pygame.sprite.Sprite):
def __init__ (self, x, y):
pygame.sprite.Sprite.__init__ (self)
self.image = pygame.Surface((WIDTH, 5))
self.image.fill(LASER_COLOR)
self.rect = self.image.get_rect()
self.rect.centerx = x
self.rect.centery = y
def update (self):
if pygame.sprite.collide_rect(self, sprite_mirino):
sprite_mirino.hit()
self.kill()
pygame.display.update()
class Enemy (pygame.sprite.Sprite):
def __init__ (self):
pygame.sprite.Sprite.__init__ (self)
self.image = pygame.image.load ("C:\\ProgramData\\ProgramPy\\ghost.png")
self.image.set_colorkey ( (0,0,0))
self.image = pygame.transform.scale(self.image, (65, 65))
self.rect = self.image.get_rect ()
self.rect.center = (random.randint(0, WIDTH), random.randint(0, HEIGHT))
self.speedx = ENEMY_SPEED # La velocità orizzontale del nemico
self.speedy = ENEMY_SPEED # La velocità verticale del nemico
self.image_hit = pygame.image.load ("C:\\ProgramData\\ProgramPy\\explosion.png")
self.image_hit.set_colorkey ( (0,0,0))
self.image_hit = pygame.transform.scale(self.image_hit, (65, 65))
self.hit = False # Indica se il nemico è stato colpito
self.explosion_time = 0 # Il tempo trascorso dall'esplosione
self.laser_time = 0 # Il tempo trascorso dall'ultimo raggio
def update (self):
"""Aggiorna lo stato del nemico"""
if not self.hit:
self.rect.x += self.speedx
self.rect.y += self.speedy
if self.rect.left < 0 or self.rect.right > WIDTH:
self.speedx = -self.speedx
if self.rect.top < 0 or self.rect.bottom > HEIGHT:
self.speedy = -self.speedy
self.laser_time += dt
if self.laser_time > LASER_TIME:
self.shoot()
else:
self.explosion_time += dt
if self.explosion_time > EXPLOSION_TIME:
self.kill()
def explode (self):
"""Fa esplodere il nemico"""
self.image = self.image_hit
self.hit = True
def shoot (self):
"""Fa sparare un raggio al nemico"""
laser = Laser(self.rect.centerx, self.rect.centery)
gruppo_laser.add(laser)
self.laser_time = 0
# Crea un'istanza di Enemy
sprite_bersaglio = Enemy()
# Crea un gruppo di sprite per i bersagli
gruppo_bersagli = pygame.sprite.Group()
# Aggiunge lo sprite al gruppo
gruppo_bersagli.add(sprite_bersaglio)
# Crea una costante per il tempo di durata dell'esplosione
EXPLOSION_TIME = 0.5
# Crea una costante per il tempo di attesa tra un nemico e l'altro
WAIT_TIME = 4
# Crea una variabile per il tempo trascorso dall'eliminazione del nemico
wait_time = 0
# Crea una variabile booleana per indicare se si sta aspettando un nuovo nemico
waiting = False
# Importa il modulo pygame.mixer
import pygame.mixer
# Carica l'immagine di sfondo
sfondo = pygame.image.load("C:\\ProgramData\\ProgramPy\\sfondo.jpg")
# Carica il suono di base
suono_base = pygame.mixer.Sound("C:\\ProgramData\\ProgramPy\\suono_base.mp3")
# Carica il suono di esplosione
suono_esplosione = pygame.mixer.Sound("C:\\ProgramData\\ProgramPy\\suono_esplosione.wav")
# Carica il suono di laser # NEW
suono_laser = pygame.mixer.Sound("C:\\ProgramData\\ProgramPy\\suono_laser.wav") # NEW
# Riproduci il suono di base in loop
suono_base.play(-1)
# Imposta il volume del suono di base a 0.3 (30%)
suono_base.set_volume(0.3)
# Imposta il volume del suono di esplosione a 0.8 (80%)
suono_esplosione.set_volume(0.8)
# Imposta il volume del suono di laser a 0.5 (50%) # NEW
suono_laser.set_volume(0.5) # NEW
# Crea un gruppo di sprite per i laser # NEW
gruppo_laser = pygame.sprite.Group() # NEW
# Crea una classe per il giocatore # NEW
pygame.display.update()
class Player (pygame.sprite.Sprite): # NEW
def __init__ (self): # NEW
pygame.sprite.Sprite.__init__ (self) # NEW
self.image = pygame.image.load("C:\\ProgramData\\ProgramPy\\player.png") # NEW
self.image.set_colorkey((0,0,0)) # NEW
self.rect = self.image.get_rect() # NEW
self.rect.center = (WIDTH / 2, HEIGHT / 2) # NEW
self.health = 100 # NEW
def update (self): # NEW
self.rect.center = pygame.mouse.get_pos() # NEW
def hit (self): # NEW
self.health -= 10 # NEW
if self.health <= 0: # NEW
self.explode() # NEW
def explode (self): # NEW
self.image = pygame.image.load("C:\\ProgramData\\ProgramPy\\explosion.png") # NEW
self.image.set_colorkey((0,0,0)) # NEW
self.image = pygame.transform.scale(self.image, (65, 65)) # NEW
self.hit = True # NEW
self.explosion_time = 0 # NEW
# Crea un'istanza di Player # NEW
sprite_mirino = Player() # NEW
# Crea una variabile per il tempo precedente # NEW
prev_time = pygame.time.get_ticks() # NEW
# Crea un ciclo principale di gioco
pygame.display.update()
while gioco_attivo:
# Imposta il tempo di aggiornamento a 60 fps
clock.tick(60)
# Ottiene il tempo trascorso dall'ultimo aggiornamento
dt = clock.get_time() / 1000
# Gestisce gli eventi di input
for event in pygame.event.get():
# Se l'utente chiude la finestra, termina il gioco
if event.type == pygame.QUIT:
gioco_attivo = False
# Se l'utente preme il pulsante del mouse, controlla se ha colpito il nemico
if event.type == pygame.MOUSEBUTTONDOWN and not waiting:
# Ottiene la posizione del cursore
pos = pygame.mouse.get_pos()
# Controlla se il cursore è sovrapposto al nemico
if sprite_bersaglio.rect.collidepoint(pos):
# Fa esplodere il nemico
sprite_bersaglio.explode()
# Incrementa il punteggio
punteggio += 1
# Imposta la variabile waiting a True
waiting = True
# Riproduci il suono di esplosione
suono_esplosione.play()
# Se l'utente rilascia il pulsante del mouse, non fa nulla
elif event.type == pygame.MOUSEBUTTONUP:
pass
# Aggiorna gli sprite
gruppo_mirino.update()
pygame.display.update()
