חבטות בזווית
שיעור 36 מתוך 40 בקורס יוצרים משחקים עם Pygame של Coddy.
ב-Pong, המקום שבו הכדור פוגע במחבט קובע לאן הוא ינוע. סמוך לקצה העליון הוא עף למעלה, סמוך לקצה התחתון למטה, ובאמצע ישר לרוחב.
מדדו את המרחק בין מרכז הכדור למרכז המחבט, והגדירו את vy החדש לפי המרחק הזה:
if ball.colliderect(right):
vx = -abs(vx)
vy = (ball.centery - right.centery) // 6מעל האמצע ההפרש שלילי, ולכן הכדור עולה; מתחתיו ההפרש חיובי. חלוקה ב-6 מונעת ממנו לנוע מהר מדי: פגיעה ממש בקצה נותנת vy בערך 7.
כך Pong הופך למשחק של מיומנות: מכוונים בעזרת המחבט.
אתגר
קשהבשתי ההתנגשויות במחבטים, לאחר הגדרת 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()
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יוצרים משחקים עם Pygame
4שני שחקנים וכדור
הכדורקפיצהתרגלו בעצמכם: Pygame אונליין