首页 > 解决方案 > 两个轴上的 Bbox 故障

问题描述

我正在为一个 Tkinter 项目进行测试,该项目将在软件中包含一些小游戏(有点像马里奥绘画)。对于这个测试,我有 2 个盒子,一个是红色的,另一个是蓝色的,但是当它靠近红色盒子或在红色盒子里面时,它会变成绿色。

这是代码。

from tkinter import *
from threading import Timer

window = Tk()
window.title("Canvas Test")

x = 30
y = 30

Test = Canvas(window, width = 1000, height = 1000)
Test.config(bg = "white")
Test.pack()

Move = Test.create_rectangle(x, y, x + 40, y + 40, fill = "blue")
Hitd = Test.create_rectangle(x, y, x + 40, y + 40, fill = "red")
Move = Test.create_rectangle(x, y, x + 30, y + 30, fill = "blue")

Test.update()

w = False
a2 = False
s = False
d = False

def KeyDown(event):
    print("K Down")
    global x
    global y
    global Move
    global w
    global a2
    global s
    global d
    if event.char == "w" or event.char == "W":
        w = True
    elif event.char == "s" or event.char == "S":
        s = True
    if event.char == "a" or event.char == "A":
        a2 = True 
    elif event.char == "d" or event.char == "D":
        d = True

def KeyUp(event):
    print("K Up")
    global w
    global a2
    global s
    global d
    if event.char == "w" or event.char == "W":
        w = False
    elif event.char == "s" or event.char == "S":
        s = False
    if event.char == "a" or event.char == "A":
        a2 = False 
    elif event.char == "d" or event.char == "D":
        d = False


def MoveCheck():
    global Move
    global w
    global a2
    global s
    global d
    if w == True:
        Test.move(Move, 0, -10) #name, x mod, y mod
    elif s == True:
        Test.move(Move, 0, 10)
    if a2 == True:
        Test.move(Move, -10, 0)
    elif d == True:
        Test.move(Move, 10, 0)

    a = Test.bbox(Move)
    b = Test.bbox(Hitd)
    if b[0] in range(a[0],a[2]) or b[2] in range(a[0],a[2]) and b[1] in range(a[1],a[3]) or b[3] in range(a[1],a[3]):
        Test.itemconfig(Move, fill = "green")
    else:
        Test.itemconfig(Move, fill = "blue")

    t = Timer(0.03, MoveCheck)
    t.start()
MoveCheck()

window.bind("<Key>", KeyDown)
window.bind("<KeyRelease>", KeyUp)

window.mainloop()

如果您与块对齐,然后向下或向上移动 1(或向左/向右移动,具体取决于您在哪个轴上进行测试),那么您将看到该块无论如何都会变成绿色。我对使用 bbox 非常陌生,所以这可能只是我的疏忽。

标签: pythontkintertkinter-canvas

解决方案


您可以使用Canvas.find_overlapping() 来测试移动矩形是否与其他对象重叠。

a = Test.bbox(Move)
#b = Test.bbox(Hitd)

if Hitd in Test.find_overlapping(*a):
    Test.itemconfig(Move, fill = "green")
else:
    Test.itemconfig(Move, fill = "blue")

具有其他更改的完整工作代码

.

import tkinter as tk

# --- functions ---

def key_down(event):
    global speed_x
    global speed_y

    print("K Down")

    char = event.char.lower()

    if char == "w":
        speed_y = -10
    elif char == "s":
        speed_y = 10
    elif char == "a":
        speed_x = -10
    elif char == "d":
        speed_x = 10

def key_up(event):
    global speed_x
    global speed_y

    print("K Up")

    char = event.char.lower()

    if char in ("w", "s"):
        speed_y = 0
    elif char in ("a", "d"):
        speed_x = 0


def move_check():
    canvas.move(player, speed_x, speed_y) #name, x mod, y mod

    player_bbox = canvas.bbox(player)

    if enemy in canvas.find_overlapping(*player_bbox):
        canvas.itemconfig(player, fill="green")
    else:
        canvas.itemconfig(player, fill="blue")

    window.after(30, move_check)

# --- main ---

window = tk.Tk()
window.title("Canvas Test")

x = 30
y = 30
speed_x = 0
speed_y = 0

canvas = tk.Canvas(window, width=1000, height=1000, bg="white")
canvas.pack()

enemy = canvas.create_rectangle(x, y, x+40, y+40, fill="red")
player = canvas.create_rectangle(x, y, x+30, y+30, fill="blue")

move_check()

window.bind("<Key>", key_down)
window.bind("<KeyRelease>", key_up)

window.mainloop()

推荐阅读