2017-08-19 2 views
0

Je fais un jeu simple, mais quand j'ai essayé d'utiliser le son (fichier wav), j'ai eu une erreur en disant que pygame était incapable d'ouvrir le fichier. Je vais coller mon code entier pour que vous puissiez voir si j'ai fait quelque chose de mal. J'ai l'impression d'avoir tout essayé, mais je ne trouve rien qui fonctionne. Je l'ai vu que d'autres personnes ont eu le même problème, mais rien de tout cela ne pouvait me aiderPygame incapable d'ouvrir le fichier

# Shmup game 
# Frozen Jam by tgfcoder <https://twitter.com/tgfcoder> licensed under CC-BY-3 
# Art from Kenney.nl 
import pygame 
import random 
from os import path 

WIDTH = 480 
HEIGHT = 600 
FPS = 60 

#define colors 
WHITE = (255, 255, 255) 
BLACK = (0, 0, 0) 
RED = (255, 0, 0) 
GREEN = (0, 255, 0) 
BLUE = (0, 0, 255) 
YELLOW = (255, 255, 0) 


#initialize pygame and create window 
pygame.init() 
pygame.mixer.pre_init(44100, 16, 2, 4096) 
pygame.mixer.init() 
screen = pygame.display.set_mode((WIDTH, HEIGHT)) 
pygame.display.set_caption("Shmup!") 
clock = pygame.time.Clock() 

img_dir = path.join(path.dirname(__file__), "img") 
snd_dir = path.join(path.dirname(__file__), "snd") 


font_name = pygame.font.match_font('arial') 
def draw_text(surf, text, size, x, y): 
    font = pygame.font.Font(font_name, size) 
    text_surface = font.render(text, True, WHITE) 
    text_rect = text_surface.get_rect() 
    text_rect.midtop = (x, y) 
    surf.blit(text_surface, text_rect) 

class Player(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.transform.scale(player_img, (50, 38)) 
     self.image.set_colorkey(BLACK) 
     self.rect = self.image.get_rect() 
     self.radius = 20 
     #pygame.draw.circle(self.image, RED, self.rect.center, self.radius) 
     self.rect.centerx = WIDTH/2 
     self.rect.bottom = HEIGHT -10 
     self.speedx = 0 

    def update(self): 
     self.speedx = 0 
     keystate = pygame.key.get_pressed() 
     if keystate[pygame.K_a]: 
      self.speedx = -7 
     if keystate[pygame.K_d]: 
      self.speedx = 7 
     self.rect.x += self.speedx 
     if self.rect.right > WIDTH: 
      self.rect.right = WIDTH 
     if self.rect.left < 0: 
      self.rect.left = 0 
    def shoot(self): 
     bullet = Bullet(self.rect.centerx, self.rect.top) 
     all_sprites.add(bullet) 
     bullets.add(bullet) 
     shoot_sound.play 

class Mob(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image_orig = random.choice(meteor_images) 
     self.image_orig.set_colorkey(BLACK) 
     self.image = self.image_orig.copy() 
     self.rect = self.image.get_rect() 
     self.radius = int(self.rect.width * .85/2) 
     # pygame.draw.circle(self.image, RED, self.rect.center, self.radius) 
     self.rect.x = random.randrange(0, WIDTH - self.rect.width) 
     self.rect.y = random.randrange(-150, -100) 
     self.speedy = random.randrange(1, 8) 
     self.speedx = random.randrange(-3, 3) 
     self.rot = 0 
     self.rot_speed = random.randrange(-8, 8) 
     self.last_update = pygame.time.get_ticks() 

    def rotate(self): 
     now = pygame.time.get_ticks() 
     if now - self.last_update > 50: 
      self.last_update = now 
      self.rot = (self.rot + self.rot_speed) % 360 
      new_image = pygame.transform.rotate(self.image_orig, self.rot) 
      old_center = self.rect.center 
      self.image = new_image 
      self.rect = self.image.get_rect() 
      self.rect.center = old_center 

    def update(self): 
     self.rotate() 
     self.rect.x += self.speedx 
     self.rect.y += self.speedy 
     if self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20: 
      self.rect.x = random.randrange(WIDTH - self.rect.width) 
      self.rect.y = random.randrange(-100, -40) 
      self.speedy = random.randrange(1, 8) 


class Bullet(pygame.sprite.Sprite): 
    def __init__(self, x, y): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = bullet_img 
     self.image.set_colorkey(BLACK) 
     self.rect = self.image.get_rect() 
     self.rect.bottom = y 
     self.rect.centerx = x 
     self.speedy = -13 

    def update(self): 
     self.rect.y += self.speedy 
     # kill it if it moves off the top of the screen 
     if self.rect.bottom < 0: 
      self.kill 

# Load all graphics 
background = pygame.image.load(path.join(img_dir, "shmupBG.png")).convert() 
background_rect = background.get_rect() 
player_img = pygame.image.load(path.join(img_dir, "playerShip2_red.png")).convert() 
bullet_img = pygame.image.load(path.join(img_dir, "laserBlue01.png")).convert() 
meteor_images = [] 
meteor_list = ['meteorBrown_big1.png', 'meteorBrown_big2.png', 'meteorBrown_med1.png', 
       'meteorBrown_med3.png','meteorBrown_small1.png', 'meteorBrown_small2.png', 
       'meteorBrown_tiny1.png'] 
for img in meteor_list: 
    meteor_images.append(pygame.image.load(path.join(img_dir, img)).convert()) 
# Load all game sounds 
shoot_sound = pygame.mixer.Sound(path.join(snd_dir, "pew.wav")) 

all_sprites = pygame.sprite.Group() 
mobs = pygame.sprite.Group() 
bullets = pygame.sprite.Group() 
player = Player() 
all_sprites.add(player) 
for i in range(8): 
    m = Mob() 
    all_sprites.add(m) 
    mobs.add(m) 
score = 0 

#Game loop 
running = True 
while running: 
    #keep loop running at the right speed 
    clock.tick(FPS) 
    #process input (events) 
    for event in pygame.event.get(): 
     # check for closing the window 
     if event.type == pygame.QUIT: 
      running = False 
     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_SPACE: 
       player.shoot() 


    #Update 
    all_sprites.update() 
    # Check to see if bullet hit a mob 
    hits = pygame.sprite.groupcollide(mobs, bullets, True, True) 
    for hit in hits: 
     score += 50 - hit.radius 
     m = Mob() 
     all_sprites.add(m) 
     mobs.add(m) 
    # Check to see if a mob hit the player 
    hits = pygame.sprite.spritecollide(player, mobs, False, pygame.sprite.collide_circle) 
    if hits: 
     running = False 

    #Draw/render 
    screen.fill(BLACK) 
    screen.blit(background, background_rect) 
    all_sprites.draw(screen) 
    draw_text(screen, str(score), 18, WIDTH/2, 10) 
    # *after* drawing everything, flip the display 
    pygame.display.flip() 

pygame.quit() 

Mais c'est le message d'erreur je suis arrivé:

Traceback (most recent call last): 
File "C:\Users\Steinar Hillestad\Desktop\Spyder\shmup.py", line 137, in <module> 
shoot_sound = pygame.mixer.Sound(path.join(snd_dir, "pew.wav")) 
pygame.error: Unable to open file 'C:\\Users\\Steinar Hillestad\\Desktop\\Spyder\\snd\\pew.wav' 

Merci pour votre aide!

+0

J'ai été capable de le réparer! Je viens de changer le fichier son de .wav à .ogg – HillyzDaGinga

Répondre

0

De mes recherches et de mon expérience, j'ai quelques suggestions. d'abord j'initialiser tous les modules de pygames:

pygame.mixer.pre_init(44100, 16, 2, 4096) #frequency, size, channels, buffersize 
pygame.init() #turn all of pygame on. 

Je voudrais vérifier votre version pygame

import pygame 
print pygame.version.ver 

qui devrait fonctionner

Quelque chose que vous devez savoir est que certaines versions de pygame ne prend pas en charge les Wav flottants 32 bits.

Enfin, je voudrais vérifier ce répertoire PyGame est à la recherche de votre fichier wav dans.

Autre que je n'ai aucune idée sur la façon de vous aider. Peut-être que quelqu'un d'autre a la réponse que je ne peux pas donner.

Bonne chance!