from pygame import *
from random import randint
scr = display.set_mode((800,500))
class SousMarin:
r = 15 # radius
x = 50. # position en pixels
y = 250. # du SousMarin
spd = 200. # vitesse en pixels par seconde
clk = time.Clock()
tick = 0
drct = {0:(0,0),K_DOWN:(0,1),K_UP:(0,-1), K_LEFT:(-1,0),K_RIGHT:(1,0)}
keys = [0]
img = Surface((30,30))
rect = Rect(0,0,30,30)
draw.polygon(img,Color('red'),((5,5),(5,25),(30,15)))
draw.circle (img,Color('red'),(15,15),15,1)
@staticmethod
def update(ev=None):
# déplacement en fonction du temps écoulé
v = (SousMarin.spd/1000)*SousMarin.clk.tick()
SousMarin.x += SousMarin.drct[SousMarin.keys[-1]][0]*v
SousMarin.y += SousMarin.drct[SousMarin.keys[-1]][1]*v
SousMarin.rect.center = (SousMarin.x,SousMarin.y)
# empêche de sortir du cadre
if not scr.get_rect().contains(SousMarin.rect):
SousMarin.rect.clamp_ip(scr.get_rect())
SousMarin.x,SousMarin.y = SousMarin.rect.center
# gestion des touches fléchées
if ev:
if ev.type == KEYDOWN:
if ev.key in (K_DOWN,K_UP,K_LEFT,K_RIGHT):
SousMarin.keys.append(ev.key)
elif ev.type == KEYUP:
if ev.key in SousMarin.keys:
SousMarin.keys.remove(ev.key)
class Bulles:
alls = []
clk = time.Clock()
tick = 0
class Bulle:
min_radius = 30 # fourchette de diamètre
max_radius = 80 # des bulles
def __init__(self):
self.r = randint(self.min_radius,self.max_radius)
self.x = 800+self.r
self.y = randint(self.r,500-self.r)
self.s = randint(100,300) # fourchette de vitesse des bulles
self.clk = time.Clock()
def update(self):
self.x -= (self.s/1000)*self.clk.tick()
# si la bulle sort de la scène
if self.x+self.r < 0:
return False
# si la bulle touche le SousMarin
if (self.x-SousMarin.x)**2+(self.y-SousMarin.y)**2 < (self.r+SousMarin.r)**2:
return False
return True
@staticmethod
def update():
Bulles.tick += Bulles.clk.tick()
if Bulles.tick >= 500: # une nouvelle bulle toutes les 500ms
Bulles.alls.append(Bulles.Bulle())
Bulles.tick -= 500
Bulles.alls = [bulle for bulle in Bulles.alls if bulle.update()]
# redessine la scène, framerate de 50 images/seconde
def redraw():
redraw.tick += redraw.clk.tick()
if redraw.tick >= 20:
scr.fill(Color('darkblue'))
for bulle in Bulles.alls:
draw.circle(scr,Color('white'),(bulle.x,bulle.y),bulle.r,1)
scr.blit(SousMarin.img,SousMarin.rect)
display.flip()
redraw.tick -= 20
redraw.clk = time.Clock()
redraw.tick = 0
clk = time.Clock()
tick = 0
# mainloop
while True:
tick += clk.tick(100)
# limite de 30 secondes
if tick >= 30_000:
break
for ev in event.get():
if ev.type == QUIT:
break
# envoie la commande au SousMarin
SousMarin.update(ev)
else:
Bulles.update()
SousMarin.update()
redraw()
continue
break
from pygame import *
from random import randint
scr = display.set_mode((800,500))
class SousMarin:
r = 15 # radius
x = 50. # position en pixels
y = 250. # du SousMarin
spd = 200. # vitesse en pixels par seconde
clk = time.Clock()
tick = 0
drct = {0:(0,0),K_DOWN:(0,1),K_UP:(0,-1), K_LEFT:(-1,0),K_RIGHT:(1,0)}
keys = [0]
img = Surface((30,30))
rect = Rect(0,0,30,30)
draw.polygon(img,Color('red'),((5,5),(5,25),(30,15)))
draw.circle (img,Color('red'),(15,15),15,1)
@staticmethod
def update(ev=None):
# déplacement en fonction du temps écoulé
v = (SousMarin.spd/1000)*SousMarin.clk.tick()
SousMarin.x += SousMarin.drct[SousMarin.keys[-1]][0]*v
SousMarin.y += SousMarin.drct[SousMarin.keys[-1]][1]*v
SousMarin.rect.center = (SousMarin.x,SousMarin.y)
# empêche de sortir du cadre
if not scr.get_rect().contains(SousMarin.rect):
SousMarin.rect.clamp_ip(scr.get_rect())
SousMarin.x,SousMarin.y = SousMarin.rect.center
# gestion des touches fléchées
if ev:
if ev.type == KEYDOWN:
if ev.key in (K_DOWN,K_UP,K_LEFT,K_RIGHT):
SousMarin.keys.append(ev.key)
elif ev.type == KEYUP:
if ev.key in SousMarin.keys:
SousMarin.keys.remove(ev.key)
class Bulles:
alls = []
clk = time.Clock()
tick = 0
class Bulle:
min_radius = 30 # fourchette de diamètre
max_radius = 80 # des bulles
def __init__(self):
self.r = randint(self.min_radius,self.max_radius)
self.x = 800+self.r
self.y = randint(self.r,500-self.r)
self.s = randint(100,300) # fourchette de vitesse des bulles
self.clk = time.Clock()
def update(self):
self.x -= (self.s/1000)*self.clk.tick()
# si la bulle sort de la scène
if self.x+self.r < 0:
return False
# si la bulle touche le SousMarin
if (self.x-SousMarin.x)**2+(self.y-SousMarin.y)**2 < (self.r+SousMarin.r)**2:
return False
return True
@staticmethod
def update():
Bulles.tick += Bulles.clk.tick()
if Bulles.tick >= 500: # une nouvelle bulle toutes les 500ms
Bulles.alls.append(Bulles.Bulle())
Bulles.tick -= 500
Bulles.alls = [bulle for bulle in Bulles.alls if bulle.update()]
# redessine la scène, framerate de 50 images/seconde
def redraw():
redraw.tick += redraw.clk.tick()
if redraw.tick >= 20:
scr.fill(Color('darkblue'))
for bulle in Bulles.alls:
draw.circle(scr,Color('white'),(bulle.x,bulle.y),bulle.r,1)
scr.blit(SousMarin.img,SousMarin.rect)
display.flip()
redraw.tick -= 20
redraw.clk = time.Clock()
redraw.tick = 0
clk = time.Clock()
tick = 0
# mainloop
while True:
tick += clk.tick(100)
# limite de 30 secondes
if tick >= 30_000:
break
for ev in event.get():
if ev.type == QUIT:
break
# envoie la commande au SousMarin
SousMarin.update(ev)
else:
Bulles.update()
SousMarin.update()
redraw()
continue
break
- Edité par josmiley il y a environ 10 heures
Merci beaucoup !!! ce n'est pas grave pour les fonctions. J'ai une question : est-ce que tu sais s'il existe des cours pour pygame ?
Y a des tutos sur YouTube , sinon j'ai appris juste en lisant la doc , c'est assez facile à comprendre en fait car le principe est plutôt simple .
- Edité par josmiley 26 janvier 2023 à 8:11:41
Python c'est bon, mangez-en.
Pouvez-me proposer une version Pygame de ce code ?
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Python c'est bon, mangez-en.
Python c'est bon, mangez-en.