Menu
CoddyTech

Rintangan

Termasuk bagian Aturan Game dalam perjalanan Pygame di Coddy. Pelajaran 26 dari 29.

Sekarang tambahkan sesuatu untuk dilompati. Rintangan adalah sprite yang mulai sedikit melewati tepi kanan, di tanah, lalu bergerak ke kiri:

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 berisi bola berduri dan blob, yang dimuat sekali, sehingga setiap rintangan memilih gambar tanpa membaca file. kill() mengeluarkan sprite dari setiap grup tempatnya berada, sehingga rintangan yang keluar di sebelah kiri akan dihapus.

Simpan semuanya dalam sebuah grup: obstacles.update() menggerakkan semuanya dan obstacles.draw(screen) menggambar semuanya. Timer akan menambahkan rintangan. Setiap kali timer aktif, mulai lagi dengan jeda acak agar pemain tidak bisa melompat mengikuti irama:

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

Runner belum bisa menabrak rintangan. Itu akan dibahas selanjutnya.

challenge icon

Tantangan

Sedang
  1. Tambahkan SPAWN = pygame.USEREVENT + 1, speed = 6, dan sebuah list obstacle_images yang berisi spike_ball.png dan blob.png.
  2. Tulis sprite Obstacle seperti yang ditunjukkan.
  3. Buat group bernama obstacles dan mulai timer SPAWN pada 1500 ms.
  4. Saat SPAWN terjadi, tambahkan obstacle dan mulai ulang timer dengan random.randint(1000, 2000).
  5. Perbarui dan gambar group pada setiap frame.

Coba sendiri

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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Aturan Game

Latihan sendiri: Playground Pygame