Menu
CoddyTech

Açılı Şutlar

Coddy'nin Pygame Journey'sinin Projeler bölümünün bir parçası. Ders 18 / 31.

Pong'da topun rakete çarptığı yer, topun hangi yöne gideceğini belirler. Üst kenara yakın çarparsa yukarı, alt kenara yakın çarparsa aşağı, ortadan çarparsa dümdüz karşıya gider.

Topun merkezinin raketin merkezine ne kadar uzak olduğunu ölç ve bunu yeni vy değeri yap:

if ball.colliderect(right):
    vx = -abs(vx)
    vy = (ball.centery - right.centery) // 6

Top, raketin ortasının üstüne çarptığında fark negatiftir; bu yüzden top yukarı gider. Altına çarptığında fark pozitiftir. 6'ya bölmek, topun aşırı hızlanmasını önler: en uç noktadan gelen bir vuruşta vy yaklaşık 7 olur.

Böylece Pong bir beceri oyununa dönüşür: topu raketinle yönlendirirsin.

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ı // ile 6'ya bölerek 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.

Projeler bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground