Yöntem Olarak Çarpma ve Sıfırlama
Coddy'nin Pygame ile Oyun Yap kursunda ders 39 / 41.
Topa iki görev daha aittir: bir raketten sektirmek ve ortaya geri götürmek. Yöntemler olarak ana döngü, oyunun kurallarını okur gibi okunur.
def reset(self):
self.rect.center = (300, 200)
self.vx = -self.vxİki raket testi yalnızca topun hangi yöne gittiği bakımından farklıdır: sol raketten sağa, sağ raketten sola. Bunu 1 veya -1 olan way adlı bir sayı olarak ilet; böylece tek bir yöntem her ikisini de karşılar:
ball.hit(left, 1)
ball.hit(right, -1)İçeride, self.vx = way * abs(self.vx) topu hangi yönde hareket ediyor olursa olsun o yöne gönderir ve atışın açısı aynı kalır.
Görev
ZorRaketin çarpışmasını ve sıfırlama işlemini Ball sınıfına taşı.
hit(paddle, way)yaz: bir çarpışma olduğundaself.vx = way * abs(self.vx)değerini ayarla ve atış açısını belirle.reset()yaz: merkezi(300, 200)olarak ayarla veself.vxdeğerinin işaretini değiştir.- Döngüde, her sayıdan sonra
ball.hit(left, 1),ball.hit(right, -1)veball.reset()çağrılarını yap.
“Oyna” düğmesine bas: oyun hâlâ aynı şekilde oynanır. Ardından “Kontrol et” düğmesine bas.
Kendin dene
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()
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Pygame ile Oyun Yap bölümündeki tüm dersler
1Oyun Döngüsü
Bir Pencere AçArka Planı Doldur4İki Oyuncu ve Bir Top
TopSekmeKendi başına pratik yap: Pygame playground