两个轴上的Bbox故障

我正在对Tkinter项目进行测试,该项目将在软件中包含一些迷你游戏(有点像Mario paint)。对于此测试,我有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,fill = "red")
Move = Test.create_rectangle(x,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,-10) #name,x mod,y mod
    elif s == True:
        Test.move(Move,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极为陌生,因此这可能只是我的疏忽。

xiaoliye 回答:两个轴上的Bbox故障

您可以使用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,x+30,y+30,fill="blue")

move_check()

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

window.mainloop()
本文链接:https://www.f2er.com/2896663.html

大家都在问