Chướng ngại vật
Thuộc phần Luật chơi trong hành trình Pygame của Coddy. Bài học 26 trên 30.
Giờ thêm thứ để bạn nhảy qua. Chướng ngại vật là một sprite bắt đầu ở phía bên kia mép phải một chút, trên mặt đất, rồi di chuyển sang trái:
class Obstacle(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = random.choice(obstacle_images)
self.rect = self.image.get_rect(midbottom=(664, GROUND_Y))
def update(self):
self.rect.x -= speed
if self.rect.right < 0:
self.kill()obstacle_images chứa quả bóng gai và khối nhầy, được tải một lần, để mỗi chướng ngại vật chọn một hình mà không cần đọc tệp. kill() xóa một sprite khỏi mọi nhóm mà nó thuộc về, nên các chướng ngại vật đi khỏi màn hình bên trái sẽ bị loại bỏ.
Giữ chúng trong một nhóm: obstacles.update() di chuyển tất cả và obstacles.draw(screen) vẽ tất cả. Bộ hẹn giờ sẽ thêm chúng. Mỗi lần bộ hẹn giờ kích hoạt, hãy khởi động lại nó với một khoảng thời gian ngẫu nhiên để người chơi không thể nhảy theo nhịp:
if event.type == SPAWN:
obstacles.add(Obstacle())
pygame.time.set_timer(SPAWN, random.randint(1000, 2000))Người chạy vẫn chưa thể va phải chúng. Phần đó sẽ có ở bài tiếp theo.
Thử thách
Trung bìnhĐưa chướng ngại vật về phía nhân vật chạy.
- Thêm
SPAWN = pygame.USEREVENT + 1,speed = 6vàobstacle_images:spike_ball.pngvàblob.png. - Viết sprite
Obstaclenhư hình minh họa và một nhómobstacles. - Bắt đầu bộ hẹn giờ
SPAWNở 1500 ms; khi cóSPAWN, thêm một chướng ngại vật rồi khởi động lại bộ hẹn giờ vớirandom.randint(1000, 2000). - Cập nhật và vẽ nhóm này ở mỗi khung hình.
Nhấn Chơi: chướng ngại vật xuất hiện từ bên phải. Sau đó nhấn Kiểm tra.
Tự làm thử
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 320))
pygame.display.set_caption("Sky Runner")
clock = pygame.time.Clock()
SKY = (140, 200, 240)
GROUND = (90, 160, 80)
GROUND_Y = 260
GRAVITY = 1
class Runner(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.frames = [
pygame.image.load("assets/images/player.png").convert_alpha(),
pygame.image.load("assets/images/player_walk.png").convert_alpha(),
]
self.image = self.frames[0]
self.step = 0
self.rect = self.image.get_rect(midbottom=(100, GROUND_Y))
self.vy = 0
def jump(self):
if self.rect.bottom == GROUND_Y:
self.vy = -16
def update(self):
self.vy += GRAVITY
self.rect.y += self.vy
if self.rect.bottom >= GROUND_Y:
self.rect.bottom = GROUND_Y
self.vy = 0
if self.rect.bottom == GROUND_Y:
self.step += 1
self.image = self.frames[self.step // 8 % 2]
else:
self.image = self.frames[1]
runner = Runner()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
runner.jump()
runner.update()
screen.fill(SKY)
pygame.draw.rect(screen, GROUND, (0, GROUND_Y, 640, 60))
screen.blit(runner.image, runner.rect)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Tất cả bài học trong Luật chơi
3Bộ hẹn giờ và các đợt
An toàn sau khi trúng đònSự kiện hẹn giờMột tảng đá sau mỗi 800 msCác đợt ngày càng lớnĐếm ngược đến lúc bắt đầu6Người chạy trên trời
Người chạyNhảyTự luyện tập: Playground Pygame