Hola de nuevo!
Bueno, el titulo lo dice todo. Despues de probar algunas cosas con el modulo Pygame, me he atascado con la gravedad. Esta claro que es algo tan sencillo como manejar la coordenada Y. De esa forma nuestro personaje desciende si no colisiona con un objeto definido.
Dos problemas me han surgido:
1. Que se queda pegado al objeto que colisiona y no obedece a la ordenes del teclado.
2. Si aumentamos la gravedad, nuestro personaje se detiene al colisionar. Pero deja unos pixeles de distancia el objeto que colisiona.
Este es el codigo que seguro tendra errores:
Código Python:
Ver originalimport pygame
from pygame.locals import *
import sys
import os
os.environ['SDL_VIDEO_CENTERED'] = '1'
pygame.init()
ANCHO = 1024
ALTO = 768
# pygame.NOFRAME sin margenes
ventana = pygame.display.set_mode((ANCHO, ALTO))
NEGRO = (0, 0, 0)
AZUL = (0, 0, 255)
VERDE = (0, 192, 0)
# Clases -----------------------------------------------------------------------
class Pared(pygame.sprite.Sprite):
def __init__(self, x, y, largo, alto, color):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((largo, alto))
self.image.fill(color)
self.rect = self.image.get_rect()
self.rect.centerx = ANCHO/2
self.rect.centery = ALTO/2
self.velocidad = 0
def update(self):
ventana.blit(self.image, self.rect)
class Personaje(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((64, 64))
self.image.fill(VERDE)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
def __str__(self):
return ('Coordenada X: ' + str(self.rect.x) + ' Coordenada Y: ' + str(self.rect.y))
def mover(self, x,y):
self.rect.move_ip(x, y)
def colision(self, other):
return self.rect.colliderect(other)
def update(self):
ventana.blit(self.image, self.rect)
class Enemigos(pygame.sprite.Sprite):
pass
# ------------------------------------------------------------------------------
muro = Pared(0, 0, 800, 32, AZUL)
heroe = Personaje(100, 100)
def run():
fps = pygame.time.Clock()
salir = False
heroe.velocidad = 4
gravedad = 8
while not salir:
for evento in pygame.event.get():
# con raton: pygame.MOUSEBUTTONDOWN
if evento.type == pygame.QUIT:
salir = True
# Movimiento del personaje
oldx = heroe.rect.x
oldy = heroe.rect.y
tecla = pygame.key.get_pressed()
if tecla[K_LEFT] and not tecla[K_RIGHT]:
heroe.mover(-heroe.velocidad, 0)
elif tecla[K_RIGHT] and not tecla[K_LEFT]:
heroe.mover(heroe.velocidad, 0)
elif tecla[K_UP] and not tecla[K_DOWN]:
heroe.mover(0, -heroe.velocidad)
elif tecla[K_DOWN] and not tecla[K_UP]:
heroe.mover(0, heroe.velocidad)
# Muestra las coordenadas del personaje por consola
print(heroe)
# Gravedad
if not heroe.colision(muro):
heroe.mover(0, gravedad)
# Colision con el muro
if heroe.colision(muro):
heroe.rect.x = oldx
heroe.rect.y = oldy
# Evita que salga por los extremos de la ventana
if heroe.rect.left < 0:
heroe.rect.left = 0
elif heroe.rect.right > ANCHO:
heroe.rect.right = ANCHO
elif heroe.rect.top < 0:
heroe.rect.top = 0
elif heroe.rect.bottom > ALTO:
heroe.rect.bottom = ALTO
# Actulizacion y dibujo de pantalla
ventana.fill(NEGRO)
muro.update()
heroe.update()
pygame.display.flip()
fps.tick(30)
run()
pygame.quit()
sys.exit()
Seguro que debe ser algo tan sencillo como poner algun ELSE en alguna parte del script. Pero no me funcionan.
Si en la variable gravedad ponemos 12, si que se queda bien asentado en el objeto muro. Si ponemos 8, no.