如何在四个方向上加速和减速?

2024-05-14 14:05:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使立方体能够加速和减速在所有4个方向使用箭头键。我能解出1个方向(向上),但我不知道如何在其他3个方向上。基本上,我只需要它做我现在的代码做的事情,只是在所有4个方向。你知道吗

from tkinter import *

SPEED = 1

def handle_key(event):
    sym = event.keysym
    print(sym)
    cdx, cdy = 0, 0
    if sym == 'Up':
        dy.set(dy.get()-SPEED)
    elif sym == 'Down':
        dy.set(SPEED)
    elif sym == 'Right':
        cdx = SPEED
    elif sym == 'Left':
        cdx = -SPEED
    dx.set(cdx)

def animate():
    canvas.move(player, dx.get(), dy.get())
    if dy.get() < 0:
        dy.set(min(dy.get() + .12, 0))
    canvas.after(1, animate)

root = Tk()
dx = DoubleVar()
dy = DoubleVar()


canvas = Canvas(root, width=800, height=600)
canvas.pack()

player = canvas.create_rectangle(395, 590, 405, 600, fill='red')


canvas.bind('<Key>', handle_key)
canvas.focus_set()
animate()
root.mainloop()

Tags: keygetdefroot方向canvashandlespeed
1条回答
网友
1楼 · 发布于 2024-05-14 14:05:00

您的代码几乎没有问题,例如函数animate()将连续运行,即使没有按键事件。另外,代码可以更好,比如可以使用<KeyPress>加速,<KeyRelease>减速。我给你举了个例子。你知道吗

enter image description here

我使用after(1,..)来平滑地加速和减速,因为连续的按键有一些明显的延迟。你知道吗

from tkinter import *

root = Tk()
root.geometry('1200x50+50+0')

speed = DoubleVar(value=1)    #  Speed of the item 
multiplier = DoubleVar(value=0.05)  #  Increase / Decrease rate
acc_id = None    # after id for acceleration
des_id = None    # after id for deceleration

canvas = Canvas(root, bg='pink')
canvas.pack(expand=1, fill='both')

#  Player item
player = canvas.create_rectangle(10,10,40,40, fill='grey', outline='black')

def direction(key):
    """Moves the item according to the arrow keys"""
    if key == 'Left': canvas.move(player, -speed.get()*multiplier.get(), 0)
    if key == 'Right': canvas.move(player, speed.get()*multiplier.get(), 0)
    # if key == 'Up': canvas.move(player, 0, -speed.get()*multiplier.get())
    # if key == 'Down': canvas.move(player, 0, speed.get()*multiplier.get())

def accelerate(evt=None):
    """Increase the speed."""
    global des_id, acc_id
    # set the values according to your needs
    multiplier.set( multiplier.get() + 0.05 )
    direction(evt.keysym)
    if des_id: canvas.after_cancel(des_id)
    acc_id = canvas.after(1, accelerate, evt)

def decelerate(evt=None):
    """Decrease the speed."""
    global des_id, acc_id
    if acc_id: canvas.after_cancel(acc_id)
    # set the values according to your needs
    multiplier.set( multiplier.get() - 0.05 )
    if multiplier.get() >= 0: 
        direction(evt.keysym)
        des_id = canvas.after(1, decelerate, evt)

root.bind('<KeyPress>', accelerate)
root.bind('<KeyRelease>', decelerate)

root.mainloop()

相关问题 更多 >

    热门问题