فئة الكرة
الدرس 38 من 41 في دورة اصنع ألعابًا باستخدام Pygame على Coddy.
الكرة عبارة عن Rect بالإضافة إلى عددين، والمهام التي تؤديها: التحرك والارتداد والرسم. اجعلها فئة، كما فعلت مع الكائنات المتحركة: تحتفظ الفئة بالبيانات والدوال التي تستخدمها معًا.
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ينشئ ball = Ball() كائن كرة ويشغّل __init__. داخل الفئة، يشير self إلى الكائن، لذا فإن self.vx هو vx الخاص بهذه الكرة. تُسمّى الدوال في الفئة أساليب: يستدعي ball.move() أحدها.
خارج الفئة، أصبح مستطيل الكرة الآن ball.rect وسرعتها ball.vx وball.vy، لذا يقرأهما كود المضرب وتسجيل النقاط من هناك. تعمل اللعبة كما كانت من قبل.
التحدي
صعباجعل الكرة صنفًا يتحرك ويرسم نفسه.
- في الأعلى، اكتب
class Ballمع__init__(self.rect،self.vx = 5،self.vy = 4)، وmove()(لتحريك الكرة وجعلها ترتد عن الأعلى والأسفل)، وdraw(surface). - أنشئ
ball = Ball()، واستدعِball.move()وball.draw(screen)في الحلقة. - في كل المواضع الأخرى، اكتب
ball.rectوball.vxوball.vy.
اضغط «العب»: ستعمل اللعبة تمامًا كما في السابق. ثم اضغط «تحقق».
جرّب بنفسك
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()
جميع دروس اصنع ألعابًا باستخدام Pygame
تدرّب بنفسك: Playground لـ Pygame