Partage

Evenement à la souris

Sujet résolu
12 septembre 2017 à 9:03:34

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)



Nooooooooooooooooooooooooooooooooooooooooon !!
13 septembre 2017 à 5:05:00

Salut,

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

14 septembre 2017 à 11:15:48

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é.
  • Editeur
  • Markdown