2016-05-27 22 views
1

Ich habe gerade angefangen zu versuchen, über Pygame zu lernen, und ich habe in Schwierigkeiten geraten, wenn ich versuche, mein Rechteck um den Bildschirm zu bewegen. Ich habe es so eingestellt, dass, wenn ich jede der Pfeiltasten drücke, das Rechteck nach oben, unten, links und rechts bewegt wird. Wenn ich jedoch die Tasten gedrückt halte, wird es sich nicht weiter bewegen. Ich muss die Tasten mehrmals drücken, damit sie sich überall bewegen kann.glatte Bewegung in Pygame

Ich habe versucht, mit der pygame.key.get_pressed() -Methode wie in der Post Python - Smooth Keyboard Movement in Pygame beantwortet, aber nichts funktioniert.

Ich bemerkte, dass hin und wieder, wenn ich die Pfeiltasten für eine Weile gedrückt halte, das Rechteck sich nur für etwa eine Sekunde bewegt, dann hält es an.

Diese Frage wurde wahrscheinlich schon früher beantwortet, aber ich konnte keine Antwort finden. Hier

ist der Code:

import pygame 
import os 
import sys 

_image_library = {} 
def get_image(path): 
    global _image_library 
    image = _image_library.get(path) 
    if image == None: 
      canonicalized_path = path.replace('/', os.sep).replace('\\', os.sep) 
      image = pygame.image.load(canonicalized_path) 
      _image_library[path] = image 
    return image 

def detect_collision(x,y): 
    if x > 340: 
     x -= 1 
    if y > 240: 
     y -= 1 
    if y < 0: 
     y += 1 
    if x < 0: 
     x += 1 
    return x,y 

pygame.init() 
screen = pygame.display.set_mode((800, 550)) 
done = False 
clock = pygame.time.Clock() 

x = 30 
y = 30 

pygame.mixer.music.load("song.mp3") 
pygame.mixer.music.play() 

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

    pressed = pygame.key.get_pressed() 
    if pressed[pygame.K_UP]: 
     y -= 1 
     x,y = detect_collision(x, y) 
    if pressed[pygame.K_DOWN]: 
     y += 1 
     x,y = detect_collision(x, y) 
    if pressed[pygame.K_LEFT]: 
     x -= 1 
     x,y = detect_collision(x, y) 
    if pressed[pygame.K_RIGHT]: 
     x += 1 
     x,y = detect_collision(x, y) 

    screen.fill((255, 255, 255)) 

    pygame.draw.rect(screen, (0, 128, 0), pygame.Rect(x, y, 60, 60)) 

    pygame.display.flip() 
    clock.tick(60) 
+0

Ich benutze Python 2.7.11 (gleich mit Pygame) und ich bin auf einem Windows 10 Computer, wenn das einen Unterschied macht. – somerandomnerd

Antwort

1

Ich hatte ein ähnliches Problem, so dass anstelle der Verwendung get_pressed(), verwende ich ein dict und aktualisieren, wenn eine Taste gedrückt wird:

pressed = {} 

while True: 
    for event in pygame.event.get(): 
     if event.type == KEYUP: 
      pressed[event.key] = False 
     elif event.type == KEYDOWN: 
      pressed[event.key] = True 

Um zu testen, ob eine Taste (z. B. der Pfeil nach oben) gedrückt wurde, verwenden Sie einfach die Hauptereignisschleife (dh die while T).

if pressed.get(K_UP): 
    # Do something 

bereuen).

+0

Danke für die Antwort. Ich habe versucht, ein Wörterbuch zu erstellen, aber ich denke, ich habe es falsch eingerichtet. Ich habe press.get() verwendet, um ein Rechteck erscheinen zu lassen, wenn ich den Pfeil nach oben drücke und es funktioniert. Dann habe ich es geändert, um zu versuchen, ein Rechteck zu bewegen, wenn ich die Pfeiltasten drücke, aber es bewegt sich nicht. Hier ist der Code: – somerandomnerd

+0

Hoppla. Ich weiß natürlich nicht, was ich hier mache. Hab gestern meinen Account gemacht, haha. Ich weiß nicht, wie ich den Code in einen Kommentar schreiben soll. @Qudit – somerandomnerd

+0

Es gibt keine Möglichkeit, große Mengen von Text in Kommentare einzufügen. Sie könnten Ihre Frage jedoch bearbeiten – Qudit