Sol sur pygame
loupiot -
Bonjour, j'aimerais savoir comment est ce qu'on peut changer la hauteur du sol. Je l'ai changé a partir du moment ou le score est >= 10 mais le truc c'est que quand le joueur retombe, d'une plateforme par exemple, il retombe au niveau du sol initial et remonte juste apres en mode incognito :/ Comment est ce qu'on peut changer ca pour qu'il reste sur le sol ?
import pygame
import random
import time
pygame.font.init()
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
SCREEN_COLOR = 0,0,0
SOL_Y = 550
PLAYER_COLOR = 255, 255, 255
PLAYER_HEIGHT = 30
PLAYER_WIDTH = 30
EVENT_OBSTACLE_SPAWN = pygame.USEREVENT + 1
police = pygame.font.Font(None, 50)
FPS = 95
BAR_WIDTH = 800
BAR_HEIGHT = 30
EVENT_PROGRESS_BAR = pygame.USEREVENT + 2
class Sol(pygame.sprite.Sprite):
def __init__(self, y):
super().__init__()
self.image = pygame.Surface((SCREEN_RECT.w, 350))
self.image.fill((0,0,0))
self.rect = self.image.get_rect()
self.rect.topleft = 0, y
class Sol(pygame.sprite.Sprite):
def __init__(self, y):
super().__init__()
self.image = pygame.Surface((SCREEN_RECT.w, 350))
self.image.fill((0, 0, 0))
self.rect = self.image.get_rect()
self.rect.topleft = 0, y
class Player(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((30, 30))
self.image.fill(PLAYER_COLOR)
self.rect = self.image.get_rect()
self.rect.bottomleft = x, y
self.x = x
self.y = y
self.jumping = False
self.jump_count = 20
def move(self, amount):
self.rect.x += amount
def jump(self):
self.jumping = True
def collision(self, sprites): # gère les collisions
for sprite in sprites:
if isinstance(sprite, Triangle):
if self.rect.colliderect(sprite.rect):
if self.rect.bottom <= sprite.rect.centery:
self.rect.bottom = sprite.rect.top
elif self.rect.top >= sprite.rect.centery:
# pygame.mixer.music.stop()
pygame.time.wait(1000)
quit()
else:
if self.rect.centerx < sprite.rect.centerx:
self.rect.right = sprite.rect.left
else:
self.rect.left = sprite.rect.right
elif isinstance(sprite, Rectangle):
if self.rect.colliderect(sprite.rect):
if self.rect.bottom <= sprite.rect.centery:
self.rect.bottom = sprite.rect.top
elif self.rect.top >= sprite.rect.centery:
# pygame.mixer.music.stop()
pygame.time.wait(1000)
quit()
else:
if self.rect.centerx < sprite.rect.centerx:
self.rect.right = sprite.rect.left
else:
self.rect.left = sprite.rect.right
elif isinstance(sprite, DoubleTriangle):
if self.rect.colliderect(sprite.rect):
if self.rect.bottom <= sprite.rect.centery:
self.rect.bottom = sprite.rect.top
elif self.rect.top >= sprite.rect.centery:
# pygame.mixer.music.stop()
pygame.time.wait(1000)
quit()
else:
if self.rect.centerx < sprite.rect.centerx:
self.rect.right = sprite.rect.left
elif isinstance(sprite, Plateforme):
if self.rect.colliderect(sprite.rect):
if self.rect.bottom <= sprite.rect.centery:
self.rect.bottom = sprite.rect.top
elif self.rect.top >= sprite.rect.centery:
# pygame.mixer.music.stop()
pygame.time.wait(1000)
quit()
else:
if self.rect.centerx < sprite.rect.centerx:
self.rect.right = sprite.rect.left
else:
self.rect.left = sprite.rect.right
# Retourne les sprites en collision avec le joueur
return tuple(s for s in sprites if s.rect.colliderect(self.rect))
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_SPACE] or keys[pygame.K_UP]:
self.jump()
if self.jumping:
step = -(0.05 * self.jump_count ** 2) * (70 / FPS)
if self.jump_count > 0:
step *= -1
self.rect.y -= step
self.jump_count -= 1
if self.rect.bottom >= self.y:
self.rect.bottom = self.y
self.jumping = False
self.jump_count = 20
else:
if self.rect.bottom < SOL_Y:
self.rect.bottom += 6 #simule le fait qu'il retombe d'une plateforme sinon il y reste
if score.score >= 10 and self.rect.bottom > 350:
self.rect.bottom = 350
"""c'est peut etre ca qu'il faut changer parce que y a marqué que si il est en dessous de 350, il retourne à 350 mais faut juste pas qu'il tombe en dessous de 350"""
class ProgressBar(pygame.sprite.Sprite):
def __init__(self, width, height, color):
super().__init__()
self.image = pygame.Surface((width, height), pygame.SRCALPHA).convert_alpha()
self.rect = self.image.get_rect()
self.color = color
self._percent = 0
def is_full(self):
return self._percent == 100
def increase(self, percent):
if self._percent == 100:
return
self._percent += percent
self._percent = min(100, self._percent)
width = self.rect.w / 100 * self._percent
pygame.draw.rect(self.image, self.color, (0, 0, width, self.rect.h))
# score
class ScoreBoard(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.x = x
self.y = y
self.score = 0
self.font = pygame.font.SysFont('Arial', 30) # police
self.color = (255, 255, 255)
self.image = self.font.render('0', True, self.color)
self.rect = self.image.get_rect()
self.rect.topright = x, y
self.last_update_time = time.time() # enregistre l'heure de la dernière mise à jour du score
def update1(self):
# Vérifie si 5 secondes se sont écoulées depuis la dernière mise à jour du score
current_time = time.time()
if current_time - self.last_update_time >= 5:
self.add(5) # Ajoute 5 points au score, qui augmente toutes les 5 secondes
self.last_update_time = current_time
def add(self, amount): # ajoute
self.score += amount
self.image = self.font.render(str(self.score), True, self.color)
self.rect = self.image.get_rect()
self.rect.topright = self.x, self.y
class Obstacle(pygame.sprite.Sprite): # classe pour les obstacles
def __init__(self, x, y, width, height):
super().__init__()
self.image = pygame.Surface((width, height), pygame.SRCALPHA)
self.rect = self.image.get_rect()
self.rect.bottomleft = x, y
def update(self):
self.rect.x -= 6
class Triangle(Obstacle):
def __init__(self, x, y):
super().__init__(x, y, 60, 60)
pygame.draw.polygon(self.image, (0, 255, 0), ((30, 0), (0, 60), (60, 60))) # formation du triangle
class Rectangle(Obstacle):
def __init__(self, x, y):
super().__init__(x, y, 70, 135)
pygame.draw.rect(self.image, (12, 48, 255), (5, 5, 130, 130))
class BasPlateforme(Obstacle):
def __init__(self, x, y):
super().__init__(x, y, 252, 60)
pygame.draw.rect(self.image, (88, 35, 255), (10, 10, 670, 50))
class DoubleTriangle(Obstacle):
def __init__(self, x, y):
super().__init__(x, y, 60, 60)
self.image = pygame.Surface((240, 60), pygame.SRCALPHA)
pygame.draw.polygon(self.image, (255, 255, 0), ((30, 0), (0, 60), (60, 60)))
pygame.draw.polygon(self.image, (255, 255, 0), ((90, 0), (60, 60), (120, 60)))
self.rect = self.image.get_rect()
self.rect.bottomleft = x, y
class Plateforme(Obstacle):
def __init__(self, x, y):
super().__init__(x, y, 187, 187)
pygame.draw.rect(self.image, (185, 235, 255), (10, 10, 670, 50))
# le spawn ; c'est une sorte de création en direct d'objets ou de personnages (ici ça va être les obstacles)
def obstacle_spawn():
# Choix de l'obstacle (tu choisis si tu veux plus de triangles ou de cercles)
obstacle_class = \
random.choices((Triangle, Rectangle, DoubleTriangle, Plateforme, BasPlateforme), (11, 14, 15, 14, 12))[0]
obstacle = obstacle_class(SCREEN_RECT.w, SOL_Y)
draw_group.add(obstacle)
obstacles_group.add(obstacle)
def spawn_timer():
ms = random.randrange(490, 750) # temps en millisecondes, determine le temps d'espace entre les obstacles
pygame.time.set_timer(EVENT_OBSTACLE_SPAWN, ms)
def sprites_clear(surface, rect):
surface.fill(SCREEN_COLOR, rect)
# application
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
SCREEN_RECT = screen.get_rect()
pygame.mouse.set_visible(False)
pygame.display.set_caption("Geo")
draw_group = pygame.sprite.RenderUpdates()
obstacles_group = pygame.sprite.Group()
player = Player(100, SOL_Y)
draw_group.add(player)
sol = Sol(SOL_Y)
draw_group.add(sol)
score = ScoreBoard(SCREEN_RECT.right - 10, 10) # position ou y aura le score sur l'écran
score.update()
draw_group.add(score)
progress_bar = ProgressBar(BAR_WIDTH, BAR_HEIGHT, (0, 255, 0))
progress_bar.rect.topleft = 0, 0
draw_group.add(progress_bar)
screen.fill(SCREEN_COLOR)
pygame.display.update()
clock = pygame.time.Clock()
running = True
points = 0
spawn_timer()
pygame.time.set_timer(EVENT_PROGRESS_BAR, 100)
all_sprites = pygame.sprite.Group()
# boucle principale
while running:
clock.tick(FPS)
score.update1()
screen.blit(score.image, score.rect)
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP or pygame.K_SPACE and not player.jumping: # touches pour sauter
player.jump()
elif event.type == EVENT_OBSTACLE_SPAWN: # generations obstacles
obstacle_spawn()
spawn_timer()
draw_group.remove(player)
draw_group.add(player)
elif event.type == EVENT_PROGRESS_BAR:
progress_bar.increase(0.5)
elif event.type == pygame.QUIT:
running = False
# Vérification de la collision entre le joueur et la plateforme
on_platform = False
for obstacle in obstacles_group:
if isinstance(obstacle, Plateforme) and player.rect.colliderect(obstacle.rect):
if player.rect.bottom <= obstacle.rect.bottom:
player.rect.bottom = obstacle.rect.top
player.jumping = False
player.jump_count = 21
on_platform = True
on_platform = False
for obstacle in obstacles_group:
if isinstance(obstacle, BasPlateforme) and player.rect.colliderect(obstacle.rect):
if player.rect.bottom <= obstacle.rect.bottom:
player.rect.bottom = obstacle.rect.top
player.jumping = False
player.jump_count = 21
on_platform = True
on_platform = False
for obstacle in obstacles_group:
if isinstance(obstacle, Rectangle) and player.rect.colliderect(obstacle.rect):
if player.rect.bottom <= obstacle.rect.bottom:
player.rect.bottom = obstacle.rect.top
player.jumping = False
player.jump_count = 21
on_platform = True
# Collision obstacles avec le joueur
for sprite in player.collision(obstacles_group.sprites()):
obstacles_group.remove(sprite)
draw_group.remove(sprite)
# Suppression des sprites hors écran
for sprite in obstacles_group.copy().sprites():
if sprite.rect.right < SCREEN_RECT.x:
obstacles_group.remove(sprite)
draw_group.remove(sprite)
if score.score >= 10:
SOL_Y = 350
draw_group.clear(screen, sprites_clear)
draw_group.update()
rects = draw_group.draw(screen)
pygame.display.update(rects)
pygame.display.flip()
pygame.quit()
- Sol sur pygame
- Sol - Guide
- Note clé de sol - Télécharger - Création musicale
- Piscine hors-sol - Guide
- Geometry dash pygame ✓ - Forum Python
- Symbole clé de sol word - Forum Réseaux sociaux
1 réponse
Salut,
Lorsque tu présentes du code, assure-toi au moins que ce soit visualisable, si on lance ton script, on a à peine le temps de voir quelque chose que la fenêtre se ferme directement.
J''imagine que seules les formes planes seront lesquelles où le joueur pourra se déplacer, donc il faut en 1er lieu ajouter un attribut (walkable dans le code) à la classe obstacle, ainsi lorsque le joueur tombera, il pourra se réceptionner sur ces surfaces.
Idem pour les obstacles que peuvent percuter le joueur, peuvent-ils tous le faire ? Un autre attribut (solid dans le code) pourrait s'avérer nécessaire afin de le savoir.
Sachant que le joueur doit avoir connaissance des éléments qui l'entourent, donc des surfaces “ walkable ”, on peut lui fournir dans l'instance du joueur en fourrant cela dans un groupe pygame (bien plus simple à gérer).
Pour faciliter la détection que le joueur est sur un sol, on peut se créer un autre Rect sous le joueur, et s'en servir pour détecter les collisions avec les sols.
Pourquoi ne pas avoir gardé la modification avec la mise à jour du score ?
Voici un code gérant les sauts et chutes du joueur, il y aurait encore des choses à peaufiner et revoir, mais le principe est là, je suis parti du précédent code que je t'avais exposé dans ton sujet précédent.
Il y a aussi désormais une classe gérant l'application.
import random
import pygame
FPS = 60
# Ajustement de la gravité en fonction de l'IPS
GRAVITY = 0.38 * (60 / FPS) ** 2
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
SCREEN_COLOR = 120, 170, 255
GROUND_Y = 550
PLAYER_COLOR = 255, 255, 255
BAR_WIDTH = 800
BAR_HEIGHT = 30
EVENT_OBSTACLE_SPAWN = pygame.USEREVENT
EVENT_SCORE_UPDATE = pygame.USEREVENT + 1
EVENT_PROGRESS_BAR = pygame.USEREVENT + 2
class Ground(pygame.sprite.Sprite):
def __init__(self, y):
super().__init__()
self.image = pygame.Surface((SCREEN_WIDTH, 100))
self.image.fill((100, 200, 80))
self.rect = self.image.get_rect()
self.rect.topleft = 0, y
class Player(pygame.sprite.Sprite):
def __init__(self, x, y, walkable_group):
super().__init__()
self.image = pygame.Surface((30, 30))
self.image.fill(PLAYER_COLOR)
self.rect = self.image.get_rect()
self.rect.bottomleft = x, y
self._walkable_group = walkable_group
self.x = x
self.y = y
# Création d'un rectangle d'1 px de haut situé sous le joueur
# dont on se servira pour déterminer si le joueur est sur une surface
# sur laquelle il peut se mouvoir
self._sub_rect = pygame.Rect(self.rect.x, self.rect.bottom, self.rect.w, 1)
self._jumping = False
self._falling = False
# Nombre d'étape max. du saut (ne pas toucher)
self._vertical_step = 30 / 60 * FPS
self._falling_step = 0
self._gravity = GRAVITY
def on_solid_surface(self):
# Détermine si le joueur est sur un sol
# mise à jour de la position y du « sous » rectangle
self._sub_rect.top = self.rect.bottom
rects = tuple(sprite.rect for sprite in self._walkable_group)
# collidelist retourne -1 si aucune collision parmi les rect. fournis
# ou l'indice du 1er rect. en collision de la liste fournie
return not self._sub_rect.collidelist(rects) == -1
def jump(self):
if not self._jumping and not self._falling:
self._jumping_step = self._vertical_step
self._jumping = True
def collide(self, sprites):
return tuple(s for s in sprites if s.rect.colliderect(self.rect))
def update(self):
if self._jumping:
self.rect.y -= self._jumping_step * self._gravity
self._jumping_step -= 1
if not self._jumping_step:
self._jumping = False
self._falling = True
self._falling_step = 0
elif self._falling:
self.rect.y += self._falling_step * self._gravity
if self.on_solid_surface():
self._falling = False
# Ajustement de la position du joueur sur la surface en contact
rects = tuple(s.rect for s in self._walkable_group)
i = self._sub_rect.collidelist(rects)
rect = rects[i]
self.rect.bottom = rect.top
self._falling_step = min(self._vertical_step, self._falling_step + 1)
else:
if not self.on_solid_surface():
# Donc, le joueur tombe sans avoir sauté, on le fait rechuter
self._falling = True
self._falling_step = 0
jumping = property(lambda self: self._jumping)
class ScoreBoard(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.x = x
self.y = y
self.score = 0
self.font = pygame.font.SysFont('Arial', 30)
self.color = (255, 255, 255)
self.image = self.font.render('0', True, self.color)
self.rect = self.image.get_rect()
self.rect.topright = x, y
def add(self, amount):
self.score += amount
self.image = self.font.render(str(self.score), True, self.color)
self.rect = self.image.get_rect()
self.rect.topright = self.x, self.y
class Obstacle(pygame.sprite.Sprite):
def __init__(self, x, y, width, height):
super().__init__()
self.image = pygame.Surface((width, height), pygame.SRCALPHA)
self.rect = self.image.get_rect()
self.rect.bottomleft = x, y
self.walkable = False # spécifie que le joueur peut se mouvoir dessus
self.solid = False # spécifie que le joueur entrera en contact avec lui
def update(self):
self.rect.x -= 6
class Cercle(Obstacle):
def __init__(self, x, y):
super().__init__(x, y, 60, 60) # position du cercle sur l'écran
pygame.draw.circle(self.image, (0, 155, 155), (30, 30), 30)
class Triangle(Obstacle):
def __init__(self, x, y):
super().__init__(x, y, 60, 60)
pygame.draw.polygon(self.image, (0, 255, 0), ((30, 0), (0, 60), (60, 60)))
self.solid = True
class Rectangle(Obstacle):
def __init__(self, x, y):
# XXX Aucun intérêt de créer un rect, l'image EST un rectangle
# d'autant que ça va poser un problème avec les collisions d'avoir une image
# bien plus grande que ce qui est visualisable.
# super().__init__(x, y, 70, 135)
# pygame.draw.rect(self.image, (12, 48, 255), (5, 5, 130, 130))
super().__init__(x, y, 70, 130)
self.image.fill((12, 48, 255))
self.walkable = True
class BasPlateforme(Obstacle):
def __init__(self, x, y):
# XXX Idem qu'au-dessus
# super().__init__(x, y, 252, 60)
# pygame.draw.rect(self.image, (88, 35, 255), (10, 10, 670, 50))
super().__init__(x, y, 250, 60)
self.image.fill((88, 35, 255))
self.walkable = True
class DoubleTriangle(Obstacle):
def __init__(self, x, y):
super().__init__(x, y, 120, 60)
pygame.draw.polygon(self.image, (255, 255, 0), ((30, 0), (0, 60), (60, 60)))
pygame.draw.polygon(self.image, (255, 255, 0), ((90, 0), (60, 60), (120, 60)))
self.rect = self.image.get_rect()
self.rect.bottomleft = x, y
self.solid = True
class Plateforme(Obstacle):
def __init__(self, x, y):
# XXX Idem que pour Rectangle
# super().__init__(x, y, 187, 187)
# pygame.draw.rect(self.image, (185, 235, 255), (10, 10, 670, 50))
# TODO voir pour mettre la position y exacte à l'instance plutôt qu'ici
super().__init__(x, y - 80, 187, 45)
self.image.fill((185, 235, 255))
self.walkable = True
class ProgressBar(pygame.sprite.Sprite):
def __init__(self, width, height, color):
super().__init__()
self.image = pygame.Surface((width, height), pygame.SRCALPHA).convert_alpha()
self.rect = self.image.get_rect()
self.color = color
self._percent = 0
def is_full(self):
return self._percent == 100
def increase(self, percent):
if self._percent == 100:
return
self._percent += percent
self._percent = min(100, self._percent)
width = self.rect.w / 100 * self._percent
pygame.draw.rect(self.image, self.color, (0, 0, width, self.rect.h))
class Button(pygame.sprite.Sprite):
def __init__(self, width, height, text, font, command):
super().__init__()
self.image = pygame.Surface((width, height)).convert()
self.rect = self.image.get_rect()
self.image.fill((125, 20, 200))
self._text = font.render(text.upper(), True, (255, 255, 255))
self.image.blit(self._text, self._text.get_rect(center=self.rect.center))
self._command = command
self._focus = False
def call(self):
self._command()
@property
def focus(self):
return self._focus
focus.setter
def focus(self, bool_):
assert bool_ in (0, 1)
[self.focus_out, self.focus_in][bool_]()
def focus_in(self):
if self._focus:
return
self._focus = True
pygame.draw.rect(self.image, (255, 255, 0), (0, 0, *self.rect.size), 5)
def focus_out(self):
if not self._focus:
return
self._focus = False
pygame.draw.rect(self.image, (125, 20, 200), (0, 0, *self.rect.size), 5)
class Menu:
def __init__(self, group):
self._group = group
self._font = pygame.font.SysFont('mono', 24, True)
self._buttons = []
self._focus_button = 0
def add_button(self, text, command):
button = Button(300, 60, text, self._font, command)
self._buttons.append(button)
def display(self):
rect = self._buttons[0].rect
bt_len = len(self._buttons)
x = (SCREEN_WIDTH - rect.w) / 2
y = SCREEN_HEIGHT - rect.h * bt_len - 50 * (bt_len - 1)
y /= 2
for button in self._buttons:
button.rect.topleft = x, y
y += rect.h + 70
self._group.add(self._buttons)
self._buttons[0].focus(True)
def update(self, events):
for evt in events:
if evt.type == pygame.KEYDOWN:
if evt.key == pygame.K_TAB:
self._buttons[self._focus_button].focus_out()
# Si une touche maj. n'est pas pressée
if not evt.mod & pygame.KMOD_SHIFT:
self._focus_button += 1
try:
self._buttons[self._focus_button].focus_in()
except IndexError:
self._focus_button = 0
self._buttons[self._focus_button].focus_in()
else:
self._focus_button -= 1
try:
self._buttons[self._focus_button].focus_in()
except IndexError:
self._focus_button = -1
self._buttons[self._focus_button].focus_in()
elif evt.key == pygame.K_RETURN:
self._buttons[self._focus_button].call()
class Game:
def __init__(self, group):
self.group = group
self.obstacle_group = pygame.sprite.Group()
# Groupe des surfaces parcourables que l'on passe au joueur
self.walkable_group = pygame.sprite.Group()
# Groupe des surfaces qui peuvent enter en contact avec le joueur
self.solid_group = pygame.sprite.Group()
self.player = Player(100, 0, self.walkable_group)
self.ground = Ground(GROUND_Y)
self.score = ScoreBoard(SCREEN_WIDTH - 10, 10)
self.progress_bar = ProgressBar(BAR_WIDTH, BAR_HEIGHT, (255, 165, 0, 128))
self.progress_bar.rect.topleft = 0, 0
self.group.add(self.ground, self.score, self.progress_bar, self.player)
# Ajout du sol dans ce group
self.walkable_group.add(self.ground)
self._obstacle_spawn_timer()
pygame.time.set_timer(EVENT_SCORE_UPDATE, 5000)
pygame.time.set_timer(EVENT_PROGRESS_BAR, 100)
def _obstacle_spawn_timer(self, ms=-1):
if ms == -1:
# ms = random.randrange(490, 750)
ms = random.randrange(1800, 2500)
pygame.time.set_timer(EVENT_OBSTACLE_SPAWN, ms)
def obstacle_spawn(self):
obstacle_class = random.choices(
(Cercle, Triangle, Rectangle, DoubleTriangle, Plateforme, BasPlateforme),
# (Plateforme, BasPlateforme),
(5, 8, 7, 8, 9, 8),
# (5, 8),
)[0]
obstacle = obstacle_class(SCREEN_WIDTH, GROUND_Y)
self.group.add(obstacle)
self.obstacle_group.add(obstacle)
if obstacle.solid:
self.solid_group.add(obstacle)
if obstacle.walkable:
self.walkable_group.add(obstacle)
def update(self, events):
for event in events:
if event.type == pygame.KEYDOWN:
# On ne fait pas : truc == machin or bidule
# mais : truc == machin or truc == bidule
# ou plus simplement avec un tuple comme ci-dessous
if event.key in (pygame.K_UP, pygame.K_SPACE):
self.player.jump()
elif event.type == EVENT_OBSTACLE_SPAWN:
self.obstacle_spawn()
self._obstacle_spawn_timer()
elif event.type == EVENT_SCORE_UPDATE:
self.score.add(5)
elif event.type == EVENT_PROGRESS_BAR:
self.progress_bar.increase(0.1)
if self.progress_bar.is_full():
print('progression réussie !')
# Annulation du timer (mise à 0 des ms)
pygame.time.set_timer(EVENT_PROGRESS_BAR, 0)
# Faire ce qu'il y a à faire.
# Par exemple, arrêt des autres animations
self._obstacle_spawn_timer(0)
pygame.time.set_timer(EVENT_SCORE_UPDATE, 0)
# Collision obstacles dur avec le joueur
for sprite in self.player.collide(self.solid_group):
# suppression du sprite de tous les groupes
sprite.kill()
# Suppression des sprites hors écran
for sprite in self.obstacle_group.sprites():
if sprite.rect.right < 0:
sprite.kill()
class Application:
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
# pygame.mouse.set_visible(False)
pygame.display.set_caption("Geo")
self.clock = pygame.time.Clock()
self.draw_group = pygame.sprite.RenderUpdates()
self.running = True
def _sprites_clear(self, surface, rect):
surface.fill(SCREEN_COLOR, rect)
def menu(self):
self.draw_group.empty()
self.interface = Menu(self.draw_group)
self.interface.add_button("JOUER", self.play)
self.interface.add_button("OPTIONS", lambda: print("à réaliser"))
self.interface.add_button("QUITTER", self.quit)
self.interface.display()
def play(self):
self.draw_group.empty()
self.interface = Game(self.draw_group)
def quit(self):
print("À la prochaine !")
self.running = False
def run(self):
self.screen.fill(SCREEN_COLOR)
pygame.display.update()
while self.running:
self.clock.tick(FPS)
events = pygame.event.get()
for evt in events:
if evt.type == pygame.QUIT:
return self.quit()
self.interface.update(events)
self.draw_group.clear(self.screen, self._sprites_clear)
self.draw_group.update()
rects = self.draw_group.draw(self.screen)
pygame.display.update(rects)
pygame.quit()
if __name__ == '__main__':
app = Application()
app.menu()
app.run()
Touche TAB (et MAJ) pour sélectionner, ENTRÉE pour lancer le jeu.