Python Turtle碰撞边界碰撞不起作用

时间:2017-05-22 08:51:45

标签: python turtle-graphics

我试图让我的乌龟物体在与边界接触时转180度,但这不会发生。而不是我想使用if if语句说明x和y cor是高于还是低于某个数量,它们将导致对象向后移动。这是下面的代码。

from turtle import *
import turtle

title("Pokemon: Fire Red")
t = turtle.Turtle()
screen = t.getscreen()

t.penup()


t.left(90)

border = turtle.Turtle()
border.up()
border.setposition(-240, 160)
border.down()
border.pensize(3)
for side in range(2):
    border.forward(480)
    border.right(90)
    border.forward(320)
    border.right(90)

tx, ty = t.pos()
if tx < -240 or tx > 240 or ty < -160 or ty > 160:
    t.hide()




Screen()

showturtle()



def k1():
    t.forward(50)



def k2():
    t.left(90)
    t.forward(50)

    t.right(90)

def k3():
    t.right(90)
    t.forward(50)

    t.left(90)

def k4():
    t.forward(-50)





onkey(k1, "Up")
onkey(k2, "Left")
onkey(k3, "Right")
onkey(k4, "Down")


listen()
mainloop()

任何帮助都将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:0)

您是否在hide()下创建了一个功能class turtle?我找了它,但turtle module没有提供这样的功能。我会在假设您的代码

的情况下回答
tx, ty = t.pos()
if tx < -240 or tx > 240 or ty < -160 or ty > 160:
    t.hide()

旨在检查碰撞。在此代码中,您只检查与边界的碰撞一次。每次龟移动时都应该调用你期望的性能。也就是说,在每个k#函数下。所以改变就是这样:

def collision_check (t):
    tx,ty = t.pos()
    if tx < -240 or tx > 240 or ty < -160 or ty > 160:
        t.right(180)
        t.forward(50)
        t.right(180)

def k1():
    t.forward(50)
    collision_check(t)

def k2():
    t.left(90)
    t.forward(50)
    collision_check(t)
    t.right(90)

def k4():
    t.right(180)
    t.forward(50)
    collision.check(t)
    t.right(180)

k3相同。 k4已经调整,因为这个collision_check函数适用于乌龟的方向。

答案 1 :(得分:0)

你已经为你的乌龟定义了一个独特的运动序列,它始终偏向 向上 方向,这样我就不相信通用的碰撞检测逻辑会起作用。我还相信,绝对 标题 设置对您来说比相对left()from turtle import Turtle, Screen WIDTH, HEIGHT = 480, 320 def move_turtle(distance, heading): ahead = min(50, distance) if ahead: if heading != yertle.heading(): yertle.setheading(heading) yertle.forward(ahead) behind = 50 - ahead if behind: heading -= 180 if heading != yertle.heading(): yertle.setheading(heading) yertle.forward(behind) if yertle.heading() != 0: yertle.setheading(0) def k1(): screen.onkey(None, "Up") move_turtle(HEIGHT/2 - yertle.ycor(), 0) screen.onkey(k1, "Up") def k2(): screen.onkey(None, "Left") move_turtle(yertle.xcor() + WIDTH/2, 270) screen.onkey(k2, "Left") def k3(): screen.onkey(None, "Right") move_turtle(WIDTH/2 - yertle.xcor(), 90) screen.onkey(k3, "Right") def k4(): screen.onkey(None, "Down") move_turtle(HEIGHT/2 + yertle.ycor(), 180) screen.onkey(k4, "Down") screen = Screen() screen.mode('logo') # since 'up' is crucial, make it 0 degrees yertle = Turtle() yertle.penup() border = Turtle(visible=False) border.speed("fastest") # because I have no patience border.pensize(3) border.penup() border.setposition(-WIDTH/2, -HEIGHT/2) border.pendown() for _ in range(2): border.forward(HEIGHT) border.right(90) border.forward(WIDTH) border.right(90) screen.onkey(k1, "Up") screen.onkey(k2, "Left") screen.onkey(k3, "Right") screen.onkey(k4, "Down") screen.listen() screen.mainloop() 转弯效果更好。因此,我使用标题和 徽标 模式重新设计了代码,因为它将 向上 设置为0度:

baseUrl