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.
Tantangan
Sedang- Tambahkan
POINT = pygame.USEREVENT + 2, timer untuknya setiap 100 ms, danscore = 0. - Saat permainan berlangsung dan
POINTterjadi, tambahkan 1 ke skor. - Saat permainan berlangsung, atur
speed = min(14, 6 + score // 100)sebelum melakukan pembaruan. - Tampilkan skor sebagai lima digit dalam
(40, 50, 80)dengantopright=(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()
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Aturan Game
Latihan sendiri: Playground Pygame