Menu
CoddyTech

פגיעה במחבט

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

כשהכדור נוגע במחבט, הוא אמור לנוע בחזרה לכיוון השני. ball.colliderect(right) אומר לך שהם נוגעים.

להפיכת הסימן, vx = -vx, יש מלכודת. אם הכדור עדיין בתוך המחבט בפריים הבא (הוא פגע בקצה המחבט, או שהמחבט זז עליו), הסימן מתהפך שוב ושוב: הכדור רועד בתוך המחבט.

קובעים את הכיוון במקום להפוך את הסימן. abs(vx) הוא vx ללא הסימן שלו, ולכן הוא תמיד חיובי:

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

מהמחבט השמאלי הכדור תמיד נע ימינה, ומהמחבט הימני תמיד שמאלה, בלי קשר למספר הפריימים שבהם הם נוגעים.

challenge icon

אתגר

בינוני

אחרי שהכדור קופץ מהקיר, כשהוא מתנגש ב־left, יש להגדיר vx = abs(vx); כשהוא מתנגש ב־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()
quiz iconבחנו את עצמכם

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

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

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