如何在 python 乌龟中进行平滑输入

How to make smooth inputs in python turtle

我正在尝试制作乒乓球游戏。在它里面,我想要一个带有输入的平滑移动的拨片(例如,按 w 它会向上移动而不移动一次,然后在按下键时重复)我希望它在按下键时开始重复。所以你一按这个键它就不会稍微颠簸起来然后开始移动,它会平稳地向上移动。

game: bool = True

win = turtle.Screen()
win.setup(width=800, height=600)
win.tracer(0)

# Paddle A
paddle_a = turtle.Turtle()
paddle_a.speed(0)
paddle_a.shape("square")
paddle_a.color("white")
paddle_a.shapesize(stretch_wid=5, stretch_len=1)
paddle_a.penup()
paddle_a.goto(-350, 0)

# Paddle B
paddle_b = turtle.Turtle()
paddle_b.speed(0)
paddle_b.shape("square")
paddle_b.color("white")
paddle_b.shapesize(stretch_wid=5, stretch_len=1)
paddle_b.penup()
paddle_b.goto(350, 0)

# Functions
def paddle_a_up():
    if paddle_a.ycor() + 70 < 300:
        y = paddle_a.ycor()
        y += 20
        paddle_a.sety(y)


def paddle_a_down():
    if paddle_a.ycor() - 70 > -300:
        y = paddle_a.ycor()
        y -= 20
        paddle_a.sety(y)


def paddle_b_up():
    if paddle_b.ycor() + 70 < 300:
        y = paddle_b.ycor()
        y += 20
        paddle_b.sety(y)


def paddle_b_down():
    if paddle_b.ycor() - 70 > -300:
        y = paddle_b.ycor()
        y -= 20
        paddle_b.sety(y)


# Keyboard binding
win.listen()
win.onkeypress(paddle_a_up, "w")
win.onkeypress(paddle_a_up, "W")
win.onkeypress(paddle_a_down, "s")
win.onkeypress(paddle_a_down, "S")
win.onkeypress(paddle_b_up, "Up")
win.onkeypress(paddle_b_down, "Down")

while game:
    win.update()

onkeypress 应该只设置全局或 class 变量即。 move_up = True,
onkeyrelease 应该设置 move_up = False,
while game 中,您应该检查 move_up 并移动桨。

我只为左桨做的。你必须对右桨做同样的事情。

我使用速度 2 而不是 20 因为现在它移动得太快了。

import turtle

game: bool = True

win = turtle.Screen()
win.setup(width=800, height=600)
win.tracer(0)

# Paddle A
paddle_a = turtle.Turtle()
paddle_a.speed(0)
paddle_a.shape("square")
paddle_a.color("blue")
paddle_a.shapesize(stretch_wid=5, stretch_len=1)
paddle_a.penup()
paddle_a.goto(-350, 0)

# Paddle B
paddle_b = turtle.Turtle()
paddle_b.speed(0)
paddle_b.shape("square")
paddle_b.color("red")
paddle_b.shapesize(stretch_wid=5, stretch_len=1)
paddle_b.penup()
paddle_b.goto(350, 0)

# default value at start
paddle_a.move_up = False
paddle_a.move_down = False

# Functions
def paddle_a_up_start():
    paddle_a.move_up = True

def paddle_a_up_end():
    paddle_a.move_up = False
    
def paddle_a_down_start():
    paddle_a.move_down = True

def paddle_a_down_end():
    paddle_a.move_down = False


def paddle_b_up():
    if paddle_b.ycor() + 70 < 300:
        y = paddle_b.ycor()
        y += 20
        paddle_b.sety(y)

def paddle_b_down():
    if paddle_b.ycor() - 70 > -300:
        y = paddle_b.ycor()
        y -= 20
        paddle_b.sety(y)


# Keyboard binding
win.listen()

win.onkeypress(paddle_a_up_start, "w")
win.onkeyrelease(paddle_a_up_end, "w")

win.onkeypress(paddle_a_up_start, "W")
win.onkeyrelease(paddle_a_up_end, "W")

win.onkeypress(paddle_a_down_start, "s")
win.onkeyrelease(paddle_a_down_end, "s")

win.onkeypress(paddle_a_down_start, "S")
win.onkeyrelease(paddle_a_down_end, "S")


win.onkeypress(paddle_b_up, "Up")
win.onkeypress(paddle_b_down, "Down")


while game:
    if paddle_a.move_up:
        if paddle_a.ycor() + 70 < 300:
            y = paddle_a.ycor()
            y += 2
            paddle_a.sety(y)

    if paddle_a.move_down:
        if paddle_a.ycor() - 70 > -300:
            y = paddle_a.ycor()
            y -= 2
            paddle_a.sety(y)

    win.update()