Python 添加控件时碰撞检测不起作用

Python 添加控件时碰撞检测不起作用,python,collision-detection,turtle-graphics,Python,Collision Detection,Turtle Graphics,我有一个检测碰撞的代码,如果我将x和y设置为远离它检测碰撞的对象,它就会工作(我需要在运行脚本之前直接将其设置为远离代码) 如果我在其中添加控件,并在其运行时四处移动,则不会检测到碰撞。 代码如下: import time import random import sys import turtle wn = turtle.Screen() wn.title('collision') wn.bgcolor('black') wn.setup(width=800, height=600) w

我有一个检测碰撞的代码,如果我将x和y设置为远离它检测碰撞的对象,它就会工作(我需要在运行脚本之前直接将其设置为远离代码)
如果我在其中添加控件,并在其运行时四处移动,则不会检测到碰撞。
代码如下:

import time
import random
import sys
import turtle

wn = turtle.Screen()
wn.title('collision') 
wn.bgcolor('black') 
wn.setup(width=800, height=600)
wn.tracer(0)

p_s = 20
e_s = 20

px = 0
py = 0
ex = 0
ey = 0
pec = 0

def collision():
    global pec
    pupc = px + p_s / 2 
    pdownc = px - p_s / 2
    pupcy = py + p_s / 2 
    pdowncy = py - p_s / 2

    if ex == px or ex > px and ex < pupc or ex == px or ex < px and ex > pdownc:

        if ey == py or ey > py and ey < pupcy or ey == py or ey < py and ey > pdowncy:
            pec = 1

        else:
            pec = 0

    else:
        pec = 0

    if pec == 1:
        print ('collision')

    elif pec == 0:
        print ('nope')

#enemy
e = turtle.Turtle()
e.goto(ex, ey)
e.speed(0)
e.color('red')
e.penup()

#player
p = turtle.Turtle()
p.goto(px, py)
p.speed(0)
p.shape('square')
p.color('blue')
p.penup()

print('move')
def p_up():
    py = p.ycor()
    py += 20
    p.sety(py)
    print(py)
    wn.update()
    collision()

def p_down():
    py = p.ycor()
    py -= 20
    p.sety(py)
    print(py)
    wn.update()
    collision()

def p_right():
    px = p.xcor()
    px += 20
    p.setx(px)
    print(px)
    wn.update()
    collision()

def p_left():
    px = p.xcor()
    px -= 20
    p.setx(px)
    print(px)
    wn.update()
    collision()



#keyboard binding
wn.listen()
wn.onkeypress(p_up, "Up")
wn.onkeypress(p_down, "Down")
wn.onkeypress(p_right, "Right")
wn.onkeypress(p_left, "Left")

#main part 
while True:
    wn.update()
导入时间
随机输入
导入系统
进口海龟
wn=tutle.Screen()
wn.title(“冲突”)
wn.bgcolor('黑色')
wn.设置(宽度=800,高度=600)
wn.tracer(0)
p_s=20
e_s=20
px=0
py=0
ex=0
ey=0
pec=0
def collision():
全球pec
pupc=px+p_s/2
pdownc=px-p_s/2
pupcy=py+p_s/2
pdowncy=py-p_s/2
如果ex==px或ex>px且expdownc:
如果ey==py或ey>py且eypdowncy:
pec=1
其他:
pec=0
其他:
pec=0
如果pec==1:
打印('冲突')
elif pec==0:
打印(‘否’)
#敌人
e=海龟。海龟()
e、 后藤(前,后藤)
e、 速度(0)
e、 颜色(“红色”)
e、 彭普()
#玩家
p=海龟。海龟()
p、 转到(px,py)
p、 速度(0)
p、 形状(“正方形”)
p、 颜色(“蓝色”)
p、 彭普()
打印('移动')
def p_up():
py=p.ycor()
py+=20
p、 赛蒂(py)
打印(py)
wn.update()
碰撞()
def p_down():
py=p.ycor()
py-=20
p、 赛蒂(py)
打印(py)
wn.update()
碰撞()
def p_right():
px=p.xcor()
px+=20
p、 setx(px)
打印(px)
wn.update()
碰撞()
def p_left():
px=p.xcor()
px-=20
p、 setx(px)
打印(px)
wn.update()
碰撞()
#键盘装订
听着
wn.onkeypress(p_up,“up”)
wn.onkeypress(p_down,“down”)
wn.onkeypress(p_右,“右”)
wn.onkeypress(p_左,“左”)
#主体
尽管如此:
wn.update()

我相信你让这个问题变得比必要的更难了。首先,turtle使用
.distance()
方法提供基本的碰撞检测。第二,唯一需要的全局变量是常量,因为我们可以随时询问海龟的当前位置(和航向等):

从海龟导入屏幕,海龟
从随机输入范围
光标大小=20
宽度,高度=800600
def player_up():
player.sety(player.ycor()+20)
检查碰撞()
def player_down():
player.sety(player.ycor()-20)
检查碰撞()
def player_right():
player.setx(player.xcor()+20)
检查碰撞()
def player_left():
player.setx(player.xcor()-20)
检查碰撞()
def敌人_重新定位():
敌人隐藏处
x=随机范围(光标大小-宽度/2,宽度/2-光标大小)
y=随机范围(光标大小-高度/2,高度/2-光标大小)
敌人。后藤(x,y)
敌人
def check_collision():
如果玩家距离(敌人)<光标大小:
打印(“碰撞!”)
敌人重新安置
screen=screen()
屏幕设置(宽度、高度)
screen.title(“碰撞!”)
screen.bgcolor('黑色')
#敌人
敌人=乌龟()
敌人。形状(‘圆’)
敌人。颜色(‘红色’)
敌人。速度(“最快”)
敌人
敌人重新安置
#玩家
玩家=乌龟()
player.shape('square')
player.color('blue'))
玩家速度(“最快”)
player.penup()
#键盘装订
屏幕上的按键(播放器向上,“向上”)
屏幕上的按键(播放器向下,“向下”)
屏幕上的按键(播放器右,‘右’)
屏幕。按键盘(播放器左键,左键)
screen.listen()
#主体
screen.mainloop()

刚刚编辑它以修复语法错误谢谢!行得通,但我不太清楚你们检查碰撞的依据是什么。我看到一个蓝色的正方形,我可以四处移动,在每个刻度上我看到“碰撞”字样。你能澄清一下你想要达到的目标吗?我希望看到其他一些你想碰撞的物体。现在还没有被碰撞的盒子的图形,但是在代码中,我有这个盒子。尝试更改变量px或py,敌人的大小设置为50,因此如果您更改(玩家的)x或y,它会说“不”,这意味着“不碰撞”。但是,如果您使用控件,并按下上、下、左右键,然后远离,它仍然会检测到碰撞。因此,尝试将px和py更改为smth,如100抱歉,这些说明和一些难以理解的变量名并没有真正帮助我找出问题所在。您能否编辑问题以显示如何重现问题,并清楚地解释所需的行为?为要碰撞的对象添加图形非常简单,并且更容易判断是否发生碰撞。理想情况下,我应该能够复制/粘贴/运行代码,并准确地看到出了什么问题。谢谢
from turtle import Screen, Turtle
from random import randrange

CURSOR_SIZE = 20
WIDTH, HEIGHT = 800, 600

def player_up():
    player.sety(player.ycor() + 20)
    check_collision()

def player_down():
    player.sety(player.ycor() - 20)
    check_collision()

def player_right():
    player.setx(player.xcor() + 20)
    check_collision()

def player_left():
    player.setx(player.xcor() - 20)
    check_collision()

def enemy_relocate():
    enemy.hideturtle()

    x = randrange(CURSOR_SIZE - WIDTH/2, WIDTH/2 - CURSOR_SIZE)
    y = randrange(CURSOR_SIZE - HEIGHT/2, HEIGHT/2 - CURSOR_SIZE)
    enemy.goto(x, y)

    enemy.showturtle()

def check_collision():
    if player.distance(enemy) < CURSOR_SIZE:
        print("Collision!")
        enemy_relocate()

screen = Screen()
screen.setup(WIDTH, HEIGHT)
screen.title("Collision!")
screen.bgcolor('black')

# enemy
enemy = Turtle()
enemy.shape('circle')
enemy.color('red')
enemy.speed('fastest')
enemy.penup()

enemy_relocate()

# player
player = Turtle()
player.shape('square')
player.color('blue')
player.speed('fastest')
player.penup()

# keyboard binding
screen.onkeypress(player_up, 'Up')
screen.onkeypress(player_down, 'Down')
screen.onkeypress(player_right, 'Right')
screen.onkeypress(player_left, 'Left')
screen.listen()

# main part
screen.mainloop()