domingo, 21 de noviembre de 2010

Pygame (2 parte)

En esta entrada les mostrare como agregar una pelota a la ventana que habíamos creado en la entrada anterior de pygame, crear dos barritas como si fuera un juego.
Para lograr esto usaremos sprites, los sprites son usados en videojuegos para crear los gráficos de los protagonistas, en este caso nuestro sprite sera una pelota pequeña que rebotara entre la pantalla. Vamo a modificar el codigo que ya teniamos, para no volver a hacer las ventanas ni el fondo.
Para esto cambiaremos el fondo de pantalla que teníamos, ya que usaremos otro mas claro en donde se pueda apreciar la dicha pelota.
El fondo que yo use es este:



Nota: hay que guardar la imagen en la ubicación de nuestro código, así como cambiar el nombre en el código de la imagen para que pueda ser cargada.

Despues de esto descargaremos la imagen de la pelota, esta es la que yo use, pero ustedes pueden poner la que sea, mientras sea pequena:

Después de esto agregaremos las siguientes lineas a nuestro código:
-------------------------------------------------------------------------------------
class Bola(pygame.sprite.Sprite): --> esta función es para declarar las sprites, lo que seria la pelota
def __init__(self): --> aquí solo se inicia la clase de arriba
pygame.sprite.Sprite.__init__(self) -->esa función es parecida a la de arriba que sirve para llamar a la clase para el sprite
self.image = load_image("bola.png", True) -->aquí cargaremos la imagen de la pelota
self.rect = self.image.get_rect() -->en esta función se crean las barras, ya que crear en forma de rectángulo

self.rect.centerx = WIDTH / 2
-->esta linea y la de abajo es para la posición inicial de nuestra pelota, podemos modificar los valores para cambiar su posición.
self.rect.centery = HEIGHT / 2

self.speed = [0.5, -0.5]
-->aquí podemos modificar la velocidad de la pelota, solamente cambiamos los valores.
-------------------------------------------------------------------------------------
Despues de agregarle la clase bola a nuestro código, hay que agregarla, para esto ponemos la siguiente linea antes del bucle while:
-------------------------------------------------------------------------------------
bola = Bola()
-------------------------------------------------------------------------------------

Al final el código nos quedaría así:
-------------------------------------------------------------------------------------
import sys, pygame
from pygame.locals import *
WIDTH = 640
HEIGHT = 480

class Bola(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = load_image("bola.png", True)
self.rect = self.image.get_rect()
self.rect.centerx = WIDTH / 2
self.rect.centery = HEIGHT / 2
self.speed = [0.5, -0.5]
def load_image(filename, transparent=False):
try: image = pygame.image.load(filename)
except pygame.error, message:
raise SystemExit, message
image = image.convert()
if transparent:
color = image.get_at((0,0))
image.set_colorkey(color, RLEACCEL)
return image
def main():
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("lab progra web")
background_image = load_image('pingpong.png')
bola = Bola()
while True:
for eventos in pygame.event.get():
if eventos.type == QUIT:
sys.exit(0)
screen.blit(background_image, (0, 0))
screen.blit(bola.image, bola.rect)
pygame.display.flip()
return 0
if __name__ == '__main__':
pygame.init()
main()
-------------------------------------------------------------------------------------
Nos quedaría así:



Ahora sigue lo bueno, le daremos movimiento a nuestra pelota.Para esto agregaremos las siguientes lineas después de haber declarado la clase bola:
-------------------------------------------------------------------------------------
def actualizar(self, time): -->aquí definimos el método para el tiempo transcurrido.
self.rect.centerx += self.speed[0] * time --->esta linea y la de abajo son complicadas, ya que aqui establecemos la velocidad en la que se mueve la pelota mediante ejes, que serian x, y
self.rect.centery += self.speed[1] * time
if self.rect.left <= 0 or self.rect.right >= WIDTH: ---> esta linea y las otras dos de abajo, indican que si la pelota llegue a cualquier extremo, derecho o izquierdo, rebote.
self.speed[0] = -self.speed[0]
self.rect.centerx += self.speed[0] * time
if self.rect.top <= 0 or self.rect.bottom >= HEIGHT: --->esto es lo mismo de arriba, hace que rebote la pelota al momento de llegar a cualquier extremo.
self.speed[1] = -self.speed[1]
self.rect.centery += self.speed[1] * time
----------------------------------------------------------------------------------------------------------
Después de esto vamos a agregarle un reloj, esto nos servirá para que controle el tiempo en que la pelota rebote en la ventana, para esto agregamos la siguiente linea antes del bucle while
--------------------------------------------------------
clock = pygame.time.Clock()
--------------------------------------------------------

Ahora dentro del bucle while agregamos la siguiente linea para saber cuanto tiempo pasa cada vez que se ejecuta una intersección del bucle
---------------------------------------------------------
time = clock.tick(60)
---------------------------------------------------------

Ahora solo ponemos esta linea para actualizar la posición de la pelota antes de actualizarla con la ventana.
--------------------------------------------------------
bola.actualizar(time)
--------------------------------------------------------

Al final nuestro código quedaría de esta forma:
--------------------------------------------------------------------------------
import sys, pygame
from pygame.locals import *
WIDTH = 640
HEIGHT = 480

class Bola(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = load_image("bola.png", True)
self.rect = self.image.get_rect()
self.rect.centerx = WIDTH / 2
self.rect.centery = HEIGHT / 2
self.speed = [0.5, -0.5]
def actualizar(self, time):
self.rect.centerx += self.speed[0] * time
self.rect.centery += self.speed[1] * time
if self.rect.left <= 0 or self.rect.right >= WIDTH:
self.speed[0] = -self.speed[0]
self.rect.centerx += self.speed[0] * time
if self.rect.top <= 0 or self.rect.bottom >= HEIGHT:
self.speed[1] = -self.speed[1]
self.rect.centery += self.speed[1] * time

def load_image(filename, transparent=False):
try: image = pygame.image.load(filename)
except pygame.error, message:
raise SystemExit, message
image = image.convert()
if transparent:
color = image.get_at((0,0))
image.set_colorkey(color, RLEACCEL)
return image
def main():
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("lab progra web")
background_image = load_image('pingpong.png')
bola = Bola()
clock = pygame.time.Clock()
while True:
time = clock.tick(60)
for eventos in pygame.event.get():
if eventos.type == QUIT:
sys.exit(0)
bola.actualizar(time)
screen.blit(background_image, (0, 0))
screen.blit(bola.image, bola.rect)
pygame.display.flip()
return 0
if __name__ == '__main__':
pygame.init()
main()
--------------------------------------------------------------------------------

Pondré imágenes .jpg ya que nose como capturar imágenes gif para mostrar la pelota en movimiento.





Eso es todo, mas adelante continuare de como agregar las barras en los costados.

Fuente: http://miprogramacionenjuegos.wordpress.com/2007/05/15/la-clase-sprite/
http://razonartificial.com/2010/02/pygame-5-moviendo-sprites/












1 comentario: