Saltar obstáculo Pygame

En la mayoría de juegos los personajes tienen que esquivar o saltar obstáculos para seguir la aventura, vamos a mostrar como hacerlo con dos cuadrados que luego podemos convertir en personajes.

Comenzamos por importar librería y asignar valores iniciales a variables que luego utilizaremos.

import pygame
pygame.init()

negro=pygame.Color('black')
rojo=pygame.Color('red')
blanco=pygame.Color('white')
gris=pygame.Color('gray')
colorFondo=blanco
width = 900 
height = 700
vel=0
salto=10
isJump=False
x=200
y=480

Definimos la ventana y abrimos el bucle del juego.

#----------------Ventana y título---------------------
ventana = pygame.display.set_mode((width,height)) 
pygame.display.set_caption('Ladrillo')
clock=pygame.time.Clock()

#/////////////////Bucle del juego/////////////////
gameOver=False
while not gameOver:
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            gameOver=True

Con el teclado asignamos valores para desplazar las coordenadas a izquierda y derecha.

#----------- Teclas derecha izquierda ---------------  
    if event.type == pygame.KEYDOWN:
        if event.key ==pygame.K_LEFT: #Si es menor no voy a despalzar
            vel = -7

        if event.key == pygame.K_RIGHT: #Llega hasta el ancho menos el ancho del personaje
            vel = 7
            
            # Si no está en salto /////////////////////////
        if event.key ==pygame.K_SPACE:
            isJump=True
            
    if event.type == pygame.KEYUP:
        if event.key ==pygame.K_LEFT: #Si es menor no voy a despalzar
            vel = 0

        if event.key == pygame.K_RIGHT: #Llega hasta el ancho menos el ancho del personaje
            vel = 0  

Definimos, a continuación el salto.

    if isJump: # Si está en salto/////////////////////////////////
        
        if salto>= -20:  #Caida hasta -20
            y -= (salto * abs(salto)) *0.5     #La variable va reduciendo hasta llegar arriba 10 y luego inverso hasta -20
            salto-=1                         #Decrementamos el valor de salto para obtener valores de y
            if movil.colliderect(suelo):     #Si colisiona con suelo reseteamos valor salto para volver a saltar
                salto=10
                isJump=False
            
        else:
            salto = 10 #Reseteamos la variable para próximos saltos
            isJump=False #Salgo del ciclo 

La variable isJump es TRUE cuando pulsamos la tecla SPACE, entonces dibujamos una parábola que termina si colisionamos con el cuadrado suelo o cuando la variable salto llega a -20. En los dos casos reseteamos salto y ponemos isJump en FALSE para que pueda volver a saltar.

En la parte lógica cambiamos coordenadas de x con la acción del teclado y limitamos el campo de acción por la ventana.

    #------------ LOGICA -------------------
    x += vel #Coordenadas x añaden velocidad "vel"

    if y>480:
        y=480
        
    if x<40:
        x=40
    if x>800:
        x=800

Dibujamos el fondo y los cuadrados.

    #-------------FONDO---------------------
    ventana.fill(colorFondo) #Fondo color
    
    #------------ DIBUJO ------------------
    suelo=pygame.draw.rect(ventana, gris,(410,480,60,20))
    ladrillo=pygame.draw.rect(ventana, negro,(400,500,80,60))
    movil=pygame.draw.rect(ventana, rojo,(x,y,80,80))

Ahora vamos a configurar las colisiones. Si el cuadrado móvil colisiona con el cuadrado ladrillo impedimos que siga desplazándose y dejamos isJump en false para que pueda volver a saltar.

    # //////////Colisión si viene de salto resetea valores y sale de bucle//////////////
    if movil.colliderect(ladrillo):
        if isJump:
            y-=20
            salto=10
            isJump=False
        
        # /////////////////Colisión lateral sin salto ////////////////
        if vel==7 and isJump==False:
            x=x-7
        elif vel==-7 and isJump==False:
            x=x+7

Por último si el cuadrado móvil no está en colisión con cuadrado suelo y no está en salto, entonces añadimos a la coordenada y+=10 para que caiga 10.

    # Si no está en colisión con suelo y No salto cae 10        
    if not movil.colliderect(suelo) and isJump==False:
        y+=10
    
    pygame.display.flip()
    clock.tick(20)
pygame.quit()

Juande Marín

Profesor de Marketing digital, divulgador de inteligencia artificial y neuroeducación. Especializado en posicionamiento en buscadores y diseño web. Autor de varios libros relacionados con el comercio electrónico y el marketing digital (McGraw Hill, Paraninfo,…) Juande2marin

Material didáctico

Descubre un material moderno y adaptado a ciclos formativos.