Menu
CoddyTech

اضرب الكرة بالمضرب

الدرس 32 من 41 في دورة اصنع ألعابًا باستخدام Pygame على Coddy.

عندما تلمس الكرة أحد المضربين، ينبغي أن تتجه نحو الجهة الأخرى. تخبرك ball.colliderect(right) بأنهما متلامسان.

قلب الإشارة باستخدام vx = -vx ينطوي على مشكلة. إذا بقيت الكرة داخل المضرب في الإطار التالي (لأنها اصطدمت بطرف المضرب، أو لأن المضرب تحرك نحوها)، فستنقلب الإشارة مرة أخرى، ثم مرة أخرى: فتهتز الكرة داخل المضرب.

حدّد الاتجاه بدلًا من قلب الإشارة. تمثّل abs(vx) قيمة vx من دون إشارتها، ولذلك تكون موجبة دائمًا:

if ball.colliderect(left):
    vx = abs(vx)
if ball.colliderect(right):
    vx = -abs(vx)

تنطلق الكرة دائمًا إلى اليمين بعد ارتدادها عن المضرب الأيسر، وإلى اليسار بعد ارتدادها عن المضرب الأيمن، مهما بلغ عدد الإطارات التي تلامسهما خلالها.

challenge icon

التحدي

متوسط

اجعل الكرة ترتد عن المضربين.

  1. بعد ارتداد الكرة عن الجدار، عندما تصطدم بـ left، عيّن vx = abs(vx).
  2. عندما تصطدم بـ right، عيّن vx = -abs(vx).

اضغط على «العب» وأمسك الكرة بالمضرب الأيمن: سترتد إلى الخلف. ثم اضغط على «تحقق».

جرّب بنفسك

import pygame

pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pong")
clock = pygame.time.Clock()

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)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = 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())

    ball.x += vx
    ball.y += vy
    if ball.top <= 0 or ball.bottom >= 400:
        vy = -vy

    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)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

جميع دروس اصنع ألعابًا باستخدام Pygame

تدرّب بنفسك: Playground لـ Pygame