Menu
CoddyTech

Saltare da terra

Fa parte della sezione Mondi del percorso Pygame di Coddy. Lezione 11 di 35.

Un salto è una velocità negativa. Imposta vel_y = -15 e il giocatore si sposta verso l’alto di 15 pixel; la gravità sottrae 1 a ogni fotogramma finché il giocatore non ricade. Questo crea l’arco.

Un salto dovrebbe iniziare solo da terra. Mantieni un flag che indica se il giocatore si trovava sul pavimento in questo fotogramma:

vel_y += GRAVITY
player.y += vel_y
on_ground = False
if player.bottom > FLOOR:
    player.bottom = FLOOR
    vel_y = 0
    on_ground = True

Usa l’evento KEYDOWN per il salto, così una pressione corrisponde a un salto, indipendentemente dal fatto che il tasto sia tenuto premuto o meno:

elif event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
    if on_ground:
        vel_y = JUMP

event.key in (pygame.K_SPACE, pygame.K_UP) è True per entrambi i tasti. In aria, on_ground è False, quindi una seconda pressione non ha effetto.

challenge icon

Sfida

Medio
  1. Aggiungi JUMP = -15 in alto e on_ground = False prima del ciclo di gioco.
  2. A ogni fotogramma, imposta on_ground = False prima del controllo del pavimento e on_ground = True al suo interno.
  3. Alla pressione di Spazio o Freccia su, con un evento KEYDOWN, quando on_ground è True, imposta vel_y = JUMP.

Provalo tu

import pygame

TILE = 36
FLOOR = 324
GRAVITY = 1

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Gravity")
clock = pygame.time.Clock()

background = pygame.image.load("assets/backgrounds/clouds.png").convert_alpha()
grass_img = pygame.image.load("assets/images/grass.png").convert_alpha()
player_img = pygame.image.load("assets/images/player.png").convert_alpha()

player = player_img.get_rect(topleft=(264, 40))
vel_y = 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 -= 4
    if keys[pygame.K_RIGHT]:
        player.x += 4

    vel_y += GRAVITY
    player.y += vel_y
    if player.bottom > FLOOR:
        player.bottom = FLOOR
        vel_y = 0

    for y in range(0, 360, 72):
        for x in range(0, 576, 72):
            screen.blit(background, (x, y))
    for x in range(0, 576, TILE):
        screen.blit(grass_img, (x, FLOOR))
    screen.blit(player_img, player)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Tutte le lezioni di Mondi

Esercitati da solo: Playground Pygame