Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 08/01/2007, à 10: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, à 12: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, à 12:39

lomdefer

Re : probleme avec du phyton

a non j'ai oublier de le mettre...

Hors ligne

#4 Le 08/01/2007, à 12: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, à 12:53)

Hors ligne

#5 Le 08/01/2007, à 13: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, à 13: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, à 13: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, à 13:50)


"Oui, oui."
                -- Shakespeare (Richard III, Acte I, Scène IV)

Hors ligne

#8 Le 08/01/2007, à 14: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, à 14:10)

Hors ligne

#9 Le 08/01/2007, à 14: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, à 14: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, à 14: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, à 14: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, à 15: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, à 15:06)


"L'évasion n'est jamais qu'une construction de l'esprit" - Léo Ferré

Hors ligne

#14 Le 08/01/2007, à 15: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, à 15: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, à 15:13

melyo

Re : probleme avec du phyton

J'ai essayé smile

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, à 15:14)


"L'évasion n'est jamais qu'une construction de l'esprit" - Léo Ferré

Hors ligne

#17 Le 08/01/2007, à 15: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, à 15: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, à 15: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, à 15: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, à 15: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, à 15: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, à 15: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, à 16: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, à 16: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