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