#1 Le 14/11/2021, à 19: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, à 21:13)
Hors ligne
#2 Le 15/11/2021, à 17: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, à 18: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, à 11: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, à 11: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, à 21:13
- chris7522
Re : [Resolu] affichage de texte dans pygame
Bonsoir ,
Effectivement , ca fonctionne !
Merci
Hors ligne
#7 Le 16/11/2021, à 21: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, à 22:01
- Compte supprimé
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 ?
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, à 22:01)
#9 Le 17/11/2021, à 20:14
- chris7522
Re : [Resolu] affichage de texte dans pygame
Trop cool !
Je te remercie
Hors ligne