Menu
CoddyTech

Engeller

Coddy'nin Pygame Journey'sinin Oyun Kuralları bölümünün bir parçası. Ders 26 / 29.

Şimdi üzerinden atlanacak bir şey ekleyelim. Engel, sağ kenarın biraz ilerisinde, yerde başlayan ve sola doğru hareket eden bir hareketli nesnedir:

class Obstacle(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = random.choice(obstacle_images)
        self.rect = self.image.get_rect(midbottom=(664, GROUND_Y))

    def update(self):
        self.rect.x -= speed
        if self.rect.right < 0:
            self.kill()

obstacle_images, bir kez yüklenen dikenli topu ve blob'u içerir; böylece her engel, bir dosya okumadan bir resim seçer. kill(), bir hareketli nesneyi bulunduğu tüm gruplardan çıkarır; bu sayede soldan çıkan engeller unutulur.

Onları bir grupta tut: obstacles.update() hepsini hareket ettirir ve obstacles.draw(screen) hepsini çizer. Bir zamanlayıcı onları ekler. Her tetiklendiğinde, rastgele bir aralıkla yeniden başlat; böylece oyuncu ritmik bir şekilde zıplayamaz:

if event.type == SPAWN:
    obstacles.add(Obstacle())
    pygame.time.set_timer(SPAWN, random.randint(1000, 2000))

Koşucu henüz onlara çarpamaz. Sırada bu var.

challenge icon

Görev

Orta
  1. SPAWN = pygame.USEREVENT + 1, speed = 6 ve spike_ball.png ile blob.png içeren bir obstacle_images listesi ekle.
  2. Obstacle sprite'ını gösterildiği gibi yaz.
  3. obstacles adında bir grup oluştur ve SPAWN zamanlayıcısını 1500 ms'de başlat.
  4. SPAWN gerçekleştiğinde bir engel ekle ve zamanlayıcıyı random.randint(1000, 2000) ile yeniden başlat.
  5. Grubu her karede güncelle ve çiz.

Kendin dene

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 320))
pygame.display.set_caption("Sky Runner")
clock = pygame.time.Clock()

SKY = (140, 200, 240)
GROUND = (90, 160, 80)
GROUND_Y = 260
GRAVITY = 1


class Runner(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.frames = [
            pygame.image.load("assets/images/player.png").convert_alpha(),
            pygame.image.load("assets/images/player_walk.png").convert_alpha(),
        ]
        self.image = self.frames[0]
        self.step = 0
        self.rect = self.image.get_rect(midbottom=(100, GROUND_Y))
        self.vy = 0

    def jump(self):
        if self.rect.bottom == GROUND_Y:
            self.vy = -16

    def update(self):
        self.vy += GRAVITY
        self.rect.y += self.vy
        if self.rect.bottom >= GROUND_Y:
            self.rect.bottom = GROUND_Y
            self.vy = 0
        if self.rect.bottom == GROUND_Y:
            self.step += 1
            self.image = self.frames[self.step // 8 % 2]
        else:
            self.image = self.frames[1]


runner = Runner()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
            runner.jump()

    runner.update()

    screen.fill(SKY)
    pygame.draw.rect(screen, GROUND, (0, GROUND_Y, 640, 60))
    screen.blit(runner.image, runner.rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Oyun Kuralları bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground