Menu
CoddyTech

Punteggio e velocità

Fa parte della sezione Regole di gioco del percorso Pygame di Coddy. Lezione 28 di 29.

Il punteggio di un runner senza fine si basa sulla distanza. Un timer aggiunge un punto ogni 100 ms, quindi un secondo di corsa vale 10:

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

Mostralo in alto a destra con gli zeri, 00042, come in Meteor Dodge.

Il gioco diventa più difficile man mano che avanzi. Collega la velocità al punteggio: 6 pixel per fotogramma all'inizio, uno in più ogni 100 punti, senza mai superare 14:

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

Obstacle.update() legge speed a ogni fotogramma, quindi la nuova velocità raggiunge anche gli ostacoli già sullo schermo. min è il limite massimo: a 14, un ostacolo attraversa la finestra in meno di un secondo e, se fosse più veloce, il giocatore non potrebbe reagire.

challenge icon

Sfida

Medio
  1. Aggiungi POINT = pygame.USEREVENT + 2, un timer per questo ogni 100 ms e score = 0.
  2. Durante il gioco, quando si verifica POINT, aggiungi 1 al punteggio.
  3. Durante il gioco, imposta speed = min(14, 6 + score // 100) prima dell'aggiornamento.
  4. Mostra il punteggio con cinque cifre in (40, 50, 80) con topright=(630, 10).

Provalo tu

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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Regole di gioco

Esercitati da solo: Playground Pygame