【问题标题】:Smooth and consistent WASD movement using turtle使用乌龟平滑一致的 WASD 移动
【发布时间】:2023-01-21 00:04:57
【问题描述】:

我正在玩 Turtle 中的运动,我正在尝试让基本的 2D WASD 运动工作;我所说的一致是指相同的速度,没有滞后峰值和/或随机速度提升。这是我当前的代码:(我将键映射到字典以防止按键延迟)

import turtle

keys = {
    "w": False,
    "s": False,
    "a": False,
    "d": False
}

turtle.setup(800, 590)

turtle.delay(0)
turtle.tracer(0, 0)

wn = turtle.Screen()

player = turtle.Turtle()
player.speed(4)

def movement():
    if keys["w"]:
        player.goto(player.xcor(), player.ycor() + 3)
    if keys["s"]:
        player.goto(player.xcor(), player.ycor() - 3)
    if keys["a"]:
        player.goto(player.xcor() - 3, player.ycor())
    if keys["d"]:
        player.goto(player.xcor() + 3, player.ycor())
    turtle.update()

def c_keys(key, value):
    keys[key] = value

wn.onkeypress(lambda: c_keys("w", True), "w")
wn.onkeyrelease(lambda: c_keys("w", False), "w")
wn.onkeypress(lambda: c_keys("s", True), "s")
wn.onkeyrelease(lambda: c_keys("s", False), "s")
wn.onkeypress(lambda: c_keys("a", True), "a")
wn.onkeyrelease(lambda: c_keys("a", False), "a")
wn.onkeypress(lambda: c_keys("d", True), "d")
wn.onkeyrelease(lambda: c_keys("d", False), "d")

wn.listen()

while True:
    movement()

任何帮助表示赞赏,谢谢!

【问题讨论】:

    标签: python turtle-graphics python-turtle


    【解决方案1】:

    您的代码的问题是您在 movement() 函数中使用 turtle.update() 。此函数会在每次移动后更新屏幕,这会导致延迟并减慢动画速度。相反,您应该使用 time.sleep() 函数将移动延迟一定时间,以确保一致的移动速度。

    这是您的代码的更新版本:

    import turtle
    import time
    
    keys = {
        "w": False,
        "s": False,
        "a": False,
        "d": False
    }
    
    turtle.setup(800, 590)
    
    turtle.delay(0)
    turtle.tracer(0, 0)
    
    wn = turtle.Screen()
    
    player = turtle.Turtle()
    player.speed(4)
    
    def movement():
        if keys["w"]:
            player.goto(player.xcor(), player.ycor() + 3)
        if keys["s"]:
            player.goto(player.xcor(), player.ycor() - 3)
        if keys["a"]:
            player.goto(player.xcor() - 3, player.ycor())
        if keys["d"]:
            player.goto(player.xcor() + 3, player.ycor())
    
    def c_keys(key, value):
        keys[key] = value
    
    wn.onkeypress(lambda: c_keys("w", True), "w")
    wn.onkeyrelease(lambda: c_keys("w", False), "w")
    wn.onkeypress(lambda: c_keys("s", True), "s")
    wn.onkeyrelease(lambda: c_keys("s", False), "s")
    wn.onkeypress(lambda: c_keys("a", True), "a")
    wn.onkeyrelease(lambda: c_keys("a", False), "a")
    wn.onkeypress(lambda: c_keys("d", True), "d")
    wn.onkeyrelease(lambda: c_keys("d", False), "d")
    
    wn.listen()
    
    while True:
        movement()
        time.sleep(0.05) # delay movement by 0.05 seconds
    

    【讨论】:

      最近更新 更多