私のキャンバスにはグリッドがあり、いくつかのセルにはサークルがあります。私の目標は、サークルをグリッドの周りに移動させることですが、別のサークルには移動させないことです。だから、私がサークルを動かすときに、何かがあるかどうかを確認します。もしそうなら、動きをキャンセルします。まず、動きの終わりに衝突をチェックしようとしましたが、動作させることができませんでした。だから私は移動中にチェックしようとしていますが、キャンバスラインもオブジェクトであることに気がついたので、衝突があります。 これらの行の衝突を無視する "単純な"方法はありますが、円の衝突は無視していませんか?いくつかのTkinterの衝突を無視するには?
class Deplacement:
def __init__(self, canvas, event):
self.x = event.x
self.y = event.y
self.canvas = canvas
self.obj = "à déterminer"
self.obj2 = "à déterminer"
self.couleur = "à déterminer"
self.couleur2 = "à déterminer"
self.collision = "à déterminer"
canvas.bind("<ButtonPress-1>", self.StartMove)
canvas.bind("B1-Motion", self.OnMotion)
canvas.bind("<ButtonRelease-1>", self.StopMove)
def StartMove(self, event): #Getting the object I want to move
self.x = event.x
self.y = event.y
self.obj = self.canvas.find_overlapping(self.x - 15, self.y - 15, self.x + 15, self.y + 15)
def OnMotion(self, event): #This is where I struggle
#Trying to get the second circle if it exists
self.obj2 = self.canvas.find_overlapping(event.x - 15, event.y - 15, event.x + 15, event.y + 15)
if not self.obj2:
self.collision = False
else:
self.collision = True
def StopMove(self, event): #This works fine, in context, checking items colors to move them or not
#And objects must be moved by one axis
self.couleur = self.canvas.itemcget(self.obj, "fill")
if not self.collision:
if self.couleur == 'black' or self.couleur == 'white' or self.couleur == 'red':
if event.x > self.x and self.y - 10 <= event.y <= self.y + 10:
self.move(event, self.obj)
elif event.x < self.x and self.y - 10 <= event.y <= self.y + 10:
self.move(event, self.obj)
elif event.y > self.y and self.x - 10 <= event.x <= self.x + 10:
self.move(event, self.obj)
elif event.y < self.y and self.x - 10 <= event.x <= self.x + 10:
self.move(event, self.obj)
def move(self, event, obj): #Finally moving objects, works nicely aswell
self.x = (event.x - 20) // 50 + 1
self.y = (event.y - 20) // 50 + 1
self.obj = obj
if event.x < 20:
self.x = 1
self.canvas.coords(self.obj, self.x * 50 - 25, self.y * 50 - 25, self.x * 50 + 15, self.y * 50 + 15)
elif event.y < 20:
self.y = 1
self.canvas.coords(self.obj, self.x * 50 - 25, self.y * 50 - 25, self.x * 50 + 15, self.y * 50 + 15)
elif event.x > 470:
self.x = 9
self.canvas.coords(self.obj, self.x * 50 - 25, self.y * 50 - 25, self.x * 50 + 15, self.y * 50 + 15)
elif event.y > 470:
self.y = 9
self.canvas.coords(self.obj, self.x * 50 - 25, self.y * 50 - 25, self.x * 50 + 15, self.y * 50 + 15)
else:
self.canvas.coords(self.obj, self.x * 50 - 25, self.y * 50 - 25, self.x * 50 + 15, self.y * 50 + 15)
PS:フランス語を無視します。
このコレクションで衝突テストを実行して実行するシェイプのセットを維持する方が簡単です。これは、単純化され、繰り返されるフィルタリング操作を回避します。 –
なぜ簡単なのか、それがフィルタリングの量を変更する理由がわかりません。それはあなたのロジックに真実か偽であるかどうかという唯一の疑問です。どちらの場合でも、あなたは動かすたびにフィルターをかけなければなりません。問題はいくつかの衝突を "無視する"方法だったので、私は、無視されないオブジェクトの集合ではなく、無視されるオブジェクトの集合に関して答えを書いた。 –
いいえ、2つのコレクションを維持し、衝突するアイテムを含むコレクションのコリジョンのみをチェックする必要があります。 –