Menu
CoddyTech

Skor dan Kecepatan

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

Skor endless runner dihitung berdasarkan jarak. Timer menambahkan satu poin setiap 100 ms, jadi berlari selama satu detik bernilai 10:

POINT = pygame.USEREVENT + 2
pygame.time.set_timer(POINT, 100)

Tampilkan skor di kanan atas dengan angka nol di depan, 00042, seperti di Meteor Dodge.

Permainan menjadi makin sulit seiring kamu bermain. Hubungkan kecepatan dengan skor: 6 piksel per frame di awal, bertambah satu setiap 100 poin, dan tidak pernah lebih dari 14:

speed = min(14, 6 + score // 100)

Obstacle.update() membaca speed setiap frame, jadi kecepatan baru juga berlaku pada rintangan yang sudah ada di layar. min membatasi kecepatan: pada 14, rintangan melintasi jendela dalam waktu kurang dari satu detik, dan jika lebih cepat, pemain tidak akan sempat bereaksi.

challenge icon

Tantangan

Sedang
  1. Tambahkan POINT = pygame.USEREVENT + 2, timer untuknya setiap 100 ms, dan score = 0.
  2. Saat permainan berlangsung dan POINT terjadi, tambahkan 1 ke skor.
  3. Saat permainan berlangsung, atur speed = min(14, 6 + score // 100) sebelum melakukan pembaruan.
  4. Tampilkan skor sebagai lima digit dalam (40, 50, 80) dengan topright=(630, 10).

Coba sendiri

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((640, 320))
pygame.display.set_caption("Sky Runner")
clock = pygame.time.Clock()
font = pygame.font.Font("assets/fonts/pixel.ttf", 32)

SKY = (140, 200, 240)
GROUND = (90, 160, 80)
GROUND_Y = 260
GRAVITY = 1
SPAWN = pygame.USEREVENT + 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]


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 = [
    pygame.image.load("assets/images/spike_ball.png").convert_alpha(),
    pygame.image.load("assets/images/blob.png").convert_alpha(),
]
runner = Runner()
obstacles = pygame.sprite.Group()
speed = 6
pygame.time.set_timer(SPAWN, 1500)
state = "play"

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):
            if state == "play":
                runner.jump()
        if event.type == SPAWN and state == "play":
            obstacles.add(Obstacle())
            pygame.time.set_timer(SPAWN, random.randint(1000, 2000))

    if state == "play":
        runner.update()
        obstacles.update()
        if pygame.sprite.spritecollideany(runner, obstacles, pygame.sprite.collide_mask):
            state = "over"

    screen.fill(SKY)
    pygame.draw.rect(screen, GROUND, (0, GROUND_Y, 640, 60))
    screen.blit(runner.image, runner.rect)
    obstacles.draw(screen)
    if state == "over":
        message = font.render("Game over", True, (40, 50, 80))
        screen.blit(message, message.get_rect(center=(320, 140)))
    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