Berjalan
Pelajaran 3 dari 20 dalam kursus Proyek Pygame: Pertahankan Benteng di Coddy.
pygame.key.get_pressed() memberi tahu tombol mana yang sedang ditekan saat ini. Baca hasilnya setiap frame, lalu kesatria akan berjalan selama tombol panah ditekan, tanpa menunggu pengulangan tombol.
Beri kesatria speed dan method move, sehingga aturan cara berjalan melekat pada kesatria:
def move(self, keys):
if keys[pygame.K_LEFT]:
self.rect.x -= self.speed
if keys[pygame.K_RIGHT]:
self.rect.x += self.speed
self.rect.clamp_ip(courtyard)Gunakan empat if terpisah, bukan elif: jika tombol Up dan Right ditekan bersamaan, kesatria akan berjalan secara diagonal.
clamp_ip memindahkan Rect kembali ke dalam Rect lain jika sudah keluar, sehingga kesatria berhenti di dinding. _ip berarti in place: ini mengubah self.rect itu sendiri, bukan mengembalikan Rect baru.
Tantangan
Mudah- Di
Knight.__init__, aturself.speed = 3. - Tulis
move(self, keys): setiap tombol panah menggerakkan rect sebesarself.speed, lalu jalankanself.rect.clamp_ip(courtyard). - Di perulangan game, sebelum menggambar, panggil
knight.move(pygame.key.get_pressed()).
Coba sendiri
import pygame
WIDTH, HEIGHT = 720, 480
TILE = 48
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Hold the Keep")
clock = pygame.time.Clock()
def load(name):
return pygame.image.load("assets/images/" + name).convert_alpha()
floor_img = load("floor.png")
wall_img = load("wall.png")
knight_img = load("knight.png")
courtyard = pygame.Rect(TILE, TILE, WIDTH - 2 * TILE, HEIGHT - 2 * TILE)
background = pygame.Surface((WIDTH, HEIGHT))
for row in range(HEIGHT // TILE):
for col in range(WIDTH // TILE):
x = col * TILE
y = row * TILE
if courtyard.collidepoint(x, y):
background.blit(floor_img, (x, y))
else:
background.blit(wall_img, (x, y))
def draw(image, center):
screen.blit(image, image.get_rect(center=center))
class Knight(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = knight_img
self.rect = pygame.Rect(0, 0, 24, 24)
self.rect.center = courtyard.center
knight = Knight()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.blit(background, (0, 0))
draw(knight.image, knight.rect.center)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Semua pelajaran di Proyek Pygame: Pertahankan Benteng
Latihan sendiri: Playground Pygame