2016-04-08 11 views
-1

Ich versuche, einen einfachen Fahrsimulator von oben nach unten zu machen, wo Sie die Pfeiltaste nach oben gedrückt halten und mit den Pfeiltasten nach rechts/links steuern. Idealerweise bewegt sich das Auto in einem Kreis, wenn Sie gleichzeitig die Auf-Taste und die Links- oder Rechts-Taste gedrückt halten.Probleme mit einem einfachen Fahrspiel

Das Auto sollte die gleiche Entfernung auf dem Bildschirm jeden Rahmen bewegen, unabhängig von der Richtung. Ich entwickelte einen Satz von Gleichungen, um die x- und y-Koordinaten mit einer gegebenen Richtung (in Grad) zu berechnen. Es behandelt jede Bewegung wie ein rechtwinkliges Dreieck. Die Hypotenuse ist die eingestellte Entfernung, die das Auto unabhängig von der Richtung zurücklegt. Die anderen zwei Seiten sind die x- und y-Werte, die erforderlich sind, um die spezifische Länge der Hypotenuse zu erreichen. Es verwendet die Kosinusfunktion, um eine Seite zu finden, und den Satz von Pythagoras, um die letzte Seite zu finden.

Ich habe es auf Millimeterpapier getestet und es bewegt sich immer die gleiche Strecke jedes Mal unabhängig von der Richtung. Das Problem ist, dass sich das Auto nicht in einem Kreis bewegt (wenn Sie weiter lenken). Die Standardrichtung ist 0 Grad. Wenn Sie also die Aufwärtstaste gedrückt halten, bewegt sich das Auto geradeaus. Wenn Sie anfangen, sich im Uhrzeigersinn zu drehen (rechte Pfeiltaste), beginnt das Auto, sich nach rechts zu biegen. Aber an einem bestimmten Punkt wird es sich nicht im Kreis bewegen. Versuchen Sie, den Code auszuführen, und es wird Sinn ergeben.

* die Richtung in Radianten umgewandelt wird, weil das ist, was Python

import pygame, math 

screen = pygame.display.set_mode((1000, 700)) 
clock = pygame.time.Clock() 

# The center of the sceen 
x = 475 
y = 325 

drive = 0 # 0 = not moving, 1 = moving 
turn = 0 # 1 = clockwise, -1 = counter-clockwise 

d = 0 

def move(d, c): 
    d = math.radians(d) 
    a = math.cos(d) * c 
    b = math.sqrt((c**2) - (a**2)) 

    return a, b 


def main(): 
    while True: 
     global x, y, drive, turn, d 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit() 
       quit() 

      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_UP: 
        drive = 1 
       if event.key == pygame.K_RIGHT: 
        turn = 1 
       if event.key == pygame.K_LEFT: 
        turn = -1 
      if event.type == pygame.KEYUP: 
       if event.key == pygame.K_UP: 
        drive = 0 
       if event.key == pygame.K_RIGHT: 
        turn = 0 
       if event.key == pygame.K_LEFT: 
        turn = 0 


     if drive == 1: 
      if turn == 1 and d != 359: # Turn Clockwise 
       d += 4 
      if turn == 1 and d == 359: 
       d = 0 
      if turn == -1 and d != 0: # Turn Counter Clockwise 
       d -= 4 
      if turn == -1 and d == 0: 
       d = 359 


     ''' move()[0] = a 
      move()[1] = b ''' 
     if drive == 1: 
      if d >= 0 and d < 90: 
       x += move(d, 6)[1] 
       y -= move(d, 6)[0] 


      if d >= 90 and d < 180: 
       x += move(d-90, 6)[0] 
       y += move(d-90, 6)[1] 


      if d >= 180 and d < 270: 
       x -= move(d-90, 6)[1] 
       y += move(d-90, 6)[0] 


      if d >= 270 and d < 360: 
       x -= move(d-180, 6)[1] 
       y += move(d-180, 6)[0] 



     screen.fill((40,40,40)) 
     pygame.draw.rect(screen, (0,0,255), (round(x, 0), round(y, 0), 50, 50)) 


     pygame.display.update() 
     clock.tick(20) 


main() 
+0

In Ihrem Code, was passiert, wenn 'd> 360' oder' d <0 '? Ich kann mir vorstellen, dass dies sehr oft passiert, weil zum Beispiel "d + = 4" niemals gleich 359 ist und wenn man sich im Uhrzeigersinn genug dreht, "d> 360". – wflynny

+0

Ich habe das nicht bemerkt. Danke, dass du mich darauf aufmerksam gemacht hast. Es wird sich überhaupt nicht bewegen. –

Antwort

1

Im Anschluss an meinem Kommentar verwendet oben sieht es aus wie wenn Sie ändern:

if drive == 1: 
     if turn == 1 and d != 359: # Turn Clockwise 
      d += 4 
     if turn == 1 and d == 359: 
      d = 0 
     if turn == -1 and d != 0: # Turn Counter Clockwise 
      d -= 4 
     if turn == -1 and d == 0: 
      d = 359 

zu

if drive == 1: 
     if turn == 1 and d < 359: # Turn Clockwise 
      d += 4 
     if turn == 1 and d >= 359: 
      d = 0 
     if turn == -1 and d > 0: # Turn Counter Clockwise 
      d -= 4 
     if turn == -1 and d <= 0: 
      d = 359 

es hört nicht auf, sich zu bewegen. Ihre Regeln könnten jedoch drastisch vereinfacht werden. Nutzen Sie die volle Leistung der trigonometrischen Funktionen, indem Sie Ihre x, y Koordinaten direkt mit cos/sin seit sin(-y) = -sin(y) und cos(-x) = cos(x) aktualisieren. Ihr ganzes Skript könnte wie folgt aussehen:

def main(): 
    # define these here since you aren't modifying them outside of main 
    x = 475 
    y = 325 
    drive = 0 # 0 = not moving, 1 = moving 
    turn = 0 # 1 = clockwise, -1 = counter-clockwise 
    # set to -90 since 0 points east. 
    d = -90 

    while True: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit() 
       quit() 

      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_UP: 
        drive = 1 
       elif event.key == pygame.K_RIGHT: 
        turn = 1 
       elif event.key == pygame.K_LEFT: 
        turn = -1 
      if event.type == pygame.KEYUP: 
       if event.key == pygame.K_UP: 
        drive = 0 
       elif event.key in (pygame.K_RIGHT, pygame.K_LEFT): 
        turn = 0 

     if drive == 1: 
      d += turn * 4 

      x += 6 * math.cos(math.radians(d)) 
      y += 6 * math.sin(math.radians(d)) 

     screen.fill((40,40,40)) 
     pygame.draw.rect(screen, (0,0,255), (round(x, 0), round(y, 0), 50, 50)) 

     pygame.display.update() 
     clock.tick(20) 
+0

Danke! Das hilft sehr viel. Es funktioniert perfekt, aber ich verstehe die Zeile, die d + = turn * 4 sagt, nicht ganz. Und warum ist East 0 Grad statt North? –

Verwandte Themen