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 original
import 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.