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.
Sfida
Medio- Aggiungi
POINT = pygame.USEREVENT + 2, un timer per questo ogni 100 ms escore = 0. - Durante il gioco, quando si verifica
POINT, aggiungi 1 al punteggio. - Durante il gioco, imposta
speed = min(14, 6 + score // 100)prima dell'aggiornamento. - Mostra il punteggio con cinque cifre in
(40, 50, 80)contopright=(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()
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Regole di gioco
3Timer e ondate
Al sicuro dopo un colpoUn evento del timerUna roccia ogni 800 msOnde che cresconoConto alla rovescia per partire6Corridore del cielo
Il corridoreSaltoEsercitati da solo: Playground Pygame