Đánh và đặt lại bằng các phương thức
Bài học 39 trên 41 trong khóa học Tạo trò chơi với Pygame của Coddy.
Quả bóng còn có hai nhiệm vụ nữa: nảy khỏi thanh đỡ và quay về giữa sân. Dưới dạng các phương thức, vòng lặp chính đọc giống như luật chơi.
def reset(self):
self.rect.center = (300, 200)
self.vx = -self.vxHai lần kiểm tra va chạm với thanh đỡ chỉ khác nhau ở hướng quả bóng bay đi: sang phải khi bật khỏi thanh đỡ bên trái, sang trái khi bật khỏi thanh đỡ bên phải. Truyền hướng đó dưới dạng một số, way, 1 hoặc -1, để cả hai trường hợp dùng chung một phương thức:
ball.hit(left, 1)
ball.hit(right, -1)Bên trong phương thức, self.vx = way * abs(self.vx) đưa quả bóng bay theo hướng đó dù trước đó bóng đang di chuyển thế nào, còn góc nảy vẫn giữ nguyên.
Thử thách
KhóChuyển phần xử lý bóng chạm vợt và đặt lại bóng vào lớp Ball.
- Viết
hit(paddle, way): khi va chạm, đặtself.vx = way * abs(self.vx)và điều chỉnh góc đánh bóng. - Viết
reset(): đặt tâm tại(300, 200)và đảo chiềuself.vx. - Trong vòng lặp, gọi
ball.hit(left, 1),ball.hit(right, -1)vàball.reset()sau mỗi điểm.
Nhấn nút “Chơi”: trò chơi vẫn diễn ra như cũ. Sau đó nhấn “Kiểm tra”.
Tự làm thử
import pygame
class Ball:
def __init__(self):
self.rect = pygame.Rect(293, 193, 14, 14)
self.vx = 5
self.vy = 4
def move(self):
self.rect.x += self.vx
self.rect.y += self.vy
if self.rect.top <= 0 or self.rect.bottom >= 400:
self.vy = -self.vy
def draw(self, surface):
pygame.draw.rect(surface, (255, 196, 0), self.rect)
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 = Ball()
left = pygame.Rect(20, 160, 12, 80)
right = pygame.Rect(568, 160, 12, 80)
left_score = 0
right_score = 0
waiting = False
winner = None
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 == pygame.K_SPACE:
if winner is None:
waiting = 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())
if not waiting:
ball.move()
if ball.rect.colliderect(left):
ball.vx = abs(ball.vx)
ball.vy = (ball.rect.centery - left.centery) // 6
if ball.rect.colliderect(right):
ball.vx = -abs(ball.vx)
ball.vy = (ball.rect.centery - right.centery) // 6
if ball.rect.left > 600:
left_score += 1
ball.rect.center = (300, 200)
ball.vx = -ball.vx
waiting = True
if ball.rect.right < 0:
right_score += 1
ball.rect.center = (300, 200)
ball.vx = -ball.vx
waiting = True
if left_score == 5:
winner = "Left player wins!"
elif right_score == 5:
winner = "Right player wins!"
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 160, 255), left)
pygame.draw.rect(screen, (235, 80, 80), right)
ball.draw(screen)
score = font.render(f"{left_score} : {right_score}", True, (240, 240, 240))
screen.blit(score, score.get_rect(center=(300, 30)))
if winner is not None:
message = font.render(winner, True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(300, 120)))
elif waiting:
message = font.render("Press Space to serve", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(300, 360)))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
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