Giao bóng
Bài học 35 trên 41 trong khóa học Tạo trò chơi với Pygame của Coddy.
Sau một điểm, bóng nên chờ ở giữa cho đến khi có người chơi sẵn sàng. Một cờ cho biết bóng có đang chờ hay không:
waiting = False
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
waiting = False
# Các thanh đỡ luôn di chuyển
if not waiting:
# Bóng di chuyển, bật lại và ghi điểm; mỗi điểm ghi được sẽ đặt waiting = TrueCác thanh đỡ bóng nằm ngoài if, nên người chơi có thể sẵn sàng trong lúc bóng chờ. Phím cách chỉ kích hoạt một lần mỗi lần nhấn, nên sự kiện này đến từ sự kiện KEYDOWN.
Khi bóng chờ, hãy hiển thị Press Space to serve gần phía dưới, căn giữa tại (300, 360).
Thử thách
Trung bìnhChờ giao bóng sau mỗi điểm.
- Trước vòng lặp, đặt
waiting = False. - Đặt phần di chuyển, nảy và ghi điểm của bóng bên trong
if not waiting:, rồi đặtwaiting = Truesau mỗi điểm. - Sự kiện KEYDOWN với
pygame.K_SPACEđặtwaiting = False. Trong lúc chờ, hiển thịPress Space to serveở chính giữa tại(300, 360).
Nhấn "Chơi" rồi để bóng lọt qua: bóng sẽ chờ ở giữa cho đến khi bạn nhấn Space. Sau đó nhấn "Kiểm tra".
Tự làm thử
import pygame
pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pong")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 36)
ball = pygame.Rect(293, 193, 14, 14)
vx, vy = 5, 4
left = pygame.Rect(20, 160, 12, 80)
right = pygame.Rect(568, 160, 12, 80)
left_score = 0
right_score = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_w]:
left.y -= 6
if keys[pygame.K_s]:
left.y += 6
if keys[pygame.K_UP]:
right.y -= 6
if keys[pygame.K_DOWN]:
right.y += 6
left.clamp_ip(screen.get_rect())
right.clamp_ip(screen.get_rect())
ball.x += vx
ball.y += vy
if ball.top <= 0 or ball.bottom >= 400:
vy = -vy
if ball.colliderect(left):
vx = abs(vx)
if ball.colliderect(right):
vx = -abs(vx)
if ball.left > 600:
left_score += 1
ball.center = (300, 200)
vx = -vx
if ball.right < 0:
right_score += 1
ball.center = (300, 200)
vx = -vx
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 160, 255), left)
pygame.draw.rect(screen, (235, 80, 80), right)
pygame.draw.rect(screen, (255, 196, 0), ball)
score = font.render(f"{left_score} : {right_score}", True, (240, 240, 240))
screen.blit(score, score.get_rect(center=(300, 30)))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Tất cả bài học trong Tạo trò chơi với Pygame
1Vòng lặp trò chơi
Mở cửa sổTô màu nền4Hai người chơi và một quả bóng
Quả bóngNảyTự luyện tập: Playground Pygame