Bir Top Sınıfı
Coddy'nin Pygame ile Oyun Yap kursunda ders 38 / 40.
Top bir Rect ile iki sayıdan ve dört görevden oluşur: hareket et, bir rakete çarp, sıfırla, çiz. Bir sınıf, 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.vyball = Ball() bir top nesnesi oluşturur ve __init__ işlevini çalıştırır. Sınıfın içinde self nesnenin kendisidir; bu nedenle self.vx, bu topun kendi vx değeridir. Bir sınıftaki işlevlere metot denir: ball.move() bunlardan birini çağırır.
Ardından ana döngü, oyunun kuralları gibi okunur: ball.move(), ball.hit(left, 1), ball.hit(right, -1), ball.reset(), ball.draw(screen). Oyun öncekiyle aynı şekilde oynanır.
Görev
ZorTopu, dosyanın en üstünde aşağıdakilere sahip bir Ball sınıfı olarak yeniden yaz:
__init__:self.rect,self.vx = 5,self.vy = 4move(): hareket eder ve üstten ve alttan sekerhit(paddle, way): çarpışma durumundaself.vx = way * abs(self.vx)ve atış açısıreset(): ortaya döner,vxtersine çevrilirdraw(surface)
ball = Ball() oluştur ve döngüde onun yöntemlerini kullan. ball.left ifadesini ball.rect.left olarak ve benzerlerini değiştir. Oyun aynı şekilde oynanmalı.
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()
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