Uma Câmera Suave
Parte da seção Som e sensação de jogo do Journey de Pygame da Coddy. Lição 17 de 23.
Neste jogo de corrida, a câmera fica grudada no jogador: não importa o que o jogador faça, ele permanece no centro da tela enquanto o mundo desliza sob ele. Funciona, mas cada arrancada e parada sacode a tela inteira.
Faça a câmera acompanhar com a mesma suavização que o círculo. O alvo dela é a posição que centralizaria o jogador:
camera_x += (player.centerx - 240 - camera_x) * 0.1
camera_x = max(0, min(camera_x, WORLD_WIDTH - 480))O jogador se move como antes; só a tela tem o movimento suavizado. Quando o jogador começa a correr, a câmera fica um pouco para trás, então o jogador corre à frente do centro. Quando ele para, a câmera desliza para alcançá-lo e se estabiliza com o jogador novamente no meio. A segunda linha ainda mantém a câmera dentro dos limites do mundo.
O mundo é desenhado em -int(camera_x) como antes. camera_x agora é um número decimal; int() mantém o desenho alinhado a pixels inteiros, enquanto a variável preserva seu valor exato para o próximo quadro.
Um painel de menu que desliza para dentro, uma barra de vida que se esvazia, uma pontuação que aumenta: qualquer coisa que se mova para um novo valor pode ser suavizada da mesma maneira.
Desafio
MédioFaça a câmera acompanhar suavemente: substitua camera_x = player.centerx - 240 por uma linha que mova camera_x um décimo do caminho em direção a player.centerx - 240 a cada quadro. Mantenha a linha que limita seu valor.
Experimente você mesmo
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Long Road")
clock = pygame.time.Clock()
WORLD_WIDTH = 1440
player = pygame.Rect(220, 240, 40, 40)
camera_x = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player.x -= 6
if keys[pygame.K_RIGHT]:
player.x += 6
player.left = max(player.left, 0)
player.right = min(player.right, WORLD_WIDTH)
camera_x = player.centerx - 240
camera_x = max(0, min(camera_x, WORLD_WIDTH - 480))
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 80, 100), (0, 280, 480, 80))
for post_x in range(0, WORLD_WIDTH, 120):
pygame.draw.rect(screen, (80, 160, 255), (post_x - int(camera_x), 220, 20, 60))
pygame.draw.rect(screen, (90, 200, 120), player.move(-int(camera_x), 0))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Som e sensação de jogo
4Vibração da Tela e Flash de Impacto
Vibração da TelaFlash de ImpactoPausa no ImpactoMantenha a Discrição5Movimento Suave
Mova-se em Direção a um AlvoUma Câmera SuaveSalto ao ColetarSuave em Qualquer Taxa de QuadrosPratique por conta própria: Playground de Pygame