تسديدات بزاوية
جزء من قسم المشاريع في رحلة Pygame على Coddy. الدرس 18 من 31.
في لعبة 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()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المشاريع
تدرّب بنفسك: Playground لـ Pygame