Menu
CoddyTech

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

Her 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()
quiz iconKendini test et

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

Kendi başına pratik yap: Pygame playground