Python:Tkinter:find_overlapping在没有任何重叠的情况下返回结果

时间:2017-04-23 01:55:13

标签: python canvas tkinter

我正在尝试在Tkinter制作一个非常简单的小游戏(不想使用Pygame,请不要关于Pygame的建议),而且我正在使用画布上的find_overlapping进行碰撞检测,但它说的是事情当我的两个盒子不在彼此附近时重叠。

这是我的玩家类:

    from tkinter import *

class Player(Canvas):

    def __init__(self,parent,frame):
        Canvas.__init__(self,parent)
        self.parent = parent
        self.frame = frame

    def drawPlayer(self):
        self.pImage = PhotoImage(file="D:\James\Pictures\Test Images\Test_Image.png")
        self.image = self.parent.create_image(100,100,image=self.pImage, anchor="nw")

        self.frame.bind("<Key-Up>", self.movePlayerUp)
        self.frame.bind("<Key-Down>", self.movePlayerDown)
        self.frame.bind("<Key-Left>", self.movePlayerLeft)
        self.frame.bind("<Key-Right>", self.movePlayerRight)

        self.bounds = self.parent.bbox(self.image)
        print(self.bounds)

    def movePlayerUp(self, event):
        self.playerCoords = self.parent.coords(self.image)
        self.bounds = self.parent.bbox(self.image)
        print(self.bounds)
        print(self.parent.find_overlapping(self.bounds[0],self.bounds[2]-1,self.bounds[1],self.bounds[3]-1))
        if self.playerCoords[1] > 2:
            self.parent.move(self.image,0,-2)
            print("up")

    def movePlayerDown(self, event):
        self.playerCoords = self.parent.coords(self.image)
        self.bounds = self.parent.bbox(self.image)
        print(self.bounds)
        print(self.parent.find_overlapping(self.bounds[0],self.bounds[2]+1,self.bounds[1],self.bounds[3]+1))
        if self.playerCoords[1] + 20 < 301:
            self.parent.move(self.image,0,2)
            print("down")

    def movePlayerLeft(self, event):
        self.playerCoords = self.parent.coords(self.image)
        self.bounds = self.parent.bbox(self.image)
        print(self.bounds)
        print(self.parent.find_overlapping(self.bounds[0]-1,self.bounds[2],self.bounds[1]-1,self.bounds[3]))
        if self.playerCoords[0] > 2:
            self.parent.move(self.image,-2,0)
            print("left")

    def movePlayerRight(self, event):
        self.playerCoords = self.parent.coords(self.image)
        self.bounds = self.parent.bbox(self.image)
        print(self.bounds)
        print(self.parent.find_overlapping(self.bounds[0]+1,self.bounds[2],self.bounds[1]+1,self.bounds[3]))
        if self.playerCoords[0] + 20 < 301:
            self.parent.move(self.image,2,0)
            print("right")

这是我的主要课程:

from tkinter import *
from time import *
import sqlite3
import ModulePlayer

class Loops(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent

        self.allow = False
        self.i = 1

        self.canvas = Canvas(self.parent, width=300, height=300, bg="lime")
        self.testBox = self.canvas.create_rectangle(40,40,130,90)
        ModulePlayer.Player(self.canvas,self.parent).drawPlayer()

        self.canvas.pack()

root = Tk()
root.resizable(False, False)
root.geometry("600x400")

Loops(root).pack()

root.mainloop()

所以我的播放器开始于x = 100,y = 100,我有一个x1 = 40,x2 = 130,y1 = 40,y2 = 90的盒子,但当我的播放器位于x1 = 78时,x2 = 98,y1 = 100,y2 = 120,find_overlapping说当前有两个对象重叠,然后当我在我的testBox里面时,它说的是0.它似乎随机检测到我重叠的东西什么时候没别的是除了我的播放器和画布本身。

我认为这可能是因为find_overlapping技术上与我的播放器图像重叠,但如果是这种情况那么它总是至少返回1,但通常会返回0。

如果我删除了testBox矩形,那么它总是返回0,无论它在哪里,所以我知道这与它有关。

我试过搜索,我似乎找不到其他人有这个问题。我对find_overlapping的工作原理有什么根本的错误吗?或者我对python / tkinter的工作原理有什么根本的错误?我还是比较新的,但这对我来说没什么意义......

1 个答案:

答案 0 :(得分:1)

忽略这一点。找到了答案。得到x和y的顺序错误。我只是个白痴。