在Python和Tkinter中检测碰撞

1 投票
1 回答
1489 浏览
提问于 2025-04-18 04:30

我有这样的设置:我有一个弓箭手,可以发射箭矢,这些箭矢总是新的箭类实例。同时,我还有一个黑色怪物的实例。我的问题是,是否有可能检测到我的某个箭矢实例是否与这个黑色怪物实例发生了碰撞?如果可以的话,应该怎么做?我经常思考这个问题,但到现在还没有找到解决办法,这让我感到很沮丧。以下是我的代码……请不要对它评价太严厉,我还在努力改进。

from Tkinter import *
from PIL import ImageTk, Image

class App(Frame):
        def __init__(self, master=None):
                Frame.__init__(self, master, height=400, width=400)
                self.master = master
                self.master.bind('<Shift_L>', self.createArrow)
                self.charImg = ImageTk.PhotoImage(Image.open("./Archer.gif"))
                self.charLabel = Label(self, image = self.charImg)
                self.charLabel.pack()
                self.down = False
                self.right = False
                self.left = False
                self.up = False
                self.x_coord = 200
                self.y_coord = 200
                self.pack_propagate(0)
                self.pack()
                self.monster = blackMonster(self)
                self.monster.createMonster(self.monster, 300, 300)
        def createArrow(self, event):
                self.arrow = Arrow(self)
                self.arrow.moveArrow(self.arrow, self.x_coord, self.y_coord + 15)
        def moveableImage(self):
                self.charLabel.place(y=self.y_coord, x=self.x_coord)
        def keyPressed(self, event):
                if event.keysym == 'Down':
                        self.down = True
                elif event.keysym == 'Right':
                        self.right = True
                elif event.keysym == 'Left':
                        self.left = True
                elif event.keysym == 'Up':
                        self.up = True
        def keyReleased(self, event):
                if event.keysym == 'Down':
                        self.down = False
                elif event.keysym == 'Right':
                        self.right = False
                elif event.keysym == 'Left':
                        self.left = False
                elif event.keysym == 'Up':
                        self.up = False
        def task(self):
                if self.down and self.y_coord < 360:
                        self.y_coord += 10
                elif self.right and self.x_coord < 370:
                        self.x_coord += 10
                elif self.left and self.x_coord > 10:
                        self.x_coord -= 10
                elif self.up and self.y_coord > 10:
                        self.y_coord -= 10
                root.after(20,self.task)
                self.moveableImage()

class Arrow(Frame):
        def __init__(self, master):
                Frame.__init__(self, master)
                self.arrowImage = ImageTk.PhotoImage(Image.open("./arrow.gif"))
                Label(self, image=self.arrowImage).pack()
                self.damage = 20
        def moveArrow(self, arrow, xCoord, yCoord):
                arrow.place_forget()
                arrow.place(x = xCoord, y = yCoord)
                self.after(10, self.moveArrow, arrow, xCoord+5, yCoord)


class blackMonster(Frame):
        def __init__(self, master):
                Frame.__init__(self, master)
                self.monsterImage = ImageTk.PhotoImage(Image.open("./monster.gif"))
                Label(self, image=self.monsterImage).pack()
                self.health = 100
        def createMonster(self, monster, x_Coord, y_Coord):
                monster.place(x = x_Coord, y = y_Coord)

root = Tk()
root.title("Frametitel")
app = App(master=root)
root.bind_all('<Key>', app.keyPressed)
root.bind_all('<KeyRelease>', app.keyReleased)
root.after(20, app.task)

app.mainloop()

1 个回答

3

你是用标签和位置来表示怪物和箭头吗?如果你用画布来做,这样编码会简单很多。画布有一些方法,可以很方便地获取已经画出的物体的坐标。接下来就只是一些简单的数学运算了。你先获取箭头的当前坐标,再获取怪物的坐标,然后检查箭头的尖端坐标是否在怪物占据的空间内。你可以使用 bbox 方法来获取物体的坐标。

撰写回答