python - 两个轴上的 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 非常陌生,所以这可能只是我的疏忽。
解决方案
您可以使用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")
具有其他更改的完整工作代码
after()
代替Thread
lower_case_names
对于变量(PEP 8 - Python 代码样式指南)=
函数中的参数中没有空格( PEP 8 - Python 代码样式指南)- 没有
import *
(PEP 8 - Python 代码样式指南) - 主要部分之前的所有函数(和类)
- 变量名意味着什么(
canvas
而不是Test
)
.
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()
推荐阅读
- gradle - Factorize gradle task
- python - 我需要帮助使用 python 处理 JSON 格式的数据
- http - 从 localhost 重定向到外部 url
- python - Python -m http.server 443 - 使用 SSL?
- swift - 获取 SwiftUI 中 ScrollView 的当前位置?
- powershell - 找不到接受参数的位置参数-System.Management.Automation.PSCredential'-错误
- azure - Azure 数据工厂管道启动 SSIS 集成运行时授权错误
- c - C:从标准输出块中读取
- angular - 无法读取未定义的属性“访问”
- android - 在前台收到 FCM 通知时应用程序崩溃在后台工作