חבטות בזווית
חלק מהיחידה פרויקטים במסלול ה-Pygame של Coddy. שיעור 18 מתוך 31.
ב-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 אונליין