Menu
CoddyTech

חבטות בזווית

שיעור 36 מתוך 41 בקורס צרו משחקים עם Pygame של Coddy.

ב-Pong, המקום שבו הכדור פוגע במחבט קובע לאן הוא ינוע. סמוך לקצה העליון הוא עף למעלה, סמוך לקצה התחתון למטה, ובאמצע ישר לרוחב.

מדדו את המרחק בין מרכז הכדור למרכז המחבט, והגדירו את vy החדש לפי המרחק הזה:

if ball.colliderect(right):
    vx = -abs(vx)
    vy = (ball.centery - right.centery) // 6

מעל האמצע ההפרש שלילי, ולכן הכדור עולה; מתחתיו ההפרש חיובי. חלוקה ב-6 מונעת ממנו לנוע מהר מדי: פגיעה ממש בקצה נותנת vy בערך 7.

כך Pong הופך למשחק של מיומנות: מכוונים בעזרת המחבט.

challenge icon

אתגר

קשה

כוונו את הכדור בעזרת המחבטים.

  1. בשתי ההתנגשויות עם המחבטים, אחרי הגדרת vx, הגדירו את vy להפרש בין מרכז הכדור למרכז המחבט.
  2. חלקו אותו ב־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

תרגלו בעצמכם: Pygame אונליין