Menu
CoddyTech

Tembakan Bersudut

Termasuk bagian Proyek dalam perjalanan Pygame di Coddy. Pelajaran 18 dari 31.

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

Ukur jarak antara bagian tengah bola dan bagian tengah paddle, lalu jadikan itu nilai baru vy:

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

Jika mengenai bagian atas tengah, selisihnya negatif, jadi bola bergerak ke atas; jika mengenai bagian bawah, selisihnya positif. Membaginya dengan 6 mencegah bola bergerak terlalu cepat: bola yang mengenai ujung paling jauh menghasilkan nilai vy sekitar 7.

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

challenge icon

Tantangan

Sulit

Pada kedua tabrakan dengan paddle, setelah menetapkan vx, tetapkan vy ke selisih titik tengah bola dan titik tengah paddle tersebut, lalu bagi dengan 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 Proyek

Latihan sendiri: Playground Pygame