Glatte Tastatur-Bewegung in Pygame
Ich verwende diesen code, um einen player sprite verschieben um einen Bildschirm, wenn die Pfeiltasten gedrückt werden:
import pygame, sys, time
from pygame.locals import *
pygame.init()
FPS=30
fpsClock=pygame.time.Clock()
width=400
height=300
DISPLAYSURF=pygame.display.set_mode((width,height),0,32)
pygame.display.set_caption('Animation')
background=pygame.image.load('bg.png')
UP='up'
LEFT='left'
RIGHT='right'
DOWN='down'
sprite=pygame.image.load('down.png')
spritex=200
spritey=130
direction=DOWN
pygame.mixer.music.load('bgm.mp3')
pygame.mixer.music.play(-1, 0.0)
while True:
DISPLAYSURF.blit(background,(0,0))
DISPLAYSURF.blit(sprite,(spritex,spritey))
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if (event.key == K_LEFT):
spritex-=5
sprite=pygame.image.load('left.png')
elif (event.key == K_RIGHT):
spritex+=5
sprite=pygame.image.load('right.png')
elif (event.key == K_UP):
spritey-=5
sprite=pygame.image.load('up.png')
elif (event.key == K_DOWN):
spritey+=5
sprite=pygame.image.load('down.png')
pygame.display.update()
fpsClock.tick(FPS)
Das Bild ist in der Lage, wirklich bewegen, aber nur 5 Pixel, wenn die Taste gedrückt wird. Ich möchte für das Bild in Bewegung halten, während die Taste gedrückt gehalten wird (und fügen einfache Kollisionserkennung mit dem Fenster, aber das ist ein anderes Thema). Was würde das Bild in Bewegung zu halten, während die Taste gedrückt wird?
Ich empfehle 4 space Einrückung anstatt tabs.
InformationsquelleAutor oracleCreeper | 2012-12-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schlage ich vor, mit Variablen zu behalten, welche Pfeiltasten gedrückt werden, und welche nicht. Sie können die
KEYDOWN
undKEYUP
Veranstaltungen zur Aktualisierung der Variablen. Dann können Sie die position des Sprites jeden Rahmen, basierend auf die Tasten gedrückt werden. Dies bedeutet auch, können Sie leicht die Geschwindigkeit des Sprites in verschiedenen Richtungen, indem Sie, wie weit bewegt es sich in jedem frame.EDIT:
Oder wie @monkey vorgeschlagen, die Sie verwenden können, Schlüssel.get_pressed() statt.
Hier ist ein ungeprüftes Beispiel:
OP wird nur bewegen Sie in eine der Himmelsrichtungen, in einer Zeit, sondern Ihre Lösung bewegen sich in mehrere Richtungen, wenn mehrere Tasten gedrückt werden.
Dank für, die.
Mussmann: ich nahm mehrere Richtungen wollten, aber es kann leicht geändert werden, durch die Verwendung einer einzigen if-Anweisung passen Sie die position des Sprites (
elif keys_pressed...
eher alsif keys_pressed...
).Mir gefällt diese Lösung besser als meine eigenen. Ich habe nicht einmal in Erwägung ziehen Diagonal.
InformationsquelleAutor grc
Ich würde vorschlagen, mit der set_repeat Funktion. Statt Schlüssel erzeugen mehrere Ereignisse, in regelmäßigen Abständen(festgelegt durch die Parameter der Funktion).Auf diese Weise können Sie Ihren code unverändert (keine Notwendigkeit für zusätzliche Variablen).
Den Funktionsprototyp:
set_repeat(delay, Intervall)
Den ersten parameter Verzögerung ist die Anzahl von Millisekunden, bevor das erste wiederholt pygame.KEYDOWN gesendet werden. Nach, einer anderen pygame.KEYDOWN wird geschickt jedes Intervall in Millisekunden. Wenn keine Argumente übergeben werden, die Taste repeat deaktiviert ist.
Einfach verwenden Sie diese Funktion vor der main-loop.
Quelle: http://www.pygame.org/docs/ref/key.html#pygame.key.set_repeat
InformationsquelleAutor agent_Jay
Habe ich es wie folgt:
if (event.key == direction)
.Lol... Du hast ganz Recht
Auch konnte Sie nicht, Sie stellen nur
direction = event.key
wenndirection
ist einer von denen, die wir wollen? Überprüfen Sie die Mitgliedschaft mit einem Satz vielleicht?Auch nicht nötig, denn die bewegen-Funktion wird nicht alles tun, in den anderen Fällen.
Obwohl, wenn Sie drücken und halten Sie den linken Pfeil und drücken und lassen Sie die 'a' - Taste, das könnte das seltsame Verhalten.
InformationsquelleAutor jgritty
Ich würde dies tun, indem Sie einen etwas anderen Verlauf der Aktion innerhalb der Schleife.
Zur Aktualisierung der sprite, ich würde zuerst für eine
KEYDOWN
Ereignis und legen Sie danndirection
. Dann würde ich das updatesprite
,spritex
, undspritey
basierend aufdirection
. Dann würde ich prüfen, fürKEYUP
Veranstaltungen und setzendirection
auf dieser Basis, falls zutreffend.Hier ist, wie könnte ich code:
InformationsquelleAutor Sam Mussmann