Kontinuierliche Bewegung einer Box in Pygame

Ich habe den folgenden Code geschrieben, der ein einfaches Spiel schafft, bei dem man auf einen Pfeil auf der Tastatur klickt, verschiebt ein Kasten eine Einheit im Spiel.

Ich versuche es so zu machen, dass, wenn ich einen der Pfeiltasten drücke, die Box weiter in diese Richtung bewegt wird, bis ein anderer Pfeil gedrückt wird. Also, wenn ich den rechten Pfeil einmal anstelle von scooting +50 Pixel drückt, bewegt es sich kontinuierlich über den Bildschirm, bis ein anderer Pfeil angeklickt wird und dann wird es so gehen

import pygame #importing the pygame library # some initializations pygame.init() # this line initializes pygame window = pygame.display.set_mode( (800,600) ) # Create a window with width=800 and height=600 pygame.display.set_caption( 'Rectangle move' ) # Change the window's name we create to "Rectangle move" clock = pygame.time.Clock() # Clocks are used to track and control the frame-rate of a game (how fast and how slow the pace of the game) # This line creates and initializes a clock. # color definitions, using RBG color model. black = (0,0,0) white = (255,255,255) # initial center position for the square (bob) x,y = 0,0 lastKey=0 game_loop=True while game_loop: for event in pygame.event.get(): # loop through all events if event.type == pygame.QUIT: game_loop = False # change the game_loop boolean to False to quit. if event.type == pygame.KEYDOWN: lastKey = event.key #check last entered key #lastKey equals "LEFT", "RIGHT", "UP", "DOWN" --> do the required stuff! #set x coordinate minus 50 if left was pressed if lastKey == pygame.K_LEFT: x -= 50 if lastKey == pygame.K_RIGHT: x += 50 if lastKey == pygame.K_UP: y += 50 if lastKey == pygame.K_DOWN: y -= 50 if event.key == pygame.K_LEFT: x -= 50 if event.key == pygame.K_RIGHT: x += 50 if event.key == pygame.K_UP: y += 50 if event.key == pygame.K_DOWN: y -= 50 # draw and update screen window.fill( black ) # fill the screen with black overwriting even bob. pygame.draw.rect( window, white, (x, y, 50, 50) ) # draw bob on the screen with new coordinates after its movement. # the parameters are as follows: window: is the window object you want to draw on. white: the object color used to fill the rectangle # (x,y,50,50) x is the x position of the left side of the rectangle. y is the y position of the upper side of the rectangle. # In other words (x,y) is the coordinate of the top left point of the rectangle. # 50 is the width, and 50 is the height pygame.display.update() #updates the screen with the new drawing of the rectangle. #fps stuff: clock.tick(10) # this controls the speed of the game. low values makes the game slower, and large values makes the game faster. pygame.quit() 

Jede Hilfe wäre sehr geschätzt.

3 Solutions collect form web for “Kontinuierliche Bewegung einer Box in Pygame”

Sie möchten den Status Ihrer Anwendung ändern, wenn Sie eine Taste drücken. Also brauchst du eine Variable, um diesen Zustand zu verfolgen (der Staat ist: Welche Richtung soll die Box bewegen? ).

Hier ist ein komplettes, minimales Beispiel, das tut was du suchst. Beachten Sie die Kommentare.

 import pygame, sys pygame.init() screen = pygame.display.set_mode((640, 480)) screen_r = screen.get_rect() clock = pygame.time.Clock() rect = pygame.rect.Rect(0, 0, 50, 50) # let's start at the center of the screen rect.center = screen_r.center # a dict to map keys to a direction movement = {pygame.K_UP: ( 0, -1), pygame.K_DOWN: ( 0, 1), pygame.K_LEFT: (-1, 0), pygame.K_RIGHT: ( 1, 0)} move = (0, 0) # a simple helper function to apply some "speed" to your movement def mul10(x): return x * 10 while True: for e in pygame.event.get(): if e.type == pygame.QUIT: sys.exit() # try getting a direction from our dict # if the key is not found, we don't change 'move' if e.type == pygame.KEYDOWN: move = movement.get(e.key, move) # move the rect by using the 'move_ip' function # but first, we multiply each value in 'move' with 10 rect.move_ip(map(mul10, move)) # ensure that 'rect' is always inside the screen rect.clamp_ip(screen_r) screen.fill(pygame.color.Color('Black')) pygame.draw.rect(screen, pygame.color.Color('White'), rect) pygame.display.update() clock.tick(60) 

Ich benutze einen Rect anstatt die Spur von zwei Koordinaten x und y behalten, da das erlaubt, die move_ip und clamp_ip Funktionen zu nutzen, um das move_ip innerhalb des Bildschirms leicht zu verschieben.

Versuchen Sie, den eingegebenen Schlüssel in eine Variable zu speichern und nach Ihrer Event-Loop zu überprüfen. So was:

 #... lastKey = None while game_loop: for event in pygame.event.get(): # loop through all events if event.type == pygame.QUIT: game_loop = False # change the game_loop boolean to False to quit. if event.type == pygame.KEYDOWN: lastKey = event.key #check last entered key #lastKey equals "LEFT", "RIGHT", "UP", "DOWN" --> do the required stuff! #set x coordinate minus 50 if left was pressed if lastKey == pygame.K_LEFT x -= 50 #<add the other statements here> #(...) 

Ich würde empfehlen, diese vielen if-Aussagen nicht zu benutzen. Es könnte ein bisschen verwirrend nach einiger Zeit. Überprüfen Sie die folgende Frage, um Ihren Code zu speichern:

Ersetzungen für switch-Anweisung in Python?

Hier sind zwei Versionen, die erste demonstriert, wie man eine Event-Loop nutzen kann, um eine kontinuierliche Bewegung zu erhalten (ähnlich der Fault-Lösung, aber ein bisschen einfacher für Anfänger, die noch keine Wörterbücher kennen), die zweite zeigt, wie man das mit pygame.key.get_pressed() .

Die Tastenbetätigungen stellen die Geschwindigkeit auf einen neuen Wert ein, der in der while-Schleife verwendet wird, um die x- und y-Positionen des rect zu ändern. Ich empfehle auch, einen pygame.math.Vector2 anstelle der velocity_x und velocity_y Variablen zu verwenden.

 import sys import pygame as pg def main(): screen = pg.display.set_mode((640, 480)) clock = pg.time.Clock() rect = pg.Rect(100, 200, 40, 60) velocity_x = 0 velocity_y = 0 done = False while not done: for event in pg.event.get(): if event.type == pg.QUIT: done = True elif event.type == pg.KEYDOWN: if event.key == pg.K_d: velocity_x = 4 elif event.key == pg.K_a: velocity_x = -4 elif event.type == pg.KEYUP: if event.key == pg.K_d and velocity_x > 0: velocity_x = 0 elif event.key == pg.K_a and velocity_x < 0: velocity_x = 0 rect.x += velocity_x rect.y += velocity_y screen.fill((40, 40, 40)) pg.draw.rect(screen, (150, 200, 20), rect) pg.display.flip() clock.tick(30) if __name__ == '__main__': pg.init() main() pg.quit() sys.exit() 

pygame.key.get_pressed hat den Nachteil, dass man die Reihenfolge der pygame.key.get_pressed nicht kennen kann, aber der Code sieht etwas einfacher aus.

 import sys import pygame as pg def main(): screen = pg.display.set_mode((640, 480)) clock = pg.time.Clock() rect = pg.Rect(100, 200, 40, 60) velocity = (0, 0) done = False while not done: for event in pg.event.get(): if event.type == pg.QUIT: done = True keys = pg.key.get_pressed() if keys[pg.K_d]: rect.x += 4 if keys[pg.K_a]: rect.x -= 4 screen.fill((40, 40, 40)) pg.draw.rect(screen, (150, 200, 20), rect) pg.display.flip() clock.tick(30) if __name__ == '__main__': pg.init() main() pg.quit() sys.exit() 
  • Pygame, Töne spielen nicht
  • Python3.2 Wie kann man Schildkröte aus dem Bildschirm gehen und wenn es zurückgesetzt wird?
  • Pygame zeigt mehrere Bilder zufällig an
  • Pygame funktioniert nicht mit portable python
  • Pygame - Recolor Pixes einer bestimmten Farbe zu einem anderen mit SurfArray (Array Slicing Problem)
  • Pygame: Wie man in Nicht-Rechteck-Clipping-Bereich zu zeichnen
  • Pygame sprite wall collision
  • Zeichne einen Kreis in Pygame mit Tkinter
  • Pygame capture keyboard events wenn fenster nicht im fokus
  • Pygame für python 2.7.3
  • Python - erstellen Sie eine EXE, die Code wie geschrieben, nicht wie es war, wenn kompiliert
  • Python ist die beste Programmiersprache der Welt.