Bonjour, je suis en train de coder un jeu, le but est assez simple, taper sur une bulle quand celle-ci apparait puis quand cette bulle est tapée une autre apparait et on doit taper sur celle ci et ainsi de suite, je rencontre un problème, voici mon code entier :
import pygame
import random, time, os
from pygame.locals import *
#éléments importés
logo = pygame.image.load("assets/logo1.1.png")
bg = pygame.image.load("assets/galaxie-30067.jpg")
a1 = pygame.image.load("assets/accueil1_1.png")
bulle = pygame.image.load("assets/bulle.png")
bulle_rect = bulle.get_rect()
pygame.init()
clock = pygame.time.Clock()
font = pygame.font.Font(None , 64)
blue = pygame.Color("white")
orig_surf = font.render('Appuyez sur espace pour jouer', True, blue)
txt_surf = orig_surf.copy()
alpha_surf = pygame.Surface(txt_surf.get_size(), pygame.SRCALPHA)
alpha = 0
fade_in = True
#générer la fenêtre
pygame.display.set_caption("Pygo")
screen = pygame.display.set_mode((1200,800), RESIZABLE)
running = True
while running:
for event in pygame.event.get():
# evenement est fermeture de fenêtre
if event.type == pygame.QUIT:
running = False
pygame.quit()
# début du jeu
elif event.type == KEYDOWN:
if event.key == pygame.K_SPACE:
print("space")
while 1 < 2:
screen.blit(bg, (0, 0))
pygame.display.flip()
#position du x
xbulle = random.randint(1, 1100)
print(xbulle)
#position du y
ybulle = random.randint(1, 700)
print(ybulle)
#apparition de la bulle
bulle_rect.x = xbulle
bulle_rect.y = ybulle
screen.blit(bulle, bulle_rect)
pygame.display.flip()
for event in pygame.event.get():
if event.type == MOUSEBUTTONDOWN:
if event.button == 1:
if bulle_rect.collidepoint(event.pos):
print("touché")
else:
print("raté")
else:
print("raté")
# evenement est fermeture de fenêtre
if event.type == pygame.QUIT:
running = False
pygame.quit()
#opacité
if alpha >= 0 and fade_in is True:
alpha += 5
if alpha >= 255:
alpha = 255
fade_in = False
#opacité
if alpha <= 255 and fade_in is False:
alpha -= 5
if alpha <= 0:
alpha = 0
fade_in = True
#affichage du texte + du fond d'écran d'accueil
txt_surf = orig_surf.copy()
alpha_surf.fill((255, 255, 255, alpha))
txt_surf.blit(alpha_surf, (0, 0), special_flags=pygame.BLEND_RGBA_MULT)
screen.blit(a1, (0, 0))
screen.blit(txt_surf, (280, 725))
pygame.display.flip()
en fait a partir du "while 1 < 2" je ne contrôle plus mon programme, une bulle apparait puis disparait puis une autre apparait et ainsi de suite, tout ça a la suite, je voudrais savoir si il y a un moyen pour "mettre pause le programme" jusqu'a ce que je touche la bulle, je ne sais pas si je suis très clair, je l'espère, merci d'avance
pour quelle raison ça pourrait être le cas ? ta boucle for event in pygame.event.get() ne va gérer des événements que si il y en a eu, si il n'y en a pas, on sort du for, et donc on poursuit le programme (ici on revient au début du while)
j'ai tout lu, la dernière fois aussi j'avais lu mais je ne devais pas être super concentré mais j'ai un problème voici mon code :
while a < b:
screen.blit(bg, (0, 0))
pygame.display.flip()
#position du x
xbulle = random.randint(1, 1100)
print(xbulle)
#position du y
ybulle = random.randint(1, 700)
print(ybulle)
#apparition de la bulle
bulle_rect.x = xbulle
bulle_rect.y = ybulle
screen.blit(bulle, bulle_rect)
pygame.display.flip()
event1 = pygame.event.wait()
if event1.type == MOUSEBUTTONDOWN:
if event.button == 1:
if bulle_rect.collidepoint(event.pos):
print("touché")
else:
print("raté")
else:
print("raté")
else:
print("raté")
en fait rien qu'un mouvement de souris c'est compté comme "raté", hors pour toucher la petite bulle il faut déplacer sa souris, mais je ne comprends pas
le déplacement de la souris c'est un événement aussi; le "raté ne devrait apparaitre que lors du clic et bulle non touchée, et pas dans les autres événements
voir ton autre sujet, ici le event.wait() attend un événement; une fois traité, on va début de la boucle. peut-être revoir les bases (des boucles et des conditions en particulier) comme on te l'a suggéré plusieurs fois
c'est pas ça le problème mes bases je les connais et je sais ce que c'est une boucle et des conditions, et je sais que quand mon code est fini ça revient a mon while, mais le problème est que je ne comprends pas pourquoi ça revient au while alors que j'ai précisé (maintenant) que pour revenir au while il faut un clic gauche dans le cercle
import pygame
import random, time, os
from pygame.locals import *
#éléments importés
logo = pygame.image.load("assets/logo1.1.png")
bg = pygame.image.load("assets/galaxie-30067.jpg")
a1 = pygame.image.load("assets/accueil1_1.png")
bulle = pygame.image.load("assets/bulle.png")
bulle_rect = bulle.get_rect()
pygame.init()
clock = pygame.time.Clock()
font = pygame.font.Font(None , 64)
blue = pygame.Color("white")
orig_surf = font.render('Appuyez sur espace pour jouer', True, blue)
txt_surf = orig_surf.copy()
alpha_surf = pygame.Surface(txt_surf.get_size(), pygame.SRCALPHA)
alpha = 0
fade_in = True
#générer la fenêtre
pygame.display.set_caption("Pygo")
screen = pygame.display.set_mode((1200,800), RESIZABLE)
running = True
while running:
for event in pygame.event.get():
# evenement est fermeture de fenêtre
if event.type == pygame.QUIT:
running = False
pygame.quit()
# début du jeu
elif event.type == KEYDOWN:
if event.key == pygame.K_SPACE:
print("space")
a = 1
b = 3
while a < b:
screen.blit(bg, (0, 0))
pygame.display.flip()
#position du x
xbulle = random.randint(1, 1100)
print(xbulle)
#position du y
ybulle = random.randint(1, 700)
print(ybulle)
#apparition de la bulle
bulle_rect.x = xbulle
bulle_rect.y = ybulle
screen.blit(bulle, bulle_rect)
pygame.display.flip()
event1 = pygame.event.wait()
if event1.type == MOUSEBUTTONDOWN:
if event.button == 1:
if bulle_rect.collidepoint(event.pos):
print("touché")
else:
print("raté")
running = False
pygame.quit()
else:
print("raté")
running = False
pygame.quit()
# evenement est fermeture de fenêtre
if event.type == pygame.QUIT:
running = False
pygame.quit()
#opacité
if alpha >= 0 and fade_in is True:
alpha += 5
if alpha >= 255:
alpha = 255
fade_in = False
#opacité
if alpha <= 255 and fade_in is False:
alpha -= 5
if alpha <= 0:
alpha = 0
fade_in = True
#affichage du texte + du fond d'écran d'accueil
txt_surf = orig_surf.copy()
alpha_surf.fill((255, 255, 255, alpha))
txt_surf.blit(alpha_surf, (0, 0), special_flags=pygame.BLEND_RGBA_MULT)
screen.blit(a1, (0, 0))
screen.blit(txt_surf, (280, 725))
pygame.display.flip()
c'est pas ça le problème mes bases je les connais et je sais ce que c'est une boucle et des conditions, et je sais que quand mon code est fini ça revient a mon while, mais le problème est que je ne comprends pas pourquoi ça revient au while alors que j'ai précisé (maintenant) que pour revenir au while il faut un clic gauche dans le cercle
Mais ce n'est pas ce que tu fais..... ce que tu fais: tu attends un évènement (ligne 67), tu le traites (ligne 68 et suivantes), tu continues (donc retour au début du while)
je ne comprends pas bien... voilà mon code, le problème est que n'importe quelle action que je fais ça revient au while alors que j'ai pourtant préciser qu'il fallait un clique gauche et dans le rond...
while a < b:
screen.blit(bg, (0, 0))
pygame.display.flip()
#position du x
xbulle = random.randint(1, 1100)
print(xbulle)
#position du y
ybulle = random.randint(1, 700)
print(ybulle)
#apparition de la bulle
bulle_rect.x = xbulle
bulle_rect.y = ybulle
screen.blit(bulle, bulle_rect)
pygame.display.flip()
event1 = pygame.event.wait()
if event1.type == MOUSEBUTTONDOWN:
if event1.button == 1:
if bulle_rect.collidepoint(event1.pos):
print("touché")
else:
print("raté2")
running = False
pygame.quit()
C'est progressif et il y a la base. Tu peux faire des aller-retours si tu veux.
Le tuto provient du site de pygame.
import pygame as pg
from random import randint
pg.init()
clock = pg.time.Clock()
fps = 60
width = 640
height = 480
left_click = 1 # button 1 est le clic gauche
window = pg.display.set_mode((width,height))
blue = 0,0,255
fill_color = (128,128,128)
running = True
square_size = 20
x = randint(0,width-square_size)
y = randint(0,height-square_size)
square = pg.draw.rect(window, (blue), (x,y,square_size,square_size))
pg.display.update()
while running:
for event in pg.event.get():
if event.type == pg.QUIT:
running = False
elif event.type == pg.MOUSEBUTTONDOWN:
if event.button == left_click: # button 1 est le clic gauche
if square.collidepoint(event.pos):
print("inside")
x = randint(0,width-square_size)
y = randint(0,height-square_size)
else:
print("outside")
else:
print("wrong button !")
window.fill(fill_color)
square = pg.draw.rect(window, (blue), (x,y,square_size,square_size))
pg.display.update()
clock.tick(fps)
pg.quit()
Voici ce que j'ai fait. Dans mon jeu, on clique gauche sur le carré, on indique qu'on a cliqué à l'intérieur et le carré change de place, sinon, on indique si on a cliqué à l'extérieur ou avec le mauvais clic.
Mon jeu est testable car il n'y a pas d'image comme dans ton code. Règle d'or : quand on demande de l'aide, on propose un code testable sans contrainte. Une image n'est pas indispensable, elle est remplaçable par une forme géométrique (carré, rectangle, ...).
- Edité par CristianoRolando 24 juillet 2021 à 3:10:27
je ne comprends pas bien... voilà mon code, le problème est que n'importe quelle action que je fais ça revient au while alors que j'ai pourtant préciser qu'il fallait un clique gauche et dans le rond...
while a < b:
...
pygame.display.flip()
event1 = pygame.event.wait()
if event1.type == MOUSEBUTTONDOWN:
if event1.button == 1:
if bulle_rect.collidepoint(event1.pos):
print("touché")
else:
print("raté2")
running = False
pygame.quit()
- Edité par HugoCam__ 23 juillet 2021 à 20:11:17
Non tu ne précises pas qu'il faut un clic gauche dans le rond pour revenir au début.
"event1 = pygame.event.wait()" attend un événement (n'importe lequel)
le code qui suit cette attente teste l'événement si il correspond à ce que l'on veut, si c'est le cas, on fait les actions correspondantes; sinon bah, on poursuit.
Pygame, attendre qu'un événement se produise
× 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.
en fait a partir du "while 1 < 2" je ne contrôle plus mon programme, une bulle apparait puis disparait puis une autre apparait et ainsi de suite, tout ça a la suite, je voudrais savoir si il y a un moyen pour "mettre pause le programme" jusqu'a ce que je touche la bulle, je ne sais pas si je suis très clair, je l'espère, merci d'avance
Python c'est bon, mangez-en.
en fait rien qu'un mouvement de souris c'est compté comme "raté", hors pour toucher la petite bulle il faut déplacer sa souris, mais je ne comprends pas
Python c'est bon, mangez-en.