الضربات بزاوية
الدرس 36 من 40 في دورة اصنع ألعابًا باستخدام Pygame على Coddy.
في لعبة Pong، يحدد موضع ارتطام الكرة بالمضرب الاتجاه الذي ستسلكه. فإذا اصطدمت بالقرب من الطرف العلوي، طارت إلى الأعلى؛ وإذا اصطدمت بالقرب من الطرف السفلي، اتجهت إلى الأسفل؛ أما في المنتصف، فتتحرك مباشرةً إلى الجانب الآخر.
قِس المسافة بين منتصف الكرة ومنتصف المضرب، واجعلها قيمة vy الجديدة:
if ball.colliderect(right):
vx = -abs(vx)
vy = (ball.centery - right.centery) // 6يكون الفرق سالبًا إذا كانت الكرة أعلى المنتصف، لذا تتحرك إلى الأعلى؛ ويكون موجبًا إذا كانت أسفله. القسمة على 6 تمنعها من التحرك بسرعة مفرطة: فالارتطام عند الطرف تمامًا يعطي قيمة vy تساوي نحو 7.
وهكذا تتحول لعبة Pong إلى لعبة مهارة: فأنت توجه الكرة بمضربك.
التحدي
صعبفي اصطدامَي الكرة بالمضربين، بعد تعيين vx، عيّن vy إلى قيمة منتصف الكرة ناقص منتصف ذلك المضرب، مقسومة على 6 باستخدام //.
جرّب بنفسك
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
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:
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)
if ball.colliderect(right):
vx = -abs(vx)
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
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 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
1حلقة اللعبة
افتح نافذةاملأ الخلفية4لاعبان وكرة
الكرةالارتدادتدرّب بنفسك: Playground لـ Pygame