Menu
CoddyTech

Kumpulkan Koin

Termasuk bagian Dunia Game dalam perjalanan Pygame di Coddy. Pelajaran 31 dari 35.

Koin memberi penjelajah sesuatu untuk dikejar: beberapa koin menggantung di atas lubang, sehingga mengambilnya berisiko.

Baca setiap C ke dalam list Rects, yaitu seluruh tile, karena coin.png memiliki batas kosongnya sendiri. Saat pemain menyentuh koin, keluarkan koin itu dari list dan hitung jumlahnya:

for coin in coins[:]:
    if player.colliderect(coin):
        coins.remove(coin)
        coins_collected += 1

coins[:] adalah salinan list. Menghapus item dari list saat perulangan berjalan di atasnya akan menggeser item di bawah perulangan dan melewati satu item. Menelusuri salinan akan menghindari hal itu.

Tampilkan jumlahnya di sudut kanan atas. Jumlah ini milik window, bukan level, jadi gambarkan tanpa camera:

font = pygame.font.Font("assets/fonts/pixel.ttf", 24)
# di dalam perulangan
text = font.render(f"Coins: {coins_collected}", True, (255, 255, 255))
screen.blit(text, text.get_rect(topright=(WIDTH - 12, 14)))
challenge icon

Tantangan

Sedang
  1. Muat coin.png ke dalam coin_img dan buat font dari assets/fonts/pixel.ttf dengan ukuran 24.
  2. Buat coins = [] dan coins_collected = 0; dalam perulangan peta, tambahkan Rect petak untuk setiap C.
  3. Pada setiap frame, setelah pergerakan, hapus setiap koin yang disentuh pemain dan tambahkan 1 ke coins_collected.
  4. Gambar setiap koin pada posisi x dikurangi camera_x, serta teks Coins: dan jumlahnya di kanan atas, seperti yang ditunjukkan.

Coba sendiri

import pygame

TILE = 36
WIDTH, HEIGHT = 576, 360
SPEED = 4
GRAVITY = 1
JUMP = -15
MAX_FALL = 12

LEVEL = [
    "................................................................",
    "................................................................",
    "................................................................",
    "................................................................",
    "#..............................................................#",
    "#....................C.........................#####...........#",
    "#......CC...C................CC.....CC.........#####.....CC....#",
    "#....................#.........................D...............#",
    "#.P.........#...E....#...^.......K......E......D.C....^......F.#",
    "#######..####################..##########################..#####",
]

pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Moss Caves")
clock = pygame.time.Clock()


def load(name):
    return pygame.image.load("assets/images/" + name).convert_alpha()


background = pygame.image.load("assets/backgrounds/forest.png").convert_alpha()
grass_img = load("grass.png")
grass_left_img = load("grass_left.png")
grass_right_img = load("grass_right.png")
dirt_img = load("dirt.png")
player_img = load("player.png")


def solid(row, col):
    if row < 0 or row >= len(LEVEL) or col < 0 or col >= len(LEVEL[0]):
        return False
    return LEVEL[row][col] == "#"


walls = []
tiles = []
for row, line in enumerate(LEVEL):
    for col, char in enumerate(line):
        rect = pygame.Rect(col * TILE, row * TILE, TILE, TILE)
        if char == "#":
            if solid(row - 1, col):
                image = dirt_img
            elif not solid(row, col - 1) and solid(row, col + 1):
                image = grass_left_img
            elif solid(row, col - 1) and not solid(row, col + 1):
                image = grass_right_img
            else:
                image = grass_img
            walls.append(rect)
            tiles.append((image, rect))
        elif char == "P":
            start = rect.midbottom

level_width = len(LEVEL[0]) * TILE
player = player_img.get_rect(midbottom=start)
vel_y = 0
on_ground = False
camera_x = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
            if on_ground:
                vel_y = JUMP
        elif event.type == pygame.KEYUP and event.key in (pygame.K_SPACE, pygame.K_UP):
            if vel_y < -4:
                vel_y = -4

    keys = pygame.key.get_pressed()
    dx = 0
    if keys[pygame.K_LEFT]:
        dx -= SPEED
    if keys[pygame.K_RIGHT]:
        dx += SPEED

    player.x += dx
    for wall in walls:
        if player.colliderect(wall):
            if dx > 0:
                player.right = wall.left
            elif dx < 0:
                player.left = wall.right

    vel_y = min(vel_y + GRAVITY, MAX_FALL)
    player.y += vel_y
    on_ground = False
    for wall in walls:
        if player.colliderect(wall):
            if vel_y > 0:
                player.bottom = wall.top
                on_ground = True
            elif vel_y < 0:
                player.top = wall.bottom
            vel_y = 0

    if player.top > HEIGHT:
        player.midbottom = start
        vel_y = 0

    camera_x = player.centerx - WIDTH // 2
    camera_x = max(0, min(camera_x, level_width - WIDTH))

    shift = camera_x // 3 % 72
    for y in range(0, HEIGHT, 72):
        for x in range(-shift, WIDTH, 72):
            screen.blit(background, (x, y))
    for image, rect in tiles:
        screen.blit(image, (rect.x - camera_x, rect.y))
    screen.blit(player_img, (player.x - camera_x, player.y))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Semua pelajaran di Dunia Game

Latihan sendiri: Playground Pygame