Açılı Vuruşlar
Coddy'nin Pygame ile Oyun Yap kursunda ders 36 / 40.
Pong'da topun rakete nereden çarptığı, hangi yöne gideceğini belirler. Üst uca yakınsa yukarı, alt uca yakınsa aşağı, ortadaysa dümdüz karşıya gider.
Topun merkezinin raketin merkezinden ne kadar uzakta olduğunu ölç ve bunu yeni vy yap:
if ball.colliderect(right):
vx = -abs(vx)
vy = (ball.centery - right.centery) // 6Ortanın üstünde fark negatiftir, bu yüzden top yukarı gider; altında ise pozitiftir. 6'ya bölmek, topun fazla hızlanmasını önler: tam uçtan gelen bir çarpışma yaklaşık 7 değerinde bir vy verir.
Bu, Pong'u bir beceri oyununa dönüştürür: nişan almak için raketini kullanırsın.
Görev
ZorHer iki raket çarpışmasında da vx ayarlandıktan sonra vy değerini topun orta noktası ile ilgili raketin orta noktası arasındaki farkın // ile 6'ya bölünmüş hâline ayarla.
Kendin dene
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()
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Pygame ile Oyun Yap bölümündeki tüm dersler
1Oyun Döngüsü
Bir Pencere AçArka Planı Doldur4İki Oyuncu ve Bir Top
TopSekmeKendi başına pratik yap: Pygame playground