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) // 6Di 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.
Tantangan
SulitPada 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()
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Buat Game dengan Pygame
1Perulangan Game
Buka JendelaIsi Latar4Dua Pemain dan Sebuah Bola
BolanyaMemantulLatihan sendiri: Playground Pygame