Menu
CoddyTech

Dinding kiri dan kanan

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

Blok-blok sudah digambar, tetapi pemain bisa berjalan menembusnya. Dinding harus menghentikan pemain. Gerakkan pemain terlebih dahulu, lalu perbaiki gerakannya: jika pemain sekarang bertumpang tindih dengan dinding, dorong kembali keluar dari sisi tempat pemain datang.

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

dx adalah gerakan menyamping pada frame ini: nilai positif berarti ke kanan. Saat bergerak ke kanan, pemain menabrak sisi kiri dinding, jadi tepi kanannya ditempatkan di sana. Saat bergerak ke kiri, tepi kirinya ditempatkan di sisi kanan dinding.

Peta dibuat di dalam walls, sebuah list berisi Rect, dengan cara yang sama seperti di Maps from Text. Lantai tetap berupa garis pada FLOOR, dan pemain masih bisa jatuh ke bagian atas blok: berikutnya, kita akan membahas cara mendarat di dinding.

challenge icon

Tantangan

Sedang
  1. Setelah player.x += dx, lakukan perulangan pada walls.
  2. Untuk setiap wall yang bertabrakan dengan player: saat dx > 0, tetapkan player.right = wall.left; saat dx < 0, tetapkan player.left = wall.right.

Coba sendiri

import pygame

TILE = 36
SPEED = 4
GRAVITY = 1
JUMP = -15
MAX_FALL = 12
FLOOR = 324

LEVEL = [
    "................",
    "................",
    "................",
    "................",
    "................",
    "................",
    "................",
    "#..........##..#",
    "#.P..#.....##..#",
    "################",
]

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Walls")
clock = pygame.time.Clock()

background = pygame.image.load("assets/backgrounds/clouds.png").convert_alpha()
block_img = pygame.image.load("assets/images/block.png").convert_alpha()
player_img = pygame.image.load("assets/images/player.png").convert_alpha()

walls = []
for row, line in enumerate(LEVEL):
    for col, char in enumerate(line):
        if char == "#":
            walls.append(pygame.Rect(col * TILE, row * TILE, TILE, TILE))
        elif char == "P":
            start = (col * TILE + TILE // 2, row * TILE + TILE)

player = player_img.get_rect(midbottom=start)
vel_y = 0
on_ground = False

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

    vel_y = min(vel_y + GRAVITY, MAX_FALL)
    player.y += vel_y
    on_ground = False
    if player.bottom > FLOOR:
        player.bottom = FLOOR
        vel_y = 0
        on_ground = True

    for y in range(0, 360, 72):
        for x in range(0, 576, 72):
            screen.blit(background, (x, y))
    for wall in walls:
        screen.blit(block_img, wall)
    screen.blit(player_img, player)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Semua pelajaran di Dunia Game

Latihan sendiri: Playground Pygame