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 14/11/2021, à 20:32

chris7522

[Resolu] affichage de texte dans pygame

Bonsoir a toutes et a tous ,
  Je souhaiterai faire apparaitre une texte lorsque l'un des 2 joueurs atteint un certain score mais rien ne se passe . Pourriez vous m'apporter votre aide .
   Voici la petite portion de code concerné :

if scoreA > 5:
	textsurface = myfont.render('score a is winner!',False,(0,0,0))
	screen.blit(textsurface,(0,0))
	Playing = False
		
if scoreB > 5:
	textsurface = myfont.render('score btr(r- is winner!',False,(0,0,0))
	screen.blit(textsurface,(0,0))
	Playing = False

Et voici le code en entier qui n'est pas tres long :

import pygame
from random import randint

#variables
COLOR = 0,100,0
GREY = 128,128,128
PDL_WIDTH = 10
PDL_HIGHT = 100
WIDTH = 1250 
HIGHT = 800
PDL_SPEED = 10
RADIUS = 10
WHITE = 255,255,255
scoreA , scoreB = 0,0

class Paddle(pygame.sprite.Sprite):
	def __init__(self,color,width,hight):
		super().__init__()
		self.width = width
		self.hight = hight
		self.color = color
		self.image = pygame.Surface([width,hight])
		self.image.fill(GREY)
		#image.set_colorkey : tous les pixels d'une certaine couleur (la Couleur Clé en question) apparaîtront comme transparents au lieu de s'afficher dans leur vraie couleur. C'est de cette façon que l'on crée un sprite qui n’apparaît pas dans un rectangle
		self.image.set_colorkey(GREY)
		
		pygame.draw.rect(self.image,self.color,[0,0,self.width,self.hight])
		
		self.rect = self.image.get_rect()
		
	def moveUp(self,pixels):
		self.rect.y -= pixels
		if self.rect.y < 0:
			self.rect.y = 0
		
		
	def moveDown(self,pixels):
		self.rect.y += pixels
		if self.rect.y > HIGHT - self.hight:
			self.rect.y = HIGHT - self.hight
		
		
class Ball(pygame.sprite.Sprite):
	def __init__(self,color,width,hight,radius):
		super().__init__()
		self.RADIUS = radius
		self.width = width
		self.hight = hight
		self.color = color
		#dessiner la surface
		self.image = pygame.Surface([width,hight])
		#remplir la surface avec une couleur unie
		self.image.fill(WHITE)
		self.image.set_colorkey(WHITE)
		self.velocity = [randint(4,8),randint(-8,8)]
		
		pygame.draw.circle(self.image,color,(self.width // 2,self.hight // 2),self.RADIUS)
		self.rect = self.image.get_rect()
		
		
	def update(self):
		self.rect.centerx += self.velocity[0]
		self.rect.centery += self.velocity[1]
	def bounce(self):
		self.velocity[0] *= -1
		self.velocity[1] *= -1	
		

pygame.init()
pygame.font.init()
myfont = pygame.font.SysFont('Comic Sans MS', 30)

#creer une nouvelle fenetre
screen = pygame.display.set_mode((WIDTH,HIGHT))
pygame.display.set_caption("Jeux Ping Pong")

#creation des joueurs
paddleA = Paddle(COLOR,PDL_WIDTH,PDL_HIGHT)
paddleA.rect.x = 0
paddleA.rect.y = (HIGHT - PDL_HIGHT) // 2 #(hauteur de l'ecran - hauteur de la raquette // 2)

paddleB = Paddle(COLOR,PDL_WIDTH,PDL_HIGHT)
paddleB.rect.x = WIDTH - PDL_WIDTH
paddleB.rect.y = (HIGHT - PDL_HIGHT) // 2 #(hauteur de l'ecran - hauteur de la raquette // 2)

ball = Ball(COLOR,2*RADIUS,2*RADIUS,RADIUS)
ball.rect.centerx = WIDTH // 2
ball.rect.centery = HIGHT // 2


all_sprites_list = pygame.sprite.Group()

all_sprites_list.add(paddleA)
all_sprites_list.add(paddleB)
all_sprites_list.add(ball)

Playing = True

#clock pour limiter le taux de rafraichissement de l'ecran
clock = pygame.time.Clock()

while Playing:

	#gestion des evenements:
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			Playing = False
		elif event.type == pygame.KEYDOWN:
			if event.key == pygame.K_ESCAPE:
				Playing = False
	#touches appuyées
	keys = pygame.key.get_pressed()
	if keys[pygame.K_UP]:
		paddleB.moveUp(PDL_SPEED)
	if keys[pygame.K_DOWN]:
		paddleB.moveDown(PDL_SPEED)
		
	if keys[pygame.K_s]:
		paddleA.moveUp(PDL_SPEED)
	if keys[pygame.K_x]:
		paddleA.moveDown(PDL_SPEED)
	
	ball.update()
	if ball.rect.centerx > (WIDTH - RADIUS):
		scoreA += 1
		ball.velocity[0] *= -1
	if ball.rect.centerx < RADIUS:
		scoreB += 1
		ball.velocity[0] *= -1
		
	if ball.rect.centery > (HIGHT - RADIUS):
		ball.velocity[1] *= -1
	if ball.rect.centery < RADIUS:
		ball.velocity[1] *= -1
	
	
	if pygame.sprite.collide_mask(ball,paddleA) or pygame.sprite.collide_mask(ball,paddleB):
		ball.bounce()
		
		
	if scoreA > 5:
		textsurface = myfont.render('score a is winner!',False,(0,0,0))
		screen.blit(textsurface,(0,0))
		Playing = False
		
	if scoreB > 5:
		textsurface = myfont.render('score b is winner!',False,(0,0,0))
		screen.blit(textsurface,(0,0))
		Playing = False
		
		
	#changer la couleur de l'ecran
	screen.fill(GREY)
	
	#dessiner la ligne centrale(ecran,couleur,haut de la ligne,bas de la ligne,epaisseur)
	pygame.draw.line(screen,COLOR,[WIDTH // 2,0],[WIDTH // 2,HIGHT],5)
	
	#dessiner tous les objets a l'ecran
	all_sprites_list.draw(screen)
	
	#dessiner le score
	font = pygame.font.Font(None,74)
	text = font.render(str(scoreA),1,COLOR)
	screen.blit(text,[WIDTH // 4,10])
	

	text2 = font.render(str(scoreB),1,COLOR)
	screen.blit(text2,[3*WIDTH // 4,10])
	
	
	

	pygame.display.flip()
	clock.tick(60)	
pygame.quit()

D'avance , merci de votre aide !

Dernière modification par chris7522 (Le 16/11/2021, à 22:13)

Hors ligne

#2 Le 15/11/2021, à 18:19

Compte supprimé

Re : [Resolu] affichage de texte dans pygame

Bonjour,
Je n'utilise pas pygame. Je ne peux donc tester ton code.
Je lis :

myfont = pygame.font.SysFont('Comic Sans MS', 30)

'Comic Sans MS' est une police de ton système? Elle ne semble pas être présente chez moi.
Aussi essaie avec une autre police système ou utilise pygame.font.Font

Si ceci n'est pas le souci, regarde si l'évolution des variables scores se comportent que tu le penses(print() est ton ami)
Pour ce qui est de la mise en oeuvre de l'affichage, elle semble conforme à ma recherche sur le sujet .
Difficile d'en dire plus à l'aveugle.

#3 Le 15/11/2021, à 19:51

chris7522

Re : [Resolu] affichage de texte dans pygame

Bonsoir ,
Je te remercie de ton aide , je vais suivre les pistes que tu me propose en espérant que cela résolve mon problème .
Merci une nouvelle fois , très bonne soirée .

Hors ligne

#4 Le 16/11/2021, à 12:40

Compte supprimé

Re : [Resolu] affichage de texte dans pygame

Bonjour,
Bon j'ai testé....
Si tu mets tes conditions 'score' dans le bloc "dessiner le texte" cela marche.
La raison de ton soucis, c'est que les lignes :

#changer la couleur de l'ecran
	screen.fill(GREY)
	
	#dessiner la ligne centrale(ecran,couleur,haut de la ligne,bas de la ligne,epaisseur)
	pygame.draw.line(screen,COLOR,[WIDTH // 2,0],[WIDTH // 2,HIGHT],5)
	
	#dessiner tous les objets a l'ecran
	all_sprites_list.draw(screen)

écrasaient le dessin de ton texte .

#5 Le 16/11/2021, à 12:50

Compte supprimé

Re : [Resolu] affichage de texte dans pygame

Dans tous les cas j'aime bien l'approche de pygame. Je ne l'utilise pas car j'ai pris mes habitudes avec tkinter.canvas avec qui j'arrive à faire ce que je veux. Par contre, pour la partie sonore j'utilise pygame.mixer...
Bonne suite à toi

#6 Le 16/11/2021, à 22:13

chris7522

Re : [Resolu] affichage de texte dans pygame

Bonsoir ,
Effectivement , ca fonctionne !
Merci

Hors ligne

#7 Le 16/11/2021, à 22:28

chris7522

Re : [Resolu] affichage de texte dans pygame

En suivant ce que tu me dit de faire , ca fonctionne tres bien , seulement , le message ne s'affiche pas assez longtemps avant que ma boucle se termine et interrompe la partie . Comment pourrai je faire pour que le message reste a l' écran plus longtemps ?

import pygame
from random import randint

#variables
COLOR = 0,100,0
GREY = 128,128,128
PDL_WIDTH = 10
PDL_HIGHT = 100
WIDTH = 1250 
HIGHT = 800
PDL_SPEED = 10
RADIUS = 10
WHITE = 255,255,255
scoreA , scoreB = 0,0

class Paddle(pygame.sprite.Sprite):
	def __init__(self,color,width,hight):
		super().__init__()
		self.width = width
		self.hight = hight
		self.color = color
		self.image = pygame.Surface([width,hight])
		self.image.fill(GREY)
		#image.set_colorkey : tous les pixels d'une certaine couleur (la Couleur Clé en question) apparaîtront comme transparents au lieu de s'afficher dans leur vraie couleur. C'est de cette façon que l'on crée un sprite qui n’apparaît pas dans un rectangle
		self.image.set_colorkey(GREY)
		
		pygame.draw.rect(self.image,self.color,[0,0,self.width,self.hight])
		
		self.rect = self.image.get_rect()
		
	def moveUp(self,pixels):
		self.rect.y -= pixels
		if self.rect.y < 0:
			self.rect.y = 0
		
		
	def moveDown(self,pixels):
		self.rect.y += pixels
		if self.rect.y > HIGHT - self.hight:
			self.rect.y = HIGHT - self.hight
		
		
class Ball(pygame.sprite.Sprite):
	def __init__(self,color,width,hight,radius):
		super().__init__()
		self.RADIUS = radius
		self.width = width
		self.hight = hight
		self.color = color
		#dessiner la surface
		self.image = pygame.Surface([width,hight])
		#remplir la surface avec une couleur unie
		self.image.fill(WHITE)
		self.image.set_colorkey(WHITE)
		self.velocity = [randint(4,8),randint(-8,8)]
		
		pygame.draw.circle(self.image,color,(self.width // 2,self.hight // 2),self.RADIUS)
		self.rect = self.image.get_rect()
		
		
	def update(self):
		self.rect.centerx += self.velocity[0]
		self.rect.centery += self.velocity[1]
	def bounce(self):
		self.velocity[0] *= -1
		self.velocity[1] *= -1	
		

pygame.init()
pygame.font.init()
myfont = pygame.font.SysFont('Comic Sans MS', 100)

#creer une nouvelle fenetre
screen = pygame.display.set_mode((WIDTH,HIGHT))
pygame.display.set_caption("Jeux Ping Pong")

#creation des joueurs
paddleA = Paddle(COLOR,PDL_WIDTH,PDL_HIGHT)
paddleA.rect.x = 0
paddleA.rect.y = (HIGHT - PDL_HIGHT) // 2 #(hauteur de l'ecran - hauteur de la raquette // 2)

paddleB = Paddle(COLOR,PDL_WIDTH,PDL_HIGHT)
paddleB.rect.x = WIDTH - PDL_WIDTH
paddleB.rect.y = (HIGHT - PDL_HIGHT) // 2 #(hauteur de l'ecran - hauteur de la raquette // 2)

ball = Ball(COLOR,2*RADIUS,2*RADIUS,RADIUS)
ball.rect.centerx = WIDTH // 2
ball.rect.centery = HIGHT // 2


all_sprites_list = pygame.sprite.Group()

all_sprites_list.add(paddleA)
all_sprites_list.add(paddleB)
all_sprites_list.add(ball)

Playing = True

#clock pour limiter le taux de rafraichissement de l'ecran
clock = pygame.time.Clock()

while Playing:

	#gestion des evenements:
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			Playing = False
		elif event.type == pygame.KEYDOWN:
			if event.key == pygame.K_ESCAPE:
				Playing = False
	#touches appuyées
	keys = pygame.key.get_pressed()
	if keys[pygame.K_UP]:
		paddleB.moveUp(PDL_SPEED)
	if keys[pygame.K_DOWN]:
		paddleB.moveDown(PDL_SPEED)
		
	if keys[pygame.K_s]:
		paddleA.moveUp(PDL_SPEED)
	if keys[pygame.K_x]:
		paddleA.moveDown(PDL_SPEED)
	
	ball.update()
	if ball.rect.centerx > (WIDTH - RADIUS):
		scoreA += 1
		ball.velocity[0] *= -1
	if ball.rect.centerx < RADIUS:
		scoreB += 1
		ball.velocity[0] *= -1
		
	if ball.rect.centery > (HIGHT - RADIUS):
		ball.velocity[1] *= -1
	if ball.rect.centery < RADIUS:
		ball.velocity[1] *= -1
	
	
	if pygame.sprite.collide_mask(ball,paddleA) or pygame.sprite.collide_mask(ball,paddleB):
		ball.bounce()
		
	#changer la couleur de l'ecran
	screen.fill(GREY)
	
	#dessiner la ligne centrale(ecran,couleur,haut de la ligne,bas de la ligne,epaisseur)
	pygame.draw.line(screen,COLOR,[WIDTH // 2,0],[WIDTH // 2,HIGHT],5)
	
	#dessiner tous les objets a l'ecran
	
	all_sprites_list.draw(screen)
	
	#dessiner le score
	if scoreA > 2:
		textsurface = myfont.render('SCORE A IS WINNER !!',False,(0,0,0))
		screen.blit(textsurface,(WIDTH // 4,HIGHT // 2))
		Playing = False
		
	if scoreB > 2:
		textsurface = myfont.render('SCORE B IS WINNER !!',False,(0,0,0))
		screen.blit(textsurface,(WIDTH // 4,HIGHT // 2))
		Playing = False

		pygame.font.Font(None,74
	font = pygame.font.Font(None,74)
	text = font.render(str(scoreA),1,COLOR)
	screen.blit(text,[WIDTH // 4,10])
	

	text2 = font.render(str(scoreB),1,COLOR)
	screen.blit(text2,[3*WIDTH // 4,10])
	
	pygame.display.flip()
	clock.tick(60)	
pygame.quit()

Hors ligne

#8 Le 16/11/2021, à 23:01

Compte supprimé

Re : [Resolu] affichage de texte dans pygame

chris7522 a écrit :

En suivant ce que tu me dit de faire , ca fonctionne tres bien , seulement , le message ne s'affiche pas assez longtemps avant que ma boucle se termine et interrompe la partie . Comment pourrai je faire pour que le message reste a l' écran plus longtemps ?

Ajoute le code suivant:

pygame.display.flip()  #rafraichit l'écran
pygame.time.delay(5000)# attend 5 s

Dernière modification par Compte supprimé (Le 16/11/2021, à 23:01)

#9 Le 17/11/2021, à 21:14

chris7522

Re : [Resolu] affichage de texte dans pygame

Trop cool !
Je te remercie big_smile

Hors ligne