Menu
CoddyTech
flag He iconעבריתdown icon

חבטות בזווית

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

ב-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

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