2016-05-14 19 views
-4

Ich habe versucht, realistische Schwerkraft mit Tkinter in Python zu erstellen. Die Schwerkraft funktioniert, aber der Ball, den ich animiere, hört nicht auf. Hier ist mein Code:Python: Anhalten der Schwerkraft

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() 

Der Ball ist noch, aber wenn Sie w drücken, um zu springen, es sinkt nach unten und niedriger auf dem Bildschirm. kann ich es wieder auf 170px bringen, ohne zu viel Code zu verwenden?

+0

Aus den Namen Ihrer Variablen ('xv',' yv'), sind Sie mit Geschwindigkeiten arbeiten, nicht Beschleunigungen. Damit ein vernünftiges Gravitationsmodell funktioniert, sollten Sie nur mit Beschleunigungen arbeiten. –

+0

Das ist nicht was ich arbeite mit. Das Problem ist nicht die Beschleunigung, sondern der Schwerkraftstopp wird geringer. – pajamaman7

Antwort

1

Verwenden absolute Koordinaten und konstante Beschleunigung nach unten:

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() 
+0

Danke! das hat perfekt funktioniert. Ich habe es ein bisschen modifiziert, weil der fertige Code für ein Platformerspiel sein wird, aber jetzt funktioniert es genau so, wie ich es wollte! – pajamaman7