Menu
CoddyTech

חבטות בזווית

חלק מהיחידה פרויקטים במסלול ה-Pygame של Coddy. שיעור 18 מתוך 31.

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

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

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

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

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

challenge icon

אתגר

קשה

בשתי ההתנגשויות במחבטים, לאחר הגדרת 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()
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה פרויקטים

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