Memukul dan Mengatur Ulang sebagai Method
Pelajaran 39 dari 41 dalam kursus Buat Game dengan Pygame di Coddy.
Dua tugas lain milik bola adalah memantul dari pemukul dan kembali ke tengah. Sebagai method, loop utama menunjukkan aturan permainan.
def reset(self):
self.rect.center = (300, 200)
self.vx = -self.vxKedua pengujian pemukul hanya berbeda dalam arah bola bergerak setelah memantul: ke kanan dari pemukul kiri, ke kiri dari pemukul kanan. Berikan arah itu sebagai angka, way, 1 atau -1, dan satu method bisa menangani keduanya:
ball.hit(left, 1)
ball.hit(right, -1)Di dalamnya, self.vx = way * abs(self.vx) mengirim bola ke arah itu, apa pun arah geraknya sebelumnya, sementara sudut tembakannya tetap sama.
Tantangan
SulitPindahkan tabrakan dengan pemukul dan reset ke dalam class Ball.
- Tulis
hit(paddle, way): saat terjadi tabrakan,self.vx = way * abs(self.vx)dan sudut pantulan. - Tulis
reset(): posisikan di tengah pada(300, 200)dan balikkanself.vx. - Di dalam perulangan, panggil
ball.hit(left, 1),ball.hit(right, -1), danball.reset()setelah setiap poin.
Tekan tombol “Main”: permainan tetap berjalan seperti sebelumnya. Lalu tekan tombol “Periksa”.
Coba sendiri
import pygame
class Ball:
def __init__(self):
self.rect = pygame.Rect(293, 193, 14, 14)
self.vx = 5
self.vy = 4
def move(self):
self.rect.x += self.vx
self.rect.y += self.vy
if self.rect.top <= 0 or self.rect.bottom >= 400:
self.vy = -self.vy
def draw(self, surface):
pygame.draw.rect(surface, (255, 196, 0), self.rect)
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 = Ball()
left = pygame.Rect(20, 160, 12, 80)
right = pygame.Rect(568, 160, 12, 80)
left_score = 0
right_score = 0
waiting = False
winner = None
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:
if winner is None:
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.move()
if ball.rect.colliderect(left):
ball.vx = abs(ball.vx)
ball.vy = (ball.rect.centery - left.centery) // 6
if ball.rect.colliderect(right):
ball.vx = -abs(ball.vx)
ball.vy = (ball.rect.centery - right.centery) // 6
if ball.rect.left > 600:
left_score += 1
ball.rect.center = (300, 200)
ball.vx = -ball.vx
waiting = True
if ball.rect.right < 0:
right_score += 1
ball.rect.center = (300, 200)
ball.vx = -ball.vx
waiting = True
if left_score == 5:
winner = "Left player wins!"
elif right_score == 5:
winner = "Right player wins!"
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 160, 255), left)
pygame.draw.rect(screen, (235, 80, 80), right)
ball.draw(screen)
score = font.render(f"{left_score} : {right_score}", True, (240, 240, 240))
screen.blit(score, score.get_rect(center=(300, 30)))
if winner is not None:
message = font.render(winner, True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(300, 120)))
elif 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
1Game Loop
Buka JendelaIsi Latar Belakang4Dua Pemain dan Sebuah Bola
BolaMemantulLatihan sendiri: Playground Pygame