Bonjour, je suis en train de coder un mini-jeu, j'ai fais l'écran titre et y est insérer des bouton (jouer et quitter). Cependant quand je clic sur le bouton rien ne se passe (j'ai bien su gérer le fait que la souris rentre dans la zone "bouton" mais le clique ne fonctionne pas). Si une âme charitable saurais m'aider
import pygame
from pygame.locals import *
from constants import *
"""Classe permettant de charger une map ou un ecran quelconque"""
class Load():
def __init__(self, window):
"""Initialisation"""
self.window = window # On récupère le contenu de window dans la classe pour pouvoir l'utiliser ici.
self.in_button = in_button
def load(self, screen):
"""On affiche en fonction de la demande"""
if screen == "title":
#Si on cherche à afficher l'écran titre
screen = pygame.image.load('ressources/screen_title.bmp').convert()
#On affiche deux boutons (jouer et quitter)
btn_play = pygame.image.load('ressources/btn.bmp').convert()
# On affiche ensuite le texte sur le bouton
font = pygame.font.Font('font_title.ttf', 36)
text_play = font.render('Jouer', True, (255,255,255))
text_playpos = text_play.get_rect()
text_playpos.x = WINDOW_W/2 - 100 #On le position sur le meme axe x que le bouton mais on divise pas 2 et on enleve 100 de nouveau fois pour etre bien dedans
text_playpos.y = WINDOW_H/2 + 5 #On ajoute 5 px pour etre bien centrer dans le bouton
btn_quit = pygame.image.load('ressources/btn.bmp').convert()
# Pareil que au dessus, on affiche le texte du bouton
text_quit = font.render('Quitter', True, (255,100,100))
text_quitpos = text_quit.get_rect()
text_quitpos.x = WINDOW_W/2 - 100
text_quitpos.y = WINDOW_H/2 + 65 # On ajoute 60 pour ne pas etre a cheval sur l'autre texte
# On blit le tout
self.window.blit(screen, (0,0))
self.window.blit(btn_play, (WINDOW_W/2/2, WINDOW_H/2)) # On divise par deux la largeur de la fenetre et on redivise par deux pour ne pas etre trop au milieu
self.window.blit(btn_quit, (WINDOW_W/2/2, WINDOW_H/2 + 60)) #On ajoute qui correspond à la taille d'un bouton + 10px
self.window.blit(text_play, text_playpos)
self.window.blit(text_quit, text_quitpos)
# Maintenant qu'on l'écran titre est afficher, on va permettre que l'utilisateur puissent intergire avec
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
quit()
if event.type == MOUSEMOTION:
# On commence par le bouton jouer
if event.pos[0] > WINDOW_W/2/2 and event.pos[0] < WINDOW_W/2/2 + 500:
if event.pos[1] > WINDOW_H/2 and event.pos[1] < WINDOW_H/2+50:
self.in_button = True
print('dans le boutton')
# Nous permet de savoir si on se trouve dans le bouton ou pas
if self.in_button == True and event.type == MOUSEBUTTONUP and event.button == 1:
print('Jouer')
#print(event.button)
print(self.in_button)
En fait, le plus facile serait de prendre les méthodes déjà inclus par pygame.
Avec le rectangle (de la surface), vous pouvez détecter, tout ce qui touche ce rectangle.
Grâce à:
## Charge l'image
image = pygame.image.load('my_img.jpg')
## Trouve son rectangle
son_rectangle = image.get_rect()
## Détecte axes du curseur.
x, y = pygame.mouse.get_pos()
## Détecte collision entre un rectangle et le curseur
collide = son_rectangle.collidepoint(x, y)
if collide:
...
## Détecte les cliques de souris.
pressed = pygame.mouse.get_pressed()
Exemple:
import pygame
pygame.init()
## A MODIFIER..
fenetre = pygame.display.set_mode((300,300))
## Bouton (la surface)
image_bouton = pygame.image.load('ressources/btn.bmp').convert()
## Son rectangle
image_bouton_rect = image_bouton.get_rect()
RUNNING = True
while RUNNING:
## BLIT/FILL
fenetre.fill( (255,255,255) )
fenetre.blit(image_bouton, (50, 50))
## EVENTS
for event in pygame.event.get():
if event.type == pygame.QUIT:
RUNNING = False
## Si le curseur de la souris est dans la fenêtre, (si curseur sort de la fenêtre = False)
if pygame.mouse.get_focused():
## Trouve sa position:
x, y = pygame.mouse.get_pos()
## Detecte si l'axe X et Y de la souris, touche le rectangle de l'image
collide = image_bouton_rect.collidepoint(x, y)
if collide:
print('Oui, curseur sur le bouton..')
## Detecte, les cliques de souris.
pressed = pygame.mouse.get_pressed()
## Si clique de GAUCHE.
if pressed[0]: ## 0 = Gauche, 1 = Milieu, 2 = Droite
RUNNING = False
##
pygame.display.flip()
pygame.quit()
Vous remarquerez, que dans l'Exemple, l'image est chargé avant la boucle WHILE. Tandis que vous, vous chargez votre image à chaque itération de la boucle. De plus, vous charger deux fois la même image..
Vous pouvez très bien faire ceci (Chargez l'image au début, ensuite, vous blit à 4 endroits.):
image_bouton = pygame.image.load('ressources/btn.bmp').convert()
image_bouton_rect = image_bouton.get_rect()
## Placer la même image, à 4 places différentes.
while True:
fenetre.blit(image_bouton, (30, 30))
fenetre.blit(image_bouton, (130, 130))
fenetre.blit(image_bouton, (230, 230))
fenetre.blit(image_bouton, (330, 330))
Pour finir, le clavier et la souris ont sensiblement les mêmes méthodes.
import pygame
## Détecte les touches de clavier
pressed = pygame.key.get_pressed()
if pressed[pygame.K_UP]: ## Haut..
...
if pressed[pygame.K_DOWN]: ## Bas..
...
J'espère que cela vous aideras.
Voilà, bonne chance.
A+
- Edité par nolimitech 13 septembre 2017 à 5:13:09
Merci pour cette réponse très détailler et hautement interessente. C'est une grande aide
Nooooooooooooooooooooooooooooooooooooooooon !!
Evenement à la souris
× 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.