Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah
  1. Di Knight.__init__, atur self.speed = 3.
  2. Tulis move(self, keys): setiap tombol panah menggerakkan rect sebesar self.speed, lalu jalankan self.rect.clamp_ip(courtyard).
  3. 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