2016-10-28 4 views
-3

image = https://www.dropbox.com/s/nx6yzx8ddhu36m7/car.png?dl=0Auto-Spiel funktioniert nicht richtig in pygame

wenn ich drehen (drücken Sie nach links oder rechts-Taste), während ich (nach oben drücken Taste) mein Auto bewegt sich auf eine seltsame Weise beschleunigen.

Auch ist es etwas falsch mit der

Geschwindigkeit zu beschleunigen, wie ich es zu erwarten, nicht erhöht. Ich denke, die Geschwindigkeit sollte mit der Zeit steigen, aber es geht nicht ...

kann mir bitte jemand helfen, indem Sie den Code versuchen?

danke

hier ist mein Code:

import pygame,math 
pygame.init() 
display_width = 1200 
display_height = 800 
white = (255,255,255) 
black = (0,0,0) 
car_image = pygame.image.load('car.png') 
role_model = pygame.image.load('role_model.png') 
clock = pygame.time.Clock() 
FPS = 30 
screen = pygame.display.set_mode([display_width,display_height]) 
car_width = 76 
car_height = 154 

def rotate(image, rect, angle): 
    rot_image = pygame.transform.rotate(image, angle) 
    rot_rect = rot_image.get_rect(center=rect.center) 
    return rot_image,rot_rect 

def carRotationPos(angle): 
    x=1*math.cos(math.radians(angle-90)) 
    y=1*math.sin(math.radians(angle-90)) 

    return x,y 

def gameloop(): 
    running = True 
    angle = 0 
    angle_change = 0 
    changeX = 0 
    changeY=0 
    x=0 
    y=0 
    change_x=0 
    change_y=0 
    speed = 1 
    speed_change = 1 
    rect = role_model.get_rect() 
    while running == True: 


     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       running = False 


      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_LEFT: 


        angle_change = 5 
        #changeX=0 
        #changeY=0 
       if event.key == pygame.K_RIGHT: 


        angle_change = -5 
        #changeX=0 
        #changeY=0 
       if event.key == pygame.K_UP: 

        #angle_change =0 
        changeX=-x 
        changeY=y 
        speed_change = speed_change**2 +1 

       if event.key == pygame.K_DOWN: 

        #angle_change =0 
        changeX=x 
        changeY=-y 
        speed_change = -(speed_change**2 + 1) 

      if event.type == pygame.KEYUP: 
       if event.key == pygame.K_LEFT: 
        angle_change = 0 

       if event.key == pygame.K_RIGHT: 
        angle_change = 0 

       if event.key == pygame.K_UP: 

        changeX=0 
        changeY=0 
        speed = 1 
        speed_change=1 
       if event.key == pygame.K_DOWN: 

        changeX=0 
        changeY=0 
        speed = 1 
        speed_change=1 

     if angle == -360 or angle == 360: 
      angle = 0 


     angle+=angle_change 
     change_x+=changeX 
     change_y+=changeY 
     speed+=speed_change 
     if speed > 20: 
      speed = 20 
     screen.fill(white) 
     x,y=carRotationPos(angle) 

     x=round(x,5)*speed 
     y=round(y,5)*speed 

     rot_image,rot_rect=rotate(car_image,rect,angle) 
     rot_rect=list(rot_rect) 

     rot_rect1=rot_rect[0]+display_width/2-car_width/2 
     rot_rect2=rot_rect[1]+display_height/2-car_height/2 
     rot_rect1+=change_x 
     rot_rect2+=change_y 
     del rot_rect[0] 
     del rot_rect[1] 
     rot_rect.insert(0,rot_rect1) 
     rot_rect.insert(1,rot_rect2) 

     screen.blit(rot_image,rot_rect) 

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

gameloop() 
pygame.quit() 
+5

"kann jemand reparieren bitte den Bug" werden wir es nicht reparieren helfe nur dabei – Raskayu

+2

* "Da stimmt auch etwas mit dem Beschleunigen nicht" * - was bedeutet das? – UnholySheep

+3

Willkommen bei SO! Sie können die Anleitung zum Stellen von Fragen [hier] (http://stackoverflow.com/help/how-to-ask) lesen. Bitte geben Sie genauere Informationen zur Fehlfunktion Ihres Programms an. – Jerrybibo

Antwort

2

Wenn Sie die Taste UP/DOWN dann setzen Sie changeX = x, changeY = y und Auto bewegt changeX verwenden, changeY.

Wenn Sie die Taste LEFT/DOWN dann ändern Sie angle und berechnen neue x, y aber changeX nicht ändert, changeY so Auto immer noch die gleiche Richtung bewegt (die gleiche changeX, changeY verwenden).


EDIT: es jetzt dreht sich richtig, wenn Sie sich zu bewegen, aber immer noch gibt es Probleme mit Rückwärtsbeschleunigung. Ich arbeite dran.

Ich benutze moving_up/moving_down zu aktualisieren changeX und changeY wenn Auto in Bewegung ist - so es aktuelle Winkel verwenden und x, y Richtung zu ändern.


EDIT: Beschleunigung Problem zu lösen: Sie haben speed_change = speed_change**2 + 1 zu verwenden, wenn Sie gehen auf und ab. Sie brauchen keinen negativen Wert, wenn Sie auf DOWN gehen, weil x_change = x, y_change = -y die Richtung ändert.

Neuer Code:

BTW: Ich füge ESC-Programm und RÜCK beenden Auto auf dem Bildschirm zu zentrieren (Reset Position)

import pygame 
import math 

# --- constants --- (UPPER_CASE) 

WHITE = (255, 255, 255) 
BLACK = ( 0, 0, 0) 

DISPLAY_WIDTH = 1200 
DISPLAY_HEIGHT = 800 

FPS = 30 

CAR_WIDTH = 76 
CAR_HEIGHT = 154 

# --- functions --- (lower_case) 

def rotate(image, rect, angle): 
    rot_image = pygame.transform.rotate(image, angle) 
    rot_rect = rot_image.get_rect(center=rect.center) 
    return rot_image, rot_rect 

def rotate_car_pos(angle): 
    x = math.cos(math.radians(angle-90)) 
    y = math.sin(math.radians(angle-90)) 
    return x, y 

def gameloop(): 

    # start position - screen center - so I don't have to add center later 
    car_rect = role_model.get_rect(center=screen_rect.center) 

    # --- 

    angle = 0 
    angle_change = 0 

    x = 0 
    y = 0 
    x_change = 0 
    y_change = 0 

    speed = 0 
    speed_change = 0 

    # --- 

    pos_x = 0 
    pos_y = 0 

    #--- 

    moving_up = False 
    moving_down = False 

    #recalculate = True 

    running = True 

    while running: 

     # --- events --- 

     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       running = False 

      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_ESCAPE: 
        running = False 

       elif event.key == pygame.K_BACKSPACE: 
        # reset position [for test only] 
        pos_x = 0 
        pos_y = 0 
        angle = 0 

       elif event.key == pygame.K_LEFT: 
        angle_change = 5 

       elif event.key == pygame.K_RIGHT: 
        angle_change = -5 

       elif event.key == pygame.K_UP: 
        moving_up = True 
        x_change = -x 
        y_change = y 
        speed_change = speed_change**2 + 1 

       elif event.key == pygame.K_DOWN: 
        moving_down = True 
        x_change = x 
        y_change = -y 
        speed_change = speed_change**2 + 1 

      elif event.type == pygame.KEYUP: 
       if event.key == pygame.K_LEFT: 
        angle_change = 0 

       elif event.key == pygame.K_RIGHT: 
        angle_change = 0 

       elif event.key == pygame.K_UP: 
        moving_up = False 
        x_change = 0 
        y_change = 0 
        speed = 0 
        speed_change = 0 

       elif event.key == pygame.K_DOWN: 
        moving_down = False 
        x_change = 0 
        y_change = 0 
        speed = 0 
        speed_change = 0 

     # --- updates --- 

     # - pos - 

     if x_change or y_change: 
      pos_x += x_change 
      pos_y += y_change 

      print('[DEBUG]: pos_x, pos_y: ', pos_x, pos_y) 

     # - angle - 

     # rotate olny when moving 
     #if moving_up or moving_down: 
     if angle_change: 
      angle += angle_change 

      while angle > 360: 
       angle -= 360 

      while angle < -360: 
       angle += 360 

      print('[DEBUG]: angle: ', angle) 

     # - speed - 

     if speed_change: 
      speed += speed_change 

      if speed > 20: 
       speed = 20 

      print('[DEBUG]: speed: ', speed) 

     # - others - 

     x, y = rotate_car_pos(angle) 

     x = round(x*speed, 5) 
     y = round(y*speed, 5) 

     print('[DEBUG]: x, y: ', x, y) 

     if moving_up: 
      x_change = -x 
      y_change = y 
     elif moving_down: 
      x_change = x 
      y_change = -y 

     #if recalculate: 
     rot_image, rot_rect = rotate(car_image, car_rect, angle) 

     rot_rect.centerx += pos_x 
     rot_rect.centery += pos_y 

     # --- draws --- 

     screen.fill(WHITE) 
     screen.blit(rot_image, rot_rect) 
     pygame.display.update() 

     # --- clock --- 

     clock.tick(FPS) 

# --- main --- 

pygame.init() 

car_image = pygame.image.load('car.png') 
role_model = pygame.image.load('car.png') 

screen = pygame.display.set_mode((DISPLAY_WIDTH, DISPLAY_HEIGHT)) 
screen_rect = screen.get_rect() 

clock = pygame.time.Clock() 

gameloop() 

pygame.quit() 
+0

danke für die tolle Erklärung !!! –