2017-03-19 2 views
0

Je suis nouveau sur Python et j'ai un programme qui a 2 classes, l'une est essentiellement un rectangle et l'autre est essentiellement un cercle. Je les Dessinés en utilisant l'Canvas en Tkinter de la manière suivante:Python: Comment détecter la détection de forme visible dans Tkinter

def draw(self): 
    self.canvas.delete("all") 
    self.rect.draw(self.canvas) 
    self.ball.draw(self.canvas) 

La classe Ball a ses variables de localisation et les variables de diamètre et la classe Rect a ses variables de localisation et dimension.

Je me demande comment je détecte la collision entre ces deux "formes". Je sais que l'un était de traiter le Ball comme un carré et de faire une collision rectangle de base, mais je voudrais savoir comment être précis.

Je me demandais aussi s'il y avait quelque chose de similaire en Python à la façon dont la collision de forme peut être faite en Java. Dans mon jeu Java J'utilise le code suivant pour détecter une collision entre les 2 Shape s:

public boolean collisionCheck(Shape a, Shape b) { 
    Area aA = new Area(a); 
    Area aB = new Area(b); 
    aA.intersect(aB); 
    return !aA.isEmpty(); 
} 

Y at-il quelque chose de semblable à cette solution simple en Python? Et sinon comment je ferais une collision de cercle-rectangle en Python?

Merci pour toute aide

Répondre

0

j'ai réussi à comprendre cela à l'aide d'une méthode objet d » CanvasTkinter a. Chaque fois que quelque chose est dessiné en utilisant Canvas il est donné un ID. Donc, tant que vous enregistrez cet ID quelque part, vous pouvez utiliser la méthode find_overlapping que l'objet Canvas a.

Dites que vous avez un objet, dans mon cas un objet personnalisé Platform, qui conserve l'ID stocké dans une variable. Je l'ai fait comme ceci:

def draw_platform(self, canvas): #Located in the Platform Class 
    self.ID = canvas.create_rectangle(self.x, self.y, self.x+self.w, self.y+self.h) 

Maintenant, je peux utiliser cet ID pour déterminer si un objet se chevauche.

def check_collision(self, plat, other_plat): 
    result = self.canvas.find_overlapping(plat.x, plat.y, plat.x + plat.w, plat.y + plat.h) 
    for i in result: 
     if i == other_plat.ID: 
      return True 
    return False 

result retourne un tuple de les ID qui sont situés dans les limites du rectangle sont entrées en find_overlapping. Vous pouvez ensuite faire une boucle dans le tuple pour voir si l'un des ID correspond à votre autre forme.

Cela fonctionne très bien pour les collisions Rectangle-Rectangle et Circle-Rectangle.