Besoin d'aide sur Kivy

Résolu/Fermé
Gerard.isa Messages postés 100 Date d'inscription samedi 24 septembre 2016 Statut Membre Dernière intervention 14 mars 2024 - Modifié le 29 nov. 2018 à 18:56
Gerard.isa Messages postés 100 Date d'inscription samedi 24 septembre 2016 Statut Membre Dernière intervention 14 mars 2024 - 3 déc. 2018 à 01:02
Bonjour,
Je débute en Python/Kivy et j'ai voulu créer un petit jeu pour enfant.
Je récupéré un un jeu pris sur internet et j'essaie de l'adapter.
J'ai réussi à faire quelque chose qui fonctionne mais pas exactement comme je voudrai.
Le jeu consiste à attraper avec la souris des formes géométriques et les déplacer au bon endroit sur une voiture.
J'ai choisi la bibliothèque Kivy car j'espère pouvoir porter le jeu sur tablette tactile.

Le problème que je rencontre à présent:
Lorsqu'une forme est sélectionnée et qu'on la déplace, si celle-ci touche une autre forme alors la forme sélectionnée devient celle qu'on vient de toucher.
J'ai compris que cela était du à la logique que j'ai mis en place.
Pour modifier ce comportement j'ai besoin de savoir comment tester :

- si le bouton gauche de la souris est appuyé
- si la souris a touché une des formes (triangle, demi-cercle, hexagone)
- si le bouton gauche est relevé

Je m'y perd avec tous ces "on_touch-down", "on_touch_move", " MotionEvent" etc...
La doc déjà qu'elle est en Anglais, je la trouve beaucoup moins compréhensible que celle de Pygame (j'avais commencé par là).
J'ai passé plusieurs jours à décortiquer des exemples et tutos mais là je bloque.
Si quelqu'un veut bien m'aider à passer cette étape...
Au cas où, voici le code:
#Jeu_Car06
# coding: utf-8
from kivy.app import App
from kivy.core.window import Window
from kivy.core.window import WindowBase
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.image import Image
from kivy.graphics import Rectangle
from kivy.uix.widget import Widget
 
class Voiture(Widget):
    def __init__(self,canvas):
        self.canvas=canvas
        #Taille et position:
        self.size=(Window.size[0]*0.4,Window.size[1]*0.4)
        self.pos=(0,Window.size[1]*0.02)
        #Ajout de l'image
        CheminImageVoiture = "Z:\\Projet Jeu\\Images\\Voiture01.png"
        with self.canvas:
            self.dessin = Rectangle(source=CheminImageVoiture,size=self.size, pos=self.pos)
 
class FormTriangle(Widget):
    def __init__(self,canvas):
        self.canvas=canvas
        #Taille et position:
        self.size=(Window.size[0]*0.08,Window.size[1]*0.08) #Taille du triangle proportionnelement à la taille de fenetre
        self.pos=(500,Window.size[1]*0.01)
        #Ajout de l'image (add_wiget fonctionne aussi):
        CheminImageTriangle = "Z:\\Projet Jeu\\Images\\Triangle3.png"
        with self.canvas:
            self.dessin = Rectangle(source=CheminImageTriangle,size=self.size, pos=self.pos)
        #On associe le mouvement du panier et son image:
        self.bind(pos=self.update_canvas)

    def update_canvas(self, *args):#Mise a jour des positions de l'image:
        self.dessin.pos = self.pos

class FormDemi(Widget):
    def __init__(self,canvas):
        self.canvas=canvas
        #Taille et position:
        self.size=(Window.size[0]*0.08,Window.size[1]*0.08) #Taille du demi proportionnelement à la taille de fenetre
        self.pos=(600,Window.size[1]*0.01)
        #Ajout de l'image (add_wiget fonctionne aussi):
        CheminImageDemi = "Z:\\Projet Jeu\\Images\\Demi_02.png"
        with self.canvas:
            self.dessin = Rectangle(source=CheminImageDemi,size=self.size, pos=self.pos)
        #On associe le mouvement du panier et son image:
        self.bind(pos=self.update_canvas)

    def update_canvas(self, *args):#Mise a jour des positions de l'image:
        self.dessin.pos = self.pos

class FormHexa(Widget):
    def __init__(self,canvas):
        self.canvas=canvas
        #Taille et position:
        self.size=(Window.size[0]*0.08,Window.size[1]*0.08) #Taille du demi proportionnelement à la taille de fenetre
        self.pos=(700,Window.size[1]*0.01)
        #Ajout de l'image (add_wiget fonctionne aussi):
        CheminImageHexa = "Z:\\Projet Jeu\\Images\\Hexag_02.png"
        with self.canvas:
            self.dessin = Rectangle(source=CheminImageHexa,size=self.size, pos=self.pos)
        #On associe le mouvement du panier et son image:
        self.bind(pos=self.update_canvas)

    def update_canvas(self, *args):#Mise a jour des positions de l'image:
        self.dessin.pos = self.pos

class Jeu(FloatLayout):
    def debut(self):
        self.size=Window.size # recuperation de la taille de l'ecran:
        #print(self.size)
        CheminImageDeFond = "Z:\\Projet Jeu\\Images\\Sky_Grasslands_Hill_1327x1024.jpg" # création de l'image de fond:
        self.add_widget(Image(source=CheminImageDeFond,allow_stretch=True,keep_ratio=False))
        self.voiture=Voiture(self.canvas) #Creation de la voiture:
        # ---------------------- Creation des formes ----------------------------------
        self.formTriangle=FormTriangle(self.canvas)
        self.formDemi=FormDemi(self.canvas)
        self.formHexa=FormHexa(self.canvas)

    def on_touch_move(self,touch):                              
        if self.formTriangle.collide_point(touch.x,touch.y):    
            print('YES')                                        
            self.formTriangle.center_x=touch.x                  
            self.formTriangle.center_y=touch.y                  

        elif self.formDemi.collide_point(touch.x,touch.y):    
            print('YES')
            print(touch.x , touch.y)                           
            self.formDemi.center_x=touch.x                  
            self.formDemi.center_y=touch.y                  
 
        elif self.formHexa.collide_point(touch.x,touch.y):    
            print('YES')
            print(touch.x , touch.y)                           
            self.formHexa.center_x=touch.x                  
            self.formHexa.center_y=touch.y                  


    def update(self,ev):
        if ev.type == MOUSEBUTTONDOWN and ev.button == 1 and self.collidepoint(ev.pos):
            self.selected = True

class CarApp(App):
    def build(self):
        New_game=Jeu()#Creation du jeu
        New_game.debut()#Initialisation du jeu
        return New_game#Envoie de l'affichage
 
if __name__ == '__main__':
    CarApp().run()

Configuration: Windows / Firefox 63.0


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

1 réponse

Gerard.isa Messages postés 100 Date d'inscription samedi 24 septembre 2016 Statut Membre Dernière intervention 14 mars 2024 2
3 déc. 2018 à 01:02
Bonsoir,

Ok, j'ai fini par trouver.
Voila pour ceux que ça intéresse.

Ainsi pour savoir si le bouton gauche de la souris est enfoncé, il faut créer une fonction "on_touch_down" qui réagit à chaque évènement que produit l'enfoncement d'un des boutons de la souris.
Ensuite il faut dans cette fonction tester la valeur de "touch_button" qui peut être left ou right.
exemple:

def on_touch_down(self, touch):
    if touch.button == "left":
        print("Le bouton gauche est enfoncé")




Pour tester si le bouton de la souris est relâché, il faut créer une fonction "on_touch_up" qui réagit à chaque événement que produit le relâchement du bouton de la souris. (Je suppose qu'il est inutile de tester quel bouton est relâché).
exemple:

def on_touch_up(self, touch):
...
0