Menu
CoddyTech

Pukulan Menyudut

Pelajaran 36 dari 40 dalam kursus Buat Game dengan Pygame di Coddy.

Di Pong, titik bola mengenai paddle menentukan arah geraknya. Jika mengenai dekat ujung atas, bola melesat ke atas; jika dekat ujung bawah, bola bergerak ke bawah; dan jika mengenai bagian tengah, bola bergerak lurus melintasi layar.

Ukur jarak antara titik tengah bola dan titik tengah paddle, lalu jadikan hasilnya sebagai vy yang baru:

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

Di atas titik tengah, selisihnya negatif, jadi bola bergerak ke atas; di bawahnya, selisihnya positif. Membaginya dengan 6 mencegah bola bergerak terlalu cepat: pukulan tepat di ujung menghasilkan vy sekitar 7.

Ini mengubah Pong menjadi permainan keterampilan: kamu mengarahkan bola dengan paddle-mu.

challenge icon

Tantangan

Sulit

Pada kedua tabrakan dengan paddle, setelah mengatur vx, atur vy menjadi selisih antara titik tengah bola dan titik tengah paddle tersebut, dibagi 6 menggunakan //.

Coba sendiri

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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Buat Game dengan Pygame

Latihan sendiri: Playground Pygame