GOOGLE ADS

Dienstag, 19. April 2022

Pygame wartet darauf, dass der Schlüssel gehalten wird

Ich arbeite an einem einfachen Spiel mit Pygame, ich bin nicht der größte Fan von Python, also habe ich beschlossen, es selbst zu mögen.

Nun zum Thema. Wenn ich nach Tastendrücken suche, möchte ich, dass sich der Player weiter bewegt, wenn ich die Taste halte. Wenn ich den rechten Pfeil drücke, bewegt es sich einmal, wartet dann eine Sekunde und fährt dann fort. Ich bin mir nicht sicher, wie ich es beschreiben soll. So funktioniert DAS in Tetris.

Hier ist der Code, ich werde nicht alles posten, aber ich werde alle wichtigen Dinge posten

player.py

import pygame
from settings import *
from tileset import TileSet
class Player(pygame.sprite.Sprite):
def __init__(self, pos, group):
super().__init__(group)
self.image = TileSet('Assets/Actor/Characters/Princess/SpriteSheet.png', 16, 16).get(0,0)
self.SCALE_FACTOR = 4
self.size = self.image.get_size()
self.image = pygame.transform.scale(self.image, (int(self.size[0] * self.SCALE_FACTOR), int(self.size[0] * self.SCALE_FACTOR)))
self.rect = self.image.get_rect(topleft = pos)
self.direction = pygame.math.Vector2()
self.speed = 10
def input(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_w]:
self.direction.y = -1
elif keys[pygame.K_s]:
self.direction.y = 1
else:
self.direction.y = 0
if keys[pygame.K_d]:
self.direction.x = 1
elif keys[pygame.K_a]:
self.direction.x = -1
else:
self.direction.x = 0
def move(self, speed):
self.rect.center += self.direction * speed
def update(self):
self.input()
self.move(self.speed)

level.py

import pygame
from settings import *
from tile import Tile
from player import Player
from debug import debug
class Level:
def __init__(self):
self.dsurf = pygame.display.get_surface()
self.visible_sprites = pygame.sprite.Group()
self.obstacle_sprites = pygame.sprite.Group()
self.create_map()
def create_map(self):
for row_i, row in enumerate(WORLD_MAP):
for col_i, col in enumerate(row):
x = col_i * TILE_SIZE
y = row_i * TILE_SIZE
if col == 'x':
Tile((x, y), [self.visible_sprites, self.obstacle_sprites])
if col == 'p':
self.player = Player((x, y), [self.visible_sprites])
def tick(self):
self.visible_sprites.draw(self.dsurf)
self.visible_sprites.update()
debug(f"Player direction: {self.player.direction}")

main.py

import pygame
import pygame.locals
import sys
from settings import *
from level import Level
class Game:
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Darka")
self.clock = pygame.time.Clock()
self.level = Level()
def run(self):
while pygame.event.wait().type!= pygame.locals.QUIT:
self.screen.fill('black')
self.level.tick()
pygame.display.update()
self.clock.tick(FPS_CAP)
if __name__ == "__main__":
game = Game()
game.run()


Lösung des Problems

Ich würde Ihre Hauptschleife ändern, um Ereignisse an das Spieler-Sprite weiterzuleiten, und seine Aktualisierungsfunktion aufrufen

def run(self):
finished = False
while not finished:
for event in pygame.event.get():
if event.type == pygame.QUIT:
finished = True
elif event.type in (pygame.KEYDOWN, pygame.KEYUP):
#send all keys to player sprite
self.level.player.move(event)
self.screen.fill('black')
self.level.player.move() # or add to level.tick()
self.level.tick()
pygame.display.update()
self.clock.tick(FPS_CAP)


Änderungen an der Player-Sprite- input()Funktion

def input(self, event):
if event.type == pygame.KEYDOWN
if event_key == pygame.K_w:
self.direction.y = -1
elif event_key ==pygame.K_s:
self.direction.y = 1
elif event_key == pygame.K_d:
self.direction.x = 1
elif event_key == pygame.K_a]:
self.direction.x = -1
elif event.type == pygame.KEYUP:
if event_key in (pygame.K_w, pygame.K_s):
self.direction.y = 0
elif event_key in (pygame.K_d, pygame.K_a):
self.direction.x = 0

Auf diese Weise sollte sich Ihr Sprite in Bewegung setzen, wenn Sie eine Richtungstaste drücken, und beim Loslassen anhalten.

Hinweis: ungetesteter Code.

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...