Rơi khỏi màn chơi
Thuộc phần Thế giới trò chơi trong hành trình Pygame của Coddy. Bài học 18 trên 36.
Mặt đất có một cái hố. Người chơi bước vào đó rồi rơi mãi, khuất khỏi tầm nhìn. Giá trị y của người chơi cứ tăng lên và không gì đưa người chơi trở lại.
Màn chơi kết thúc ở mép dưới cửa sổ, tại y = 360. Khi đỉnh của người chơi nằm thấp hơn vị trí đó, toàn bộ cơ thể đã ra khỏi màn chơi: đưa người chơi về điểm bắt đầu và dừng cú rơi.
if player.top > 360:
player.midbottom = start
vel_y = 0start là điểm mà vòng lặp bản đồ đã lưu cho ô P: chính giữa cạnh dưới của ô đó, nơi người chơi đứng lần đầu. Sau này, đây là nơi người chơi mất một mạng.
Thử thách
DễĐưa nhân vật trở lại sau khi rơi ra khỏi màn chơi.
- Sau các va chạm theo chiều dọc, khi
player.top > 360, hãy đặtplayer.midbottom = start. - Đặt
vel_y = 0ở đó nữa.
Nhấn Chơi rồi đi vào hố: nhân vật sẽ trở lại điểm bắt đầu. Sau đó nhấn Kiểm tra.
Tự làm thử
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("Pits")
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
on_ground = True
elif vel_y < 0:
player.top = wall.bottom
vel_y = 0
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()
Tất cả bài học trong Thế giới trò chơi
1Bản đồ dạng văn bản
Một màn chơi bằng văn bảnHàng và cộtCác chữ cái mang ý nghĩaNơi người chơi bắt đầuTừng màn hình một4Va chạm với các bệ
Tường bên trái và bên phảiTiếp đất trên các bệĐụng đầuRơi khỏi màn chơiTừng trục mộtTự luyện tập: Playground Pygame