Python 巨蟒:停止重力

Python 巨蟒:停止重力,python,tkinter,Python,Tkinter,我曾尝试在python中使用tkinter创建逼真的重力。重力起作用,但我正在设置动画的球不会停止。这是我的密码: import tkinter as tk import time xv=0 yv=0 x=0 y=0 def move(event=None): global xv,yv, direction if event.char == 'w': yv-=15 elif event.char == 'a': xv-=1 el

我曾尝试在python中使用tkinter创建逼真的重力。重力起作用,但我正在设置动画的球不会停止。这是我的密码:

import tkinter as tk
import time

xv=0
yv=0
x=0
y=0
def move(event=None):
    global xv,yv, direction

    if event.char == 'w':
        yv-=15
    elif event.char == 'a':
        xv-=1
    elif event.char == 'd':
        xv+=1
    elif event.char == 's':
        yv+=1


m = tk.Tk()

canvas = tk.Canvas(m)
canvas.pack(expand=2, fill='both')
oval_id = canvas.create_oval(0,0,10,10,fill='red')

canvas.bind_all('<w>', move) 
canvas.bind_all('<a>', move) 
canvas.bind_all('<d>', move) 
canvas.bind_all('<s>', move)  

while 0==0:   
    yv*=0.9
    xv*=0.9
    x+=xv
    y+=yv
    yv+=1
    if y > 170:
        yv=0
    time.sleep(0.05)
    canvas.move(oval_id,xv,yv)
    canvas.update()
将tkinter作为tk导入
导入时间
xv=0
yv=0
x=0
y=0
def移动(事件=无):
全球xv、yv、方向
如果event.char==“w”:
yv-=15
elif event.char==“a”:
xv-=1
elif event.char==“d”:
xv+=1
elif event.char==“s”:
yv+=1
m=tk.tk()
画布=传统画布(m)
canvas.pack(expand=2,fill='both')
椭圆=画布。创建椭圆(0,0,10,10,fill='red')
画布。绑定所有(“”,移动)
画布。绑定所有(“”,移动)
画布。绑定所有(“”,移动)
画布。绑定所有(“”,移动)
当0==0时:
yv*=0.9
xv*=0.9
x+=xv
y+=yv
yv+=1
如果y>170:
yv=0
睡眠时间(0.05)
画布移动(椭圆形,xv,yv)
canvas.update()

球确实会停下来,但当你按w键跳跃时,球会下沉,并在屏幕上下降。我能让它在不使用太多代码的情况下返回到170px吗?

使用绝对坐标和恒定向下加速度:

yv = 0
xv = 1
while True:
    yv += .5 # .5 is the acceleration
    x+=xv
    y+=yv
    if y > 170: # check that didn't move past the floor
        y=170        # reset to the floor
        yv = -yv*.9  # reverse velocity and lose some energy from the bounce
    time.sleep(0.05)
    canvas.coords(oval_id,x,y,x+10,y+10) # use absolute coordinates
    canvas.update()

从变量的名称(
xv
yv
)可以看出,您使用的是速度,而不是加速度。对于一个相当严肃的重力模型来说,你应该只考虑加速度,这不是我要研究的。问题不在于加速度,而是重力停止变低了。谢谢!那很好用。我确实对它做了一些修改,因为完成的代码将用于platformer游戏,但现在它的工作方式与我希望的一样!