Lớp Ball
Bài học 38 trên 41 trong khóa học Tạo trò chơi với Pygame của Coddy.
Quả bóng gồm một Rect, hai con số và các việc nó làm: di chuyển, nảy và được vẽ. Hãy tạo một lớp cho nó như bạn đã làm với các sprite: một lớp gom dữ liệu và các hàm sử dụng dữ liệu đó lại với nhau.
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.vyball = Ball() tạo một đối tượng quả bóng và chạy __init__. Bên trong lớp, self là đối tượng, nên self.vx là vx riêng của quả bóng này. Các hàm trong một lớp được gọi là phương thức: ball.move() gọi một phương thức.
Bên ngoài lớp, Rect của quả bóng giờ là ball.rect, còn tốc độ của nó là ball.vx và ball.vy, vì vậy code điều khiển thanh đỡ và tính điểm đọc các giá trị này ở đó. Trò chơi vẫn chạy như trước.
Thử thách
KhóBiến quả bóng thành một lớp (class) tự di chuyển và tự vẽ.
- Ở đầu đoạn code, viết
class Ballvới__init__(self.rect,self.vx = 5,self.vy = 4),move()(di chuyển và nảy khỏi cạnh trên và cạnh dưới) vàdraw(surface). - Tạo
ball = Ball(), rồi gọiball.move()vàball.draw(screen)trong vòng lặp. - Ở mọi nơi khác, viết
ball.rect,ball.vxvàball.vy.
Nhấn Chơi: trò chơi chạy y như trước. 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
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.x += vx
ball.y += vy
if ball.top <= 0 or ball.bottom >= 400:
vy = -vy
if ball.colliderect(left):
vx = abs(vx)
vy = (ball.centery - left.centery) // 6
if ball.colliderect(right):
vx = -abs(vx)
vy = (ball.centery - right.centery) // 6
if ball.left > 600:
left_score += 1
ball.center = (300, 200)
vx = -vx
waiting = True
if ball.right < 0:
right_score += 1
ball.center = (300, 200)
vx = -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)
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)))
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()
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