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()