2016-07-17 7 views
1

Ich wollte eine Physik-Engine für mein Spiel erstellen und entschied, dass ich zuerst Kräfte decken sollte. Ich verwende Pygame auf Python, um dies zu erreichen.Python Pygame Kräfte

Zum Beispiel möchte ich in der Lage sein, eine Kraft einer bestimmten Größe zu programmieren, die auf ein Objekt wirkt. Ich konnte mir keinen Weg vorstellen, dies zu tun. Nachdem ich die grundlegende Strategie heruntergefahren habe, sollte es einfach sein, Größen von Kräften zu subtrahieren und alle möglichen unterschiedlichen Eigenschaften hinzuzufügen. Hier ist mein Quellcode jetzt:

import pygame 

pygame.init() 

display_width = 800 
display_height = 600 

gameDisplay = pygame.display.set_mode((display_width, display_height)) 
pygame.display.set_caption('Physics Engine') 
clock = pygame.time.Clock() 

x = display_width/2 
y = display_height/2 


gameExit = False 

def force(): 
    # force function 
    # Code here 

y_change = 0 
x_change = 0 

while not gameExit: 



    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      quit() 
     elif event.type == pygame.KEYDOWN: # check for key presses 
      if event.key == pygame.K_LEFT: # left arrow turns left 
       x_change = -10 
       y_change = 0 
      elif event.key == pygame.K_RIGHT: # right arrow turns right 
       x_change = 10 
       y_change = 0 


    y += y_change 
    x += x_change 

    print(x, y) 

    gameDisplay.fill((255, 255, 255)) 
    pygame.draw.rect(gameDisplay, (255, 0, 0), [x, y, 30, 30]) 
    pygame.display.update() 

    clock.tick(25) 

pygame.quit() 
quit() 

Ab sofort ist es einfach ein rotes Quadrat nach links und rechts bewegen. Ich möchte, dass wenn ich die Pfeiltaste gedrückt halte, es sich bewegt, und wenn ich es loslasse, hört es auf. Ich habe versucht, einen Boolean in dem Ereignis zu verwenden, aber es scheint nicht zu funktionieren.

Ich möchte einen einfachen Schwerkraftfaktor implementieren.

Vielen Dank für das Lesen!

Antwort

1

Es gibt ein paar Punkte, die ich sehen kann. Erstens, wenn Sie möchten, dass ein Effekt auftritt, während Sie eine Taste gedrückt halten, sollten Sie abfragen, ob diese Taste gedrückt ist, anstatt nur gedrückt zu sein. Ignoriere KEYDOWN-Ereignisse und verwende stattdessen http://www.pygame.org/docs/ref/key.html#pygame.key.get_pressed . Zweitens sollten Sie Bibliotheksklassen für Positionen, Geschwindigkeiten usw. definieren oder verwenden, die Ihnen eine Reihe konkreter Operationen ermöglichen.

Von hier aus besteht die Grundidee darin, die Tasten abzufragen, die Beschleunigung dieses Updates von dieser und Schwerkraft einzustellen, die Geschwindigkeit durch Aktualisieren der alten Geschwindigkeit mit Beschleunigung einzustellen, die Position durch Aktualisieren der alten Position mit Geschwindigkeit zu setzen und für immer zu wiederholen.

0

Wenn eine Kraft angewendet wird, wird dem Objekt eine Beschleunigung in Bezug auf die Masse in Richtung der Kraft hinzugefügt.

Zunächst würde ich vorschlagen, Variablen für die Masse Ihres Objekts, x und y Geschwindigkeit und seine x und y resultierenden Kraftkomponenten zu erstellen. Wenn dem Objekt eine Kraft hinzugefügt wird, wäre es einfacher, es in Bezug auf seine x- und y-Komponenten hinzuzufügen (wenn Sie die Kraft mit einem Winkel und einer Größe definieren möchten, können Sie opposite = sin(angle) * hypotenuse und adjacent = cos(angle) * hypotenuse verwenden, um die Kraft in Komponenten aufzuteilen Aber Vorsicht - das math Modul verwendet Radianten und pygame verwendet Grad.

Um die Kraft auf dem Bildschirm anwenden, Sie force = mass * acceleration können Sie die x- und y-Beschleunigungen auf dem Objekt zu finden, und diese Änderungen an den x- und y-Geschwindigkeiten des Objekts (das ist Ihre x_change und y_change). Wenden Sie dann die x- und y-Geschwindigkeiten auf die Position des Objekts an.

Wenn Sie wollen, dass es in Metern und Sekunden funktioniert, müssen Sie anstelle von Pixeln und Frames auch die Conversions berechnen: Verwenden Sie einfach Ihren Wert , um Frames pro Sekunde und Sie auszuarbeiten kann einen Wert für Pixel pro Meter ergeben.

Wie für die Schwerkraft, die angewandte Kraft = Masse * Gravitationsfeldstärke (die Gravitationsfeldstärke auf der Erde ist 9,81 Newton/Kilogramm). Mit dieser Formel können Sie Ihrem Objekt die Schwerkraft hinzufügen wie jede andere Kraft. Die Erdbeschleunigung ist immer die gleiche wie die Gravitationsfeldstärke, was nützlich sein kann, wenn keine anderen vertikalen Kräfte angewendet werden.