Programación de videojuegos con pygame.

Bien, hoy programaremos un videojuego sencillo con python, utilizando un módulo que permite la creación de videojuegos en dos dimensiones cuyo nombre es “pygame”. Pygame permite desarrollar y prototipar rápidamente videojuegos en 2 dimensiones, además de ser una interfaz para SDL (Simple Direct Layer) orientada para el dibujado en 2D.

Antes de iniciar a programar nuestro primer videojuego en python, es necesario conocer como está estructurada la anatomía de un videojuego, que nos servirá como referencia para poder desarrollar nuestro videojuego en pygame.

Un videojuego se compone de la siguientes características:

  • Entrada:
    Claramente un videojuego necesita comunicarse con el usuario de alguna manera, esto será a través de un dispositivo de entrada como un joystick o un teclado.
  • Visualización:

    Esta característica tiene que ver con la capacidad de transmitir el estado interno del videojuego a una salida gráfica. Ya sea que el videojuego sea en 2D o 3D, esta característica es importante, ya que, a partir de ella será fundamental el que sea agradable visualmente al jugador. Para este pequeño tutorial será en 2D, dadas las características de programación con las que trabajamos (el módulo pygame solo trabajo con Sprites en 2 dimensiones).

  • Sonido:

    Esta característica también es muy importante, ya que el audio proporcionado al jugador le transmitirá un conjunto de sensaciones que le permitirán determinar si el juego es agradable o no (pygame proveé un conjunto de herramientas para trabajar con audio de manera sencilla).

  • Comunicaciones:

    Actualmente los juegos en línea y más los juegos sociales van ganando más adeptos dentro del mercado de los videojuegos. Normalmente los videojuegos en línea utilizan comunicación TCP/IP, lo cual permite que juguemos con otras personas en nuestra red local o que se encuentra en otros lugares del globo. Como pygame está basado como una interfaz de SDL, nos permite maniobrar con este tipo de cosas, pero este tema sale de nuestro pequeño tutorial.

  • Game loop:

    Esta característica, tal como su nombre indica, es la que realiza el ciclo del juego y se encarga de realizar las actividades antes mencionadas. En la figura siguiente se muestra de manera sencilla como es que está estructurado el “Game Loop”.

Ya que hemos analizado como es que funciona un videojuego, procederemos a realizar el videojuego prometido. El videojuego que haremos será el clásico pong, el cual realizaremos en python, pero para eso lo empezaremos a hacer en el siguiente post, en el cual ya nos dedicaremos directamente a programar en python junto con el módulo pygame.

 

Anuncios

WxPython

Hoy les mostraré como hacer de manera sencilla una aplicación gráfica con python, solo que en esta ocasión nos le hablaré de la interfaz nativa de python que es el módulo Tkinter que permite realizar interfaces gráficas basadas en la biblioteca Tk, sino de otro binding cuyo nombre es wxPython, que proviene de la biblioteca gráfica wxWidgets; esta elección es porque Tkinter es demasiado básico, además de no utilizar bindings nativos del sistema, cosa que wxPython si hace.

WxPython trabaja muy bien en diversas plataformas generando el aspecto nativo de las GUI realizadas con él. El programa es el siguiente:

#! /usr/bin/python
import  wx, os 
#modulos para trabajar con el entorno 
#grafico y el sistema operativo
from wx.lib.wordwrap import wordwrap

#El mensaje de la licencia de nuestra aplicacion
licenceText = "Este es una muestra del poder de python XD"

#Tipo de archivos de ejemplo, estos son utilizados para
#filtrar por extension al momento de invocar "abrir un archivo"
wildcard = "Archivos de audio mp3 (*.mp3)|*.mp3|" \
     "Documento de Word (*.doc)|*.doc|"\
     "Todos los archivos(*.*)|*.*"

#Clase de nuestra ventana de ejemplo     
class MyFrame(wx.Frame):

 def __init__(self):
  """Esta tambien es otra forma de crear comentarios 
  utilizando varias lineas, equivaldria a /** ... */ en Java o C.
  Este es el metodo constructor que permite inicializar a nuestra 
  ventana, es el equivalente al constructor de Java"""

  #Llamamos a la clase Frame que construira nuestra ventana
  wx.Frame.__init__(self,None,-1,"Mi Ventana",size=(400,400))

  #El panel de nuestra ventana para poner botones y demas artilugios
  panel = wx.Panel(self,-1)

  #Un boton que mostrara un dialogo "Sobre..."
  b = wx.Button(panel,-1,"Hola Mundo!",(20,10))

  #integramaos el boton en la ventana
  self.Bind(wx.EVT_BUTTON,self.OnButton,b)

  #Otro boton que abrira un dialogo de abrir un archivo
  b = wx.Button(panel,-1,"Abrir algun archivo",(20,50))

  #igualmente integramos este boton al al panel
  self.Bind(wx.EVT_BUTTON,self.OnButton2,b)

 def OnButton(self,evt):
  """Metodo que reaccionara cuando presionemos el boton Hola Mundo!"""

  #Creamos el dialogo
  info = wx.AboutDialogInfo()

  #le ponemos nombre superior de nuestro dialogo
  info.Name = "Mi Ventana"

  #le asignamos la version de nuestra aplicacion
  info.Version = "1.0"

  #Un copyright
  info.Copyright = "(C) Copyright Miguel Pinia"

  #Una descripcion de nuestra aplicacion
  info.Description = wordwrap("Este es la informacion sobre la aplicacion: "
  "esta aplicacion fue hecha en"
  " python ", 350, wx.ClientDC(self))

  #Asignamos la licencia que creamos al principio del documento
  info.License = wordwrap(licenceText,500,wx.ClientDC(self))

  #Desarrolladores de la aplicacion
  #Nota: Vypi es una mascota XD
  info.Developers = ["Miguel Pinia","wxPython","Vypi la mascota"]

  #la que contendra nuestra informacion
  wx.AboutBox(info)
 def OnButton2(self,evt):
  """Este metodo reaccionara al presionar el boton "abrir" generando 
  un evento que permitira crear un dialogo de apertura a nuestro archivo, 
  claramente este archivo seleccionado no hara nada, ya que no vamos a trabajar
  sobre el, dado que esta es una aplicacion de ejemplo"""

  #Creamos el dialogo y lo mostramos
  dlg = wx.FileDialog(self,message="Escoga un archivo",defaultDir = os.getcwd(),defaultFile="",wildcard=wildcard ,style= wx.OPEN | wx.MULTIPLE | wx.CHANGE_DIR)

  #Si ya seleccionamos el archivo lo unico que haremos sera destruir el dialogo
  if dlg.ShowModal() == wx.ID_OK:
   dlg.Destroy

if __name__=="__main__":
 """Metodo main"""
 app = wx.App()

 #creamos un objeto de la clase myframe
 frame = MyFrame()

 #Lo mostramos hasta que algun evento ocurra
 frame.Show(True)
 app.MainLoop()

Con esto hemos generado una pequeña aplicación gráfica de manera sencilla, de hecho más rápido y sencillo que otras alternativas en otros lenguajes de programación como Java o C (de hecho, es más sencillo que programar en Swing con Java o GTK+ con C :P). Trabajar con python puede ser más sencillo y enriquecedor, si lo que queremos es aprender a programar. WxPython es muy sencillo de utilizar y muy bonito ver que funciona en las distintas plataformas que existen, para ilustrarlo pondre unas capturas de como trabaja en Windows XP y Ubuntu.

Windows.

Ubuntu:

Aquí es mostrada la apariencia nativa del mismo programa en Ubuntu, aqui se ve claramente que no hubo necesidad de cambiar el código original.

Antes de terminar, les pondré unos cuantos enlaces para mayor información:

Con esto he terminado esta pequeña reseña sobre como trabajar gráficos en python.