====Avant de commencer====
Si vous êtes ici c'est pour connaitre les bases de pygame, avant de commencer vérifiez si il est installé, pour le savoir, il faut tout simplement importer la bibliothèque dans votre programme. Un simple //import pygame// suffira.\\
Si python renvoie une erreur je vous invite à consulter cette [[les_fiches_revisions:langages_programmation:modularite|page]] pour installer pygame
=====Debuter avec pygame=====
Avant de commencer, tout ce que je vais vous montrer provient du site [[https://zestedesavoir.com/tutoriels/846/pygame-pour-les-zesteurs/]], c'est pour moi l'un des meilleurs tutoriels français. \\ \\ \\
import pygame #1
pygame.init() #2
ecran = pygame.display.set_mode((300, 200))#3
pygame.quit() #4
Voici grosso modo la base de tout programme avec pygame,\\
- D'abord vous importez la bibliothèque
- Ensuite vous démarrer la bibliothèque
- Ici vous sélectionnez la taille de la fenêtre (taille horizontal, taille vertical)
- Cette commande ferme la fenêtre
Mais ce code est incomplet, votre fenêtre se ferme toute seule, c'est normal.\\
==Comment faire pour que votre fenêtre soit utile?==
Rien de plus simple, //la boucle while//. \\
import pygame
pygame.init()
ecran = pygame.display.set_mode((300, 200))
ouvert = "0"
while ouvert=="0":
ouvert = input()
pygame.quit()
Cette boucle while empeche le programme de se fermer, pour fermer la fenêtre, il faudra taper dans la console autre chose que //0//. \\
Cette fois ci vous avez pu voir votre fenêtre, avant de passer à l'étape du coloriage, je vais vous présenter quelques astuces bien utiles.
import pygame
#######pygame
import pygame
WIDTH = 1000 #largeur fenetre
HEIGHT = 600# hauteur fenetre
TITRE_FENETRE = "fenetre trop cool" #titre fenetre
running= True
couleur_background = (250,250,0)#couleur du fond
pygame.init()
screen = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption(TITRE_FENETRE)
while running:
ouvert = input()
if ouvert =="0":
running= False
pygame.quit()
Voici un petit set pour bien débuter votre programme, on revoit la taille de la fenêtre mais avec quelques trucs en plus.
- TITRE_FENETRE comme son nom l'indique mettra un titre à votre fenêtre
- couleur_background servira pour plus tard
- running aussi
**ATTENTION** \\
Les commandes de pygame doivent être entrées après la ligne //pygame.init()//, sinon le programme crash \\ \\
Vous avez remarquer que toute les commande //pygame.display// on un rapport avec la fenetre, dans ce tutoriel, je vais vous présenter la section //pygame.event// ainsi que //pygame.draw//
icon_32x32 = pygame.image.load("icone.png").convert_alpha()
Bijour
====Pour finir====
Quelques petits exemples de programmes utilisant pygame ainsi que d'autres modules comme un pong :
# -*- coding: utf-8 -*-
"""
Created on Thu Jan 5 23:51:40 2023
@author: gdani
"""
import random
import pygame, sys
from pygame.locals import *
pygame.init()
fps = pygame.time.Clock()
#colors
WHITE = (255,255,255)
RED = (255,0,0)
GREEN = (0,255,0)
BLACK = (0,0,0)
#globals
WIDTH = 600
HEIGHT = 400
BALL_RADIUS = 20
PAD_WIDTH = 8
PAD_HEIGHT = 80
HALF_PAD_WIDTH = PAD_WIDTH / 2
HALF_PAD_HEIGHT = PAD_HEIGHT / 2
ball_pos = [0,0]
ball_vel = [0,0]
paddle1_vel = 0
paddle2_vel = 0
l_score = 0
r_score = 0
#canvas declaration
window = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32)
pygame.display.set_caption('Hello World')
# helper function that spawns a ball, returns a position vector and a velocity vector
# if right is True, spawn to the right, else spawn to the left
def ball_init(right):
global ball_pos, ball_vel # these are vectors stored as lists
ball_pos = [WIDTH/2,HEIGHT/2]
horz = random.randrange(2,4)
vert = random.randrange(1,3)
if right == False:
horz = - horz
ball_vel = [horz,-vert]
# define event handlers
def init():
global paddle1_pos, paddle2_pos, paddle1_vel, paddle2_vel,l_score,r_score # these are floats
global score1, score2 # these are ints
paddle1_pos = [HALF_PAD_WIDTH - 1,HEIGHT/2]
paddle2_pos = [WIDTH +1 - HALF_PAD_WIDTH,HEIGHT/2]
l_score = 0
r_score = 0
if random.randrange(0,2) == 0:
ball_init(True)
else:
ball_init(False)
#draw function of canvas
def draw(canvas):
global paddle1_pos, paddle2_pos, ball_pos, ball_vel, l_score, r_score
canvas.fill(BLACK)
pygame.draw.line(canvas, WHITE, [WIDTH / 2, 0],[WIDTH / 2, HEIGHT], 1)
pygame.draw.line(canvas, WHITE, [PAD_WIDTH, 0],[PAD_WIDTH, HEIGHT], 1)
pygame.draw.line(canvas, WHITE, [WIDTH - PAD_WIDTH, 0],[WIDTH - PAD_WIDTH, HEIGHT], 1)
pygame.draw.circle(canvas, WHITE, [WIDTH//2, HEIGHT//2], 70, 1)
# update paddle's vertical position, keep paddle on the screen
if paddle1_pos[1] > HALF_PAD_HEIGHT and paddle1_pos[1] < HEIGHT - HALF_PAD_HEIGHT:
paddle1_pos[1] += paddle1_vel
elif paddle1_pos[1] == HALF_PAD_HEIGHT and paddle1_vel > 0:
paddle1_pos[1] += paddle1_vel
elif paddle1_pos[1] == HEIGHT - HALF_PAD_HEIGHT and paddle1_vel < 0:
paddle1_pos[1] += paddle1_vel
if paddle2_pos[1] > HALF_PAD_HEIGHT and paddle2_pos[1] < HEIGHT - HALF_PAD_HEIGHT:
paddle2_pos[1] += paddle2_vel
elif paddle2_pos[1] == HALF_PAD_HEIGHT and paddle2_vel > 0:
paddle2_pos[1] += paddle2_vel
elif paddle2_pos[1] == HEIGHT - HALF_PAD_HEIGHT and paddle2_vel < 0:
paddle2_pos[1] += paddle2_vel
#update ball
ball_pos[0] += int(ball_vel[0])
ball_pos[1] += int(ball_vel[1])
#draw paddles and ball
pygame.draw.circle(canvas, RED, ball_pos, 20, 0)
pygame.draw.polygon(canvas, WHITE, [[paddle1_pos[0] - HALF_PAD_WIDTH, paddle1_pos[1] - HALF_PAD_HEIGHT], [paddle1_pos[0] - HALF_PAD_WIDTH, paddle1_pos[1] + HALF_PAD_HEIGHT], [paddle1_pos[0] + HALF_PAD_WIDTH, paddle1_pos[1] + HALF_PAD_HEIGHT], [paddle1_pos[0] + HALF_PAD_WIDTH, paddle1_pos[1] - HALF_PAD_HEIGHT]], 0)
pygame.draw.polygon(canvas, WHITE, [[paddle2_pos[0] - HALF_PAD_WIDTH, paddle2_pos[1] - HALF_PAD_HEIGHT], [paddle2_pos[0] - HALF_PAD_WIDTH, paddle2_pos[1] + HALF_PAD_HEIGHT], [paddle2_pos[0] + HALF_PAD_WIDTH, paddle2_pos[1] + HALF_PAD_HEIGHT], [paddle2_pos[0] + HALF_PAD_WIDTH, paddle2_pos[1] - HALF_PAD_HEIGHT]], 0)
#ball collision check on top and bottom walls
if int(ball_pos[1]) <= BALL_RADIUS:
ball_vel[1] = - ball_vel[1]
if int(ball_pos[1]) >= HEIGHT + 1 - BALL_RADIUS:
ball_vel[1] = -ball_vel[1]
#ball collison check on gutters or paddles
if int(ball_pos[0]) <= BALL_RADIUS + PAD_WIDTH and int(ball_pos[1]) in range(paddle1_pos[1] - HALF_PAD_HEIGHT,paddle1_pos[1] + HALF_PAD_HEIGHT,1):
ball_vel[0] = -ball_vel[0]
ball_vel[0] *= 1.1
ball_vel[1] *= 1.1
elif int(ball_pos[0]) <= BALL_RADIUS + PAD_WIDTH:
r_score += 1
ball_init(True)
if int(ball_pos[0]) >= WIDTH + 1 - BALL_RADIUS - PAD_WIDTH and int(ball_pos[1]) in range(paddle2_pos[1] - HALF_PAD_HEIGHT,paddle2_pos[1] + HALF_PAD_HEIGHT,1):
ball_vel[0] = -ball_vel[0]
ball_vel[0] *= 1.1
ball_vel[1] *= 1.1
elif int(ball_pos[0]) >= WIDTH + 1 - BALL_RADIUS - PAD_WIDTH:
l_score += 1
ball_init(False)
#update scores
myfont1 = pygame.font.SysFont("Comic Sans MS", 20)
label1 = myfont1.render("Score "+str(l_score), 1, (255,255,0))
canvas.blit(label1, (50,20))
myfont2 = pygame.font.SysFont("Comic Sans MS", 20)
label2 = myfont2.render("Score "+str(r_score), 1, (255,255,0))
canvas.blit(label2, (470, 20))
#keydown handler
def keydown(event):
global paddle1_vel, paddle2_vel
if event.key == K_UP:
paddle2_vel = -8
elif event.key == K_DOWN:
paddle2_vel = 8
elif event.key == K_w:
paddle1_vel = -8
elif event.key == K_s:
paddle1_vel = 8
#keyup handler
def keyup(event):
global paddle1_vel, paddle2_vel
if event.key in (K_w, K_s):
paddle1_vel = 0
elif event.key in (K_UP, K_DOWN):
paddle2_vel = 0
init()
#game loop
while True:
draw(window)
for event in pygame.event.get():
if event.type == KEYDOWN:
keydown(event)
elif event.type == KEYUP:
keyup(event)
elif event.type == QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
fps.tick(60)
Et voici le rendu : {{:les_programmes_a_connaitre:langages_term:capture_d_ecran_2023-01-07_015954.png?400|}} \\
Un dernier petit exemple avec tkinter sur la récurrence, on peut faire des dessin de fractales grâce à cette bibliothèque :
import turtle as t
def koch(longueur, n):
if n == 0:
t.forward(longueur)
else:
koch(longueur/3, n-1)
t.left(60)
koch(longueur/3, n-1)
t.right(120)
koch(longueur/3, n-1)
t.left(60)
koch(longueur/3, n-1)
def flocon(taille, etape):
koch(taille, etape)
t.right(120)
koch(taille, etape)
t.right(120)
koch(taille, etape)
flocon(400, 3)
Et voici le ptit flocon dessiné grâce à cette bibliothèque. {{:les_programmes_a_connaitre:langages_term:capture_d_ecran_2023-01-07_020500.png?400|}}