Ich versuche ein einfaches Spiel mit Pygame (Python-Bibliothek) zu entwickeln.
Ich habe ein sprite
Objekt, player
und ich bewege es mit den Pfeiltasten. Wenn ich die Maus nicht bewege, bewegt sich das Sprite normal, aber wenn ich die Maus bewege, bewegt sich das Sprite schneller (wie x2 oder x3). Das player
Objekt befindet sich im charsGroup
var.
Ich habe das Spiel in W7 und in Ubuntu ausgeführt. Das Gleiche passiert in beiden Betriebssystemen.
Ich habe mehr Wesen, die sich wie NPCs und Kugeln bewegen, aber sie werden nicht beeinflusst, nur der Spieler. In Anbetracht dessen denke ich, dass das Problem möglicherweise eine direkte Verbindung mit dem Bewegungssystem des Players (Pfeiltasten) hat.
Hier ist die update()
Methode des player
Objekts:
def update(self):
for event in pygame.event.get():
key = pygame.key.get_pressed()
mouseX, mouseY = pygame.mouse.get_pos()
if event.type == pygame.MOUSEBUTTONDOWN:
self.bulletsGroup.add(Bullet(pygame.image.load("bullet.png"),
self.rect.x + (self.image.get_width()/2),
self.rect.y + (self.image.get_height()/2),
mouseX, mouseY, 50, 50))
if key[pygame.K_RIGHT]:
if not self.checkCollision():
self.rect.x += 10
else:
self.rect.x -= 10
if key[pygame.K_LEFT]:
if not self.checkCollision():
self.rect.x -= 10
else:
self.rect.x += 10
if key[pygame.K_UP]:
if not self.checkCollision():
self.rect.y -= 10
else:
self.rect.y += 10
if key[pygame.K_DOWN]:
if not self.checkCollision():
self.rect.y += 10
else:
self.rect.y -= 10
Und hier ist die while-Schleife:
while True:
if PLAYER.healthBase <= 0:
GAMEOVER = True
if not GAMEOVER:
mapTilesGroup.draw(SCREEN)
charsGroup.update()
charsGroup.draw(SCREEN)
npcsGroup.update()
npcsGroup.draw(SCREEN)
drawBullets()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if GAMEOVER:
myfont = pygame.font.SysFont("monospace", 30)
label = myfont.render("GAME OVER!", 1, (255, 255, 0))
SCREEN.blit(label, (400, 300))
freq.tick(0)
pygame.display.flip()
Ich weiß nicht, was Sie noch brauchen können, um mir zu helfen, aber alles, was Sie brauchen (mehr Informationen oder Code), fragen Sie einfach danach!
BULLET_IMAGE = pygame.image.load("bullet.png")
und dann späterself.bulletsGroup.add(Bullet(BULLET_IMAGE...
Antworten:
tl; dr nicht mischen Ihre Ereignisschleife mit Ihrem Spiel Schleife .
Wenn Sie Ihre Maus bewegen, erhält das Spiel eine Menge
pygame.MOUSEMOTION
Ereignisse. Sie verwenden diese Ereignisse jedoch nicht, um Ihre Mausposition zu aktualisieren, sondern um den aktuellen Status der Maus zu ermittelnpygame.mouse.get_pos()
. Das ist ineffizient, aber es ist nicht das Problem.Das Problem ist, dass Sie die Spielerposition in der Event-Schleife aktualisieren !
Folgendes soll passieren:
So funktioniert Ihr Code:
Wenn Sie die Maus bewegen, wird die Ereignisschleife mehrmals pro Frame ausgeführt. Wenn Sie jedoch überprüfen, mit welchen Tasten Sie gedrückt sind
pygame.key.get_pressed()
, bleiben diese gedrückt, bis Sie einige Zeit später loslassen. Während Ihre Ereignisschleife die Mausbewegungsereignisse durchläuft, werden die Spielerbewegungen wiederholt angewendet.Die Lösung ist einfach: Bewegen Sie den Player außerhalb der Ereignisschleife.
quelle
pygame.mouse.get_pos()
ist das ineffizient? Welche Alternativen habe ich?pygame.mouse.get_pos()
unabhängig von der Ereigniswarteschlange die aktuelle Position der Maus ab, sodass Sie sie nicht in die Ereignisschleife einfügen müssen. Die Alternative wäre, jedenpygame.MOUSEMOTION
selbst zu bearbeiten, aber wenn Sie nicht jedes Ereignis benötigen (z. B. wenn Sie ein Malprogramm schreiben), reicht die letzte Position aus.Hier sind einige weitere Gedanken, die die bestehende Antwort ergänzen .
Gaffer On Games hat einen großartigen Artikel über Game Loops , auf den überall verwiesen wurde.
Ihre Spielrunde sollte verschiedene unabhängige Phasen haben: Eingabe, Aktualisierung, Rendern.
Sie können beispielsweise Eingaben 30-mal pro Sekunde lesen (oder in Echtzeit, um eine bessere Reaktionszeit zu erzielen), 30 Aktualisierungen pro Sekunde durchführen und 60 Bilder pro Sekunde rendern, oder welche Werte auch immer für Ihr Spiel gut geeignet sind.
quelle