Menu
CoddyTech

Açılı Atışlar

Coddy'nin Pygame ile Oyun Yap kursunda ders 36 / 41.

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) // 6

Ortanı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.

challenge icon

Görev

Zor

Raketlerin topu yönlendirmesini sağla.

  1. Her iki raket çarpışmasında da vx değerini ayarladıktan sonra vy değerini topun merkezi ile ilgili raketin merkezi arasındaki fark olarak ayarla.
  2. Bu değeri // ile 6'ya böl.

“Oyna” düğmesine bas ve topa raketin ucuyla vur: top açılı bir şekilde fırlar. Ardından “Kontrol et” düğmesine bas.

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()

Pygame ile Oyun Yap bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground