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.rightdx 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.
Tantangan
Sedang- Setelah
player.x += dx, lakukan perulangan padawalls. - Untuk setiap wall yang bertabrakan dengan player: saat
dx > 0, tetapkanplayer.right = wall.left; saatdx < 0, tetapkanplayer.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
1Peta dari Teks
Level dalam TeksBaris dan KolomHuruf yang Memiliki MaknaTempat Pemain MemulaiSatu Layar Setiap Kali4Tabrakan dengan Platform
Dinding kiri dan kananMendarat di platformMembentur kepalaJatuh keluar dari levelSatu sumbu setiap kaliLatihan sendiri: Playground Pygame