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) // 6Jika 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.
Tantangan
SulitPada 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()
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Proyek
Latihan sendiri: Playground Pygame