2016-08-29 15 views
1

Ich habe ein Objekt/Bild auf der main_screen hinzugefügt, das Objekt heißt cancer_cell. Was ich hier versuche ist, dass ich das Objekt reibungslos bewegen möchte. Ich muss mehrmals auf die Pfeiltasten drücken, um es in Bewegung zu halten. Wie kann ich es bewegen while Pfeiltasten gedrückt werden?Pygame - Glatter Bewegung

hier ist der Code:

exitgame = False 
cellpos_x = 0 
cellpos_y = cancer_cell.get_rect().height*2 
while not exitgame: 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      exitgame = True 
      quitgame() 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_LEFT: 
       cellpos_x -= 10 
      if event.key == pygame.K_RIGHT: 
       cellpos_x += 10 


    gameplay_bg = pygame.image.load("/Users/wolf/Desktop/python/img/gameplay_bg.png").convert() 
    main_screen.fill(white) 
    main_screen.blit(gameplay_bg, [0,0]) 
    main_screen.blit(cancer_cell, [cellpos_x, cellpos_y]) 
    pygame.display.flip() 
    clock.tick(20) 

jemand hat mir gesagt, die Lösung bei How to use pygame.KEYDOWN versuchen: aber das hat nicht funktioniert. Oder vielleicht habe ich es falsch:

if event.type == pygame.KEYDOWN: 
    key_pressed = pygame.key.get_pressed() 
    if key_pressed[pygame.K_LEFT]: 
     cellpos_x -= 10 
    if key_pressed[pygame.K_RIGHT]: 
     cellpos_x += 10 
+0

Sie möchten vielleicht klären, was Sie fragen. – Sevanteri

+0

Also habe ich dieses Objekt/Bild auf dem 'main_screen', welches' cancer_cell' heißt, Wenn ich mit den Pfeiltasten bewege, muss ich mehrmals drücken, sonst bewegt es sich nicht wenn ich die Taste gedrückt halte. –

+0

Bitte editieren Sie die Frage anstatt zu kommentieren. – Sevanteri

Antwort

0

Problem gelöst

I gelöst haben das Problem, indem nur unindenting diesen Teil von der FOR Schleife während nicht exitgame:

for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      exitgame = True 
      quitgame() 

    key_pressed = pygame.key.get_pressed() 
    if key_pressed[pygame.K_LEFT]: 
     cellpos_x -= 10 
    if key_pressed[pygame.K_RIGHT]: 
     cellpos_x += 10 
+0

Grundsätzlich geht es hier darum, dass die Event-Schleife den Event-Effekt nur einmal anwendet. dh 'if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: tu stuff' bedeutet, dass Pygame erkennt, dass Sie die linke Pfeiltaste gedrückt haben, tun Sie, was Sie auch immer EINMAL fragen, und warten Sie dann auf Sie um den Schlüssel loszulassen und ihn erneut zu drücken, bevor Sie den Effekt erneut ausführen. Deshalb musst du die Taste gedrückt halten. Die Verwendung von pygame.key.get_pressed() bedeutet jedoch, dass pygame diesen Wert kontinuierlich überprüft, ohne dass Sie den Schlüssel freigeben müssen. Dies ist ein wichtiger Unterschied. – Sorade

+0

Behalten Sie dies im Hinterkopf, wenn Sie zum Beispiel ein Sprite ständig der Mausposition folgen lassen (Sie würden 'pygame.mouse_getpos()' wahrscheinlich außerhalb der Ereignisschleife haben), wenn Sie eine Schaltfläche implementieren möchten nur einmal pro Klick auf die Schaltfläche auftreten (wahrscheinlich besser, eine Bedingung aus der Ereignisschleife in diesem Fall zu verwenden). – Sorade

0

Ich sehe Sie haben das Problem mit dem Einzug behoben. Hier ist eine andere Version Ihres Beispiels:

import pygame 

class Player(object): 
    def __init__(self, img_path): 
     self.image = pygame.image.load(img_path) 
     self.x = 0 
     self.y = self.image.get_rect().height*2 

    def handle_keys(self): 
     key = pygame.key.get_pressed() 
     dist = 1 
     if key[pygame.K_RIGHT]: 
      self.x += dist 
     elif key[pygame.K_LEFT]: 
      self.x -= dist 

    def draw(self, surface): 
     surface.blit(self.image, (self.x, self.y)) 


pygame.init() 
clock = pygame.time.Clock() 
size = width, height = 1024, 768 
speed = [2, 2] 
white = 1, 1, 1 
main_screen = pygame.display.set_mode(size) 
gameplay_bg = pygame.image.load("background.jpg") 
cancer_cell = Player("player.jpg") 
running = False 

while not running: 
    event = pygame.event.poll() 

    if event.type == pygame.QUIT: 
     running = True 

    main_screen.fill(white) 
    main_screen.blit(gameplay_bg, [0, 0]) 

    cancer_cell.handle_keys() 
    cancer_cell.draw(main_screen) 

    pygame.display.flip() 

    clock.tick(50) 
    pygame.display.set_caption("fps: " + str(clock.get_fps())) 

Sie müssen die Pfade der Bilder anpassen ("background.jpg", "player.jpg"), mit dieser Version laden Sie Ihr Sprite nicht mehr in die Spielereignisschleife und die Player-Bewegung sei glatt.