Membentur kepala
Termasuk bagian Dunia Game dalam perjalanan Pygame di Coddy. Pelajaran 17 dari 35.
Melompatlah di bawah platform, lalu pemain akan melewatinya ke atas dan mendarat di atasnya. Platform yang kokoh seharusnya menghentikan kepala pemain. Saat bergerak ke atas, vel_y bernilai negatif, jadi tambahkan kasus lainnya ke perulangan vertikal:
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 = 0Kepala pemain bergerak ke bagian bawah dinding, dan kecepatannya menjadi 0 dalam kedua kasus. Setelah terbentur, gravitasi langsung mulai membuat pemain jatuh. Tanpa vel_y = 0, pemain terus mencoba bergerak ke atas dan tersangkut di bawah platform sampai gravitasi menghabiskan lompatan.
Tanda vel_y menunjukkan dari sisi mana pemain datang, seperti dx untuk dinding: saat jatuh, pemain membentur bagian atas dinding; saat naik, bagian bawahnya.
Tantangan
Mudah- Dalam perulangan tabrakan vertikal, tambahkan kasus
vel_y < 0:player.top = wall.bottom. - Tetapkan
vel_y = 0setelah kedua kasus, agar benturan menghentikan gerakan naik.
Pemain mulai di bawah platform. Lompat untuk mencobanya.
Coba sendiri
import pygame
TILE = 36
SPEED = 4
GRAVITY = 1
JUMP = -15
MAX_FALL = 12
LEVEL = [
"................",
"................",
"................",
"..........###...",
"................",
"................",
"...#####........",
"............#...",
"#....P......#..#",
"################",
]
pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Head Bump")
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
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
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