Saludos, veo que hay varias formas de lograr ese efecto
de caída. Anteriormente en el foro se comentó como lograr este
efecto:
http://www.losersjuegos.com.ar/foro/viewtopic.php?t=175
Pero, como hay muchas formas de lograr el mismo efecto, aprovecharé
este mensajes para que veamos una alternativa (que se parecerá
un poco más al código que nos muestras).
Puedes imaginar que tu personaje se encuentra (casi en todo momento)
impulsado hacia abajo, como sí la aceleración gravitatoria lo estuviera
obligando a aumentar su coordenada 'y'. Dentro del bucle de juego
tienes algo como lo siguiente:
- Código: Seleccionar todo
y += dy
donde 'dy' representaría la velocidad que lo lleva hacia abajo, e 'y'
la posición de los pies de tu personaje.
A medida que el personaje cea, su velocidad se debe acelerar. Por ese
motivo vamos a aumentar el valor de 'dy' a medida que el personaje
permanece en el aire:
- Código: Seleccionar todo
dy += 0.02
Entonces, para ejemplificarlo con un gráfico, el personaje comienza a
'saltar' cuando el valor de 'dy' es negativo (digamos -20), a medida
que se repite el bucle de juego, 'dy' crece:

Por supuesto, esta es una representación muy básica del efecto
físico; pero aún así, sirve para realizar un juego sin problemas.
Te dejo un programa de prueba de esto realizado en python; el programa
muestra un rectángulo rojo que se puede manejar con las flechas del
teclado: al pulsar hacia arriba el cuadrado 'salta':

- Código: Seleccionar todo
# -*- encoding: utf-8 -*-
import pygame
from pygame import QUIT, K_LEFT, K_RIGHT, K_UP
screen = pygame.display.set_mode((320, 240))
salir = False
color_negro = (0, 0, 0)
color_rojo = (200, 0, 0)
# variables del personaje
personaje = pygame.Rect((0, 0, 30, 30))
dy = 0
x = 40
y = 200
GRAVEDAD = 0.02
# linea horizontal que representa el suelo
pos_suelo = 200
while not salir:
# Actualización de eventos
for e in pygame.event.get():
if e.type == QUIT:
salir = True
# Actualización del personaje
key = pygame.key.get_pressed()
# movimientos horizontales
if key[K_LEFT]:
x -= 1
elif key[K_RIGHT]:
x += 1
# animación de salto
if dy == 0: # si está en el suelo..."
if key[K_UP]:
dy = -2
else:
y += dy # empuja el personaje hacia abajo
dy += GRAVEDAD # y acelera su caida
if y > pos_suelo: # detiene la caida en el suelo
dy = 0
y = pos_suelo
# aplica la posición al personaje
personaje.bottom = int(y)
personaje.centerx = int(x)
# Actualización gráfica
screen.fill((200, 200, 200))
pygame.draw.line(screen, color_negro, (0, pos_suelo), (320, pos_suelo))
screen.fill(color_rojo, personaje)
pygame.display.flip()
# Espera un instante
pygame.time.wait(1)
Copia este código en un archivo de extensión .py y luego ejecuta
"python archivo.py".
A principio puede ser un poco difícil comprender como funciona el
ejemplo, porque la esencia del funcionamiento está en el valor que
toman las variables dentro del bucle. Te recomiendo hacer un seguimiento
paso a paso de las varibles 'dy' e 'y', crear un tabla en papel suele
ser la mejor forma de seguirlo. Algo así:
- Código: Seleccionar todo
dy | y
----------------
-10 | 200
-9.5 | 190
-9 | 180.5
[...] | [...]
parece mucho trabajo, pero una vez que lo comprendes podrás hacer
muchos efectos interesantes en tus juegos, como interpolaciones
y transformaciones.
Saludos.