חבטות בזווית
שיעור 36 מתוך 41 בקורס צרו משחקים עם 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
תרגלו בעצמכם: Pygame אונליין