#1 Le 08/01/2007, à 09:41
- lomdefer
probleme avec du phyton
Bonjour tout le monde, à l'aide d'un magazine de developpement, j'ai crée un jeu de ping-pong en 2D en langage python, mais quand je le lance il ne marche pas et je ne sais pas pourquoi.
Voici le code du jeu :
# -*- coding: utf-8 -*-
## Original Version by Olaf Nowacki <ioa_AT_gmx_DOT_net> (http://www.pygame.org/projects/20/157/)
## Modified by Julien Herbin <julien_AT_ecranbleu_DOT_org> for "Programmation sous Linux"
import pygame, random, os
from pygame.locals import *
BALL_SPEED = 4
PADDLE_SPEED = 5
class Paddle(pygame.sprite.Sprite):
def __init__(self, color, x):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((20, 150))
self.rect = pygame.draw.rect(self.image, color, self.image.get_rect())
self.rect = self.rect.move(x, 225)
self.score = 0
def move(self, y):
if (y < 0 and self.rect.top >= y) or (y > 0 and self.rect.bottom <= 600 - y):
self.rect = self.rect.move(0, y)
def moveUp(self):
self.move(-PADDLE_SPEED)
def moveDown(self):
self.move(PADDLE_SPEED)
def goal(self):
self.score += 1
def getScore(self):
return self.score
class Ball(pygame.sprite.Sprite):
def __init__(self, start_pos):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(os.path.join('images', 'ball.png')).convert_alpha()
self.rect = self.image.get_rect()
self.rect = self.rect.move(start_pos)
temp = [-BALL_SPEED, BALL_SPEED]
self.speed = [random.choice(temp), random.choice(temp)]
def update(self):
self.rect = self.rect.move(self.speed)
def main():
# Initialisation Pygame
pygame.init()
size = width, height = 800, 600
font = pygame.font.Font(None, 80) ; font_small = pygame.font.Font(None, 40)
white = (255, 255, 255) ; red = (255, 0, 0) ; blue = (0, 0, 255)
clock = pygame.time.Clock()
# Configuration de la fenêtre
screen = pygame.display.set_mode(size)
pygame.display.set_caption('PyngPong')
pygame.display.set_icon(pygame.image.load(os.path.join('images', 'icon.png')).convert())
background = pygame.image.load(os.path.join('images','fond.png')).convert()
screen.blit(background, (0, 0))
pygame.mouse.set_visible(False)
pygame.display.flip()
# Initialisation des sprites et paramètres de jeu
paddle_left = Paddle(red, 20)
paddle_right = Paddle(blue, screen.get_width() - 40)
ball = Ball((screen.get_width() / 2, screen.get_height() / 2))
allsprites = pygame.sprite.RenderUpdates((paddle_left, paddle_right, ball))
old_mouse_posy = pygame.mouse.get_pos()[1]
game_paused = True
# Préparation des sons
snd_pong = pygame.mixer.Sound(os.path.join('sound', 'pong.ogg'))
snd_ping = pygame.mixer.Sound(os.path.join('sound', 'ping.ogg'))
snd_clapping = pygame.mixer.Sound(os.path.join('sound', 'clapping.ogg'))
# Chargement et lecture de la musique
# A vous de mettre votre musique préférée dans le répertoire "sound", puis décommenter les lignes qui suivent
#pygame.mixer.music.load(os.path.join('sound', 'music.ogg'))
#pygame.mixer.music.play(-1)
# Boucle principale
while 1:
# Gestion des événements Pygame
for event in pygame.event.get():
if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
pygame.display.quit()
return
# Gestion des événements utilisateur
pressed_keys = pygame.key.get_pressed()
if pressed_keys[K_f]:
pygame.display.toggle_fullscreen()
if pressed_keys[K_SPACE]:
game_paused = not game_paused
if game_paused:
texte_pause_val = "Game paused. Press space bar to resume !"
else:
texte_pause_val = ""
# Contrôles joueur de gauche
if pressed_keys[K_a]:
paddle_left.moveUp()
if pressed_keys[K_q]:
paddle_left.moveDown()
new_mouse_posy = pygame.mouse.get_pos()[1]
if new_mouse_posy != old_mouse_posy:
paddle_left.move(new_mouse_posy - old_mouse_posy)
old_mouse_posy = new_mouse_posy
# Contrôles joueur de droite
if pressed_keys[K_UP]:
paddle_right.moveUp()
if pressed_keys[K_DOWN]:
paddle_right.moveDown()
# Déplacement de la balle
if ball.rect.left < 0 :
ball.__init__((screen.get_width() / 2, screen.get_height() / 2))
paddle_right.goal()
snd_clapping.play()
elif ball.rect.right > screen.get_width():
ball.__init__((screen.get_width() / 2, screen.get_height() / 2))
paddle_left.goal()
snd_clapping.play()
# Rebonds de la balle
if ball.rect.top < 0 or ball.rect.bottom > height:
ball.speed[1] = -ball.speed[1]
snd_ping.play()
if ball.rect.left == paddle_left.rect.right and ball.rect.top < paddle_left.rect.bottom and ball.rect.bottom > paddle_left.rect.top:
ball.speed[0] = -ball.speed[0]
snd_pong.play()
elif ball.rect.right == paddle_right.rect.left and ball.rect.top < paddle_right.rect.bottom and ball.rect.bottom > paddle_right.rect.top:
ball.speed[0] = -ball.speed[0]
snd_pong.play()
allsprites.update() # Mise à jour de tous les sprites
# Rendu des textes
text = font.render(str(paddle_left.getScore()) + " : " + str(paddle_right.getScore()), 1, white)
textpos = text.get_rect(centerx=(screen.get_width() / 2))
# Avec une version plus ancienne de Pygame :
# textpos = texte_pause.get_rect()
# textpos.centerx=(screen.get_width() / 2)
texte_pause = font_small.render(texte_pause_val, 1, blue)
texte_pause_pos = texte_pause.get_rect(center=(screen.get_width() / 2, screen.get_height() / 2))
# Avec une version plus ancienne de Pygame :
# texte_pause_pos = texte_pause.get_rect()
# texte_pause_pos.center(screen.get_width() / 2, screen.get_height() / 2)
# Affichage
clock.tick(60) # Limitation du nb d'images par secondes
screen.blit(background, (0, 0))
screen.blit(text, textpos)
allsprites.draw(screen)
screen.blit(texte_pause, texte_pause_pos)
pygame.display.flip()
pygame.mixer.music.fadeout()
if __name__ == '__main__':
main()
Voici le message d'erreur :
luc@ubuntu:~/Desktop/Pygame$ python pong.py
Traceback (most recent call last):
File "pong.py", line 171, in ?
main()
File "pong.py", line 60, in main
pygame.display.set_icon(pygame.image.load(os.path.join('images', 'icon.png')).convert())
pygame.error: Couldn't open images/icon.png
Hors ligne
#2 Le 08/01/2007, à 11:33
- melyo
Re : probleme avec du phyton
Est-ce que tu as un dossier images contenant un fichier icon.png à la racine de ton projet ?
"L'évasion n'est jamais qu'une construction de l'esprit" - Léo Ferré
Hors ligne
#3 Le 08/01/2007, à 11:39
- lomdefer
Re : probleme avec du phyton
a non j'ai oublier de le mettre...
Hors ligne
#4 Le 08/01/2007, à 11:47
- lomdefer
Re : probleme avec du phyton
Voici maintenant mon nouveau message d'erreur :
luc@ubuntu:~/Desktop/jeux_pygame/Pygame$ python pong.py
Traceback (most recent call last):
File "pong.py", line 171, in ?
main()
File "pong.py", line 75, in main
snd_pong = pygame.mixer.Sound(os.path.join('sound', 'pong.ogg'))
pygame.error: mixer system not initialized
Et j'ai bien un fichier sound avec le fichier pong.ogg
LA fenêtre s'ouvre pendant 2 secondes et pui hop elle disparaît !!!
Dernière modification par lomdefer (Le 08/01/2007, à 11:53)
Hors ligne
#5 Le 08/01/2007, à 12:13
- melyo
Re : probleme avec du phyton
je ne fais pas de python, mais j'ai peut être quelques pistes :
- pygame.mixer demande peut-être d'être instancier ?
- si non il a peut être besoin qu'on appel une fonction initialize avant toutes opération sur celui-ci ?
Bonne continuation !
"L'évasion n'est jamais qu'une construction de l'esprit" - Léo Ferré
Hors ligne
#6 Le 08/01/2007, à 12:23
- lomdefer
Re : probleme avec du phyton
Ouai j'ai bien pensé a sa mais je sais pas du tout comment proceder pour faire cela (si c'est bien la le probleme).
Merci quand même...
Hors ligne
#7 Le 08/01/2007, à 12:49
- manatlan
Re : probleme avec du phyton
si tu fais un package de tes fichiers (le py et les images/sons)
je te le ferai marcher, et je te dirai où sont les "probs"
(pk comme ça, coup par coup, via un forum, ça risque d'être long)
Dernière modification par manatlan (Le 08/01/2007, à 12:50)
"Oui, oui."
-- Shakespeare (Richard III, Acte I, Scène IV)
Hors ligne
#8 Le 08/01/2007, à 13:05
- lomdefer
Re : probleme avec du phyton
je crée un package en quel format, bzip2 ??
Dernière modification par lomdefer (Le 08/01/2007, à 13:10)
Hors ligne
#9 Le 08/01/2007, à 13:12
- remio
Re : probleme avec du phyton
l'exemple de base pour le son
import pygame.mixer, pygame.time
pygame.mixer.init(22050)
sound=pygame.mixer.Sound('ph1.wav')
channel=sound.play()
while channel.get_busy():
pygame.time.wait(10)
donc tu devrais peut etre rajouter :
pygame.mixer.init(22050)
#10 Le 08/01/2007, à 13:39
- lomdefer
Re : probleme avec du phyton
pour être honnêtre je comprend pas trop ce que tu as fait.
a quoi tout sa corespond ?
Hors ligne
#11 Le 08/01/2007, à 13:48
- remio
Re : probleme avec du phyton
ben moi je testerais en rajoutant le pygame.mixer.init(22050) juste apres # Préparation des sons
# Préparation des sons
pygame.mixer.init(22050)
snd_pong = pygame.mixer.Sound(os.path.join('sound', 'pong.ogg'))
snd_ping = pygame.mixer.Sound(os.path.join('sound', 'ping.ogg'))
snd_clapping = pygame.mixer.Sound(os.path.join('sound', 'clapping.ogg'))
#12 Le 08/01/2007, à 13:54
- lomdefer
Re : probleme avec du phyton
a ba je l'ai déja fait et voici l'erreur que sa me marque :
luc@ubuntu:~/Desktop/jeux_pygame/Pygame$ python pong.py
Traceback (most recent call last):
File "pong.py", line 172, in ?
main()
File "pong.py", line 75, in main
pygame.mixer.init(22050)
pygame.error: No available audio device
Que faire, que faire ???
Hors ligne
#13 Le 08/01/2007, à 14:05
- melyo
Re : probleme avec du phyton
Apparement maintenant ça se passe au niveau de la configuration avec ton matériel. Tu dois avoir une propriété qui te permet de spécifié où envoyé le son ?!
Que signifie ce que tu passe à "init" ?
Dernière modification par melyo (Le 08/01/2007, à 14:06)
"L'évasion n'est jamais qu'une construction de l'esprit" - Léo Ferré
Hors ligne
#14 Le 08/01/2007, à 14:07
- lomdefer
Re : probleme avec du phyton
ok il faut que je trouve "l'audio device", comment fait-on ??
Hors ligne
#15 Le 08/01/2007, à 14:11
- melyo
Re : probleme avec du phyton
cherche avec les mots :
"pygame.error: No available audio device"
Tu trouveras surement une solution !
"L'évasion n'est jamais qu'une construction de l'esprit" - Léo Ferré
Hors ligne
#16 Le 08/01/2007, à 14:13
- melyo
Re : probleme avec du phyton
J'ai essayé
http://www.kibosh.org/pykaraoke/faq.php
Linux: No Available Audio Device
Linux users may get the following error message:
pygame.error: No available audio device
You should try switching between libsdl-oss and libsdl-alsa.
Ca ne résoudra peut-être pas le souci.
Dernière modification par melyo (Le 08/01/2007, à 14:14)
"L'évasion n'est jamais qu'une construction de l'esprit" - Léo Ferré
Hors ligne
#17 Le 08/01/2007, à 14:18
- remio
Re : probleme avec du phyton
bon sinon j'ai essayer ton prog , ca marche tres bien chez moi , sans mettre l'init en fait ,
le pygame.init initialise les sous modules donc le mixer aussi.
donc il te manques quelquechose dans ta config , tu as bien la libsdl-mixer1.2 ?
libsdl-mixer1.2
#18 Le 08/01/2007, à 14:26
- lomdefer
Re : probleme avec du phyton
a ben c'est peut-être sa qui me manque je regarde et je vous dit !!
Hors ligne
#19 Le 08/01/2007, à 14:28
- lomdefer
Re : probleme avec du phyton
ben libsdl-mixer1.2 est bien installer pourtant...je comprend pas !!
Hors ligne
#20 Le 08/01/2007, à 14:30
- melyo
Re : probleme avec du phyton
You should try switching between libsdl-oss and libsdl-alsa.
"L'évasion n'est jamais qu'une construction de l'esprit" - Léo Ferré
Hors ligne
#21 Le 08/01/2007, à 14:47
- lomdefer
Re : probleme avec du phyton
sa j'ai essayer donc comme ceci :
pygame.mixer.init(libsdl-oss)
et voici le message d'erreur :
luc@ubuntu:~/Desktop/jeux_pygame/Pygame$ python pong.py
Traceback (most recent call last):
File "pong.py", line 172, in ?
main()
File "pong.py", line 75, in main
pygame.mixer.init(libsdl-oss)
NameError: global name 'libsdl' is not defined
sa me marque se message pour les deux "libsdl-oss et libsdl-alsa"
mais quand dans un terminal je tape :
luc@ubuntu:~ alsamixer
J'obtient une image qui ressemble à un espèce d'histogramme pour le son(j'aurais bien mis une image mais avec imageshack sa galère).
qu'est-ce que sa signifie ??
Hors ligne
#22 Le 08/01/2007, à 14:51
- melyo
Re : probleme avec du phyton
je ne pense pas qu'il faille passer libsdl-oss ou l'autre en paramètre à la fonction. tu dois installer ou vérifié si ces librairies sont installées (suivant ce que tu utilises pour le son alsa ou oss)
"L'évasion n'est jamais qu'une construction de l'esprit" - Léo Ferré
Hors ligne
#23 Le 08/01/2007, à 14:58
- lomdefer
Re : probleme avec du phyton
moi j'utilise alsa mais bon sa change rien.
C'est bizarre que sa marche chez remio alors que lui il chanre rien au code départ.
MAis toute façon pour installer python j'ai fait comme cceci :
luc@ubuntu:~ apt-get install python-pygame
donc tout les paquets dépendant, c'est à dire les sous modules sont tous installer en même temps car j'ai besoin de :
- Python
-les modules numeric et numeric-ext pour python
-les librairies SDL
et normalement tout est installer donc je vois pas ce qui cloche.
Hors ligne
#24 Le 08/01/2007, à 15:03
- melyo
Re : probleme avec du phyton
libsdl-alsa est bien installé sur ton système ?
A ce stade je crois que ca dépend plus du code mais des paquets installés.
"L'évasion n'est jamais qu'une construction de l'esprit" - Léo Ferré
Hors ligne
#25 Le 08/01/2007, à 15:06
- lomdefer
Re : probleme avec du phyton
bon sa y est j'ai réussi a le faire marcher !!
J'ai désinstaller libsdl-oss et installer libsdl-alsa, bon maintenant le jeu marche mais j'ai un autre probleme c'est que la balle rebondit très bien sur la plaque de gauche mais passe a travers celle de droite...donc le joueur de gauche marque toujours des points.
aie aie aie
Hors ligne