Menu
CoddyTech

Bir Top Sınıfı

Coddy'nin Pygame ile Oyun Yap kursunda ders 38 / 41.

Top bir Rect ve iki sayıdan, ayrıca yaptığı işlerden oluşur: hareket etmek, sekmek, çizilmek. Bunu, sprite'ların için yaptığın gibi bir sınıfa dönüştür: bir class, verileri ve bunları kullanan işlevleri bir arada tutar.

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

ball = Ball() bir top nesnesi oluşturur ve __init__ işlevini çalıştırır. Sınıfın içinde self nesnenin kendisidir; dolayısıyla self.vx, bu topun kendi vx değeridir. Bir sınıftaki işlevlere yöntem denir: ball.move() bunlardan birini çağırır.

Sınıfın dışında topun Rect'i artık ball.rect, hızı ise ball.vx ve ball.vy olur; böylece raket ve puanlama kodu bu değerleri oradan okur. Oyun öncekiyle aynı şekilde oynanır.

challenge icon

Görev

Zor

Kendini hareket ettiren ve çizen bir sınıf olarak top oluştur.

  1. En üste class Ball ile __init__ (self.rect, self.vx = 5, self.vy = 4), move() (hareket etsin ve üst ve alt kenarlardan sekerek geri dönsün) ve draw(surface) yaz.
  2. ball = Ball() oluştur ve döngüde ball.move() ile ball.draw(screen) çağır.
  3. Diğer tüm yerlerde ball.rect, ball.vx ve ball.vy yaz.

“Oyna” düğmesine bas: oyun öncekiyle tamamen aynı şekilde oynanır. Ardından “Kontrol et” düğmesine bas.

Kendin dene

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
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.x += vx
        ball.y += vy
        if ball.top <= 0 or ball.bottom >= 400:
            vy = -vy
        if ball.colliderect(left):
            vx = abs(vx)
            vy = (ball.centery - left.centery) // 6
        if ball.colliderect(right):
            vx = -abs(vx)
            vy = (ball.centery - right.centery) // 6
        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
        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)
    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 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()

Pygame ile Oyun Yap bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground