domingo, 17 de febrero de 2008

Pong Online 0.1

Acabo de subir la primera version del pong online que estoy haciendo, hasta el momento tiene un par de fallas en la deteccion de colisiones pero ya arreglare eso.

es.geocities.com/war_chocobo/pong_online_0.1.zip

Hay 2 archivos, un servidor y un cliente, el servidor no muestra informacion grafica solo hace calculos como por ejemplo la deteccion de colisiones, por el otro lado los clientes hacen la menor cantidad de calculos posibles solo muestran la informacion grafica.

En este juego se nesecita que esten conectados los 2 jugadores para poder jugar, a modo de prueba uno puede hacer correr los 2 clientes en el mismo computador.

El servidor es facilmente ampliable a mas a jugadores lo que serviria para hacer un mmorpg que debe ser el objetivo de muchos de los programadores de video juegos.

Les dejo el codigo a modo de tutoriales, sugerencias respecto al codigo son bienvenidas.

viernes, 15 de febrero de 2008

Tipos de datos

En python los tipos de datos no son muchos, para vale la pena conocerlos

int:
abreviación de integer, son números enteros o sea números sin decimales, como por ejemplo: -50

float:
abreviación de floating point, con coma flotante o sea números con decimales, como por ejemplo: 2.5

character:
son caracteres, como por ejemplo 'h'

advertencia:
'1' es un caracter
1 es un integer
cuidado al hacer comparaciones puesto que
1 es distinto de '1'

se puede convertir un tipo de dato a otro, por ejemplo
str(1) convierte el integer 1 al caracter '1'
int('1') convierte el caracter '1' al numero 1

Advertencia:
1 + 1 = 2
'1' + '1' = '11'

Tenga cuidado en python los operadores están sobrecargados, eso quiere decir que dependen del tipo de dato, no es lo mismo 1+1, que '1' + '1', en el primer caso el operador mas hace de suma, en el segundo de concatenación.

jueves, 14 de febrero de 2008

Hacer juegos multijugador online

He estado programando un pong multijugador online, a penas lo tenga listo lo voy a poner en la pagina, tambien estoy pensando en poner tutoriales de como programar juegos en linea utilizando la libreria Twisted para python, ya que es bastante dificil encontrar documentacion en linea respecto al tema.

Aqui les dejo el link para que descarguen la libreria
http://twistedmatrix.com/trac/

martes, 12 de febrero de 2008

Tutorial de POO

Para los que les gusta profundizar, encontre un buen tutorial sobre programacion orientada a objetos, esta en español, es bien claro y preciso, la direccion es:

http://blog.rvburke.com/2006/11/22/programacion-orientada-a-objetos-en-python/

Programacion Orientada a Objetos II : Herencia

La herencia es uno de los grandes beneficios de trabajar con objetos, consiste en crear un nuevo objeto al que llamaremos hijo, el cual adquiere automicamente todos los atributos y metodos que contenga su padre. Veamos un ejemplo


#Codigo----
class Padre:
def __init__(self):
self.valor1 = 5
self.valor2 = 9

class Hijo(padre):
def __init__(self):
Padre.__init__(self)
def mostrar(self):
print "valor1: ", self.valor1
print "valor2: ", self.valor2

luego instanciamos el objeto hijo, no es necesario instanciar el padre ya que el hijo contiene todos los atributos y metodos del padre


hijo = Hijo()
hijo.mostrar

mostraria en la pantalla:
valor1: 5
valor2: 9

en C++ habria mucho mas que hablar de herencia, pues ahi los datos se pueden proteger del exterior dandoles el caracter de privado, y existen distintos niveles de proteccion, pero en python todos los datos siempre son de caracter publico, aun asi el programa siempre debe ser escrito considerando siempre en lo posible el principio de encapsulacion, el cual consiste en que cada objeto es cerrado en si, o sea no cambia los valores de los otros objetos y estos valores solo se modifican mandandose mensajes a traves del codigo principal.

domingo, 10 de febrero de 2008

Programacion Orientada a Objetos

Lo programacion orientada a objetos de ahora en adelante POO por ser esa su sigla, nos brinda un mundo de oportunidades, entre las mas entendibles estan la capacidad de reutilizar codigo, (similar a las funciones en ese aspecto) y la capacidad que tiene para ordenarlo, imaginate que tienes un codigo de unas 5000 lineas, encontrar algo ahi puede ser complicado.

En los terminos mas sencillos posibles un objeto es un grupo de datos y funciones. En terminos un poco mas tecnicos un objeto es un enfoque abstracto de un problema. un ejemplo practico seria el objeto personaje



#Codigo----
class Personaje:
def __init__(self):
self.posX = 400
self.posY = 300
self.color = (255, 255, 255)
self.radio = 50

def draw(self):
pygame.draw.circle(SCREEN, self.color,\
(self.posX, self.posY), self.radio)
pygame.display.update()

La palabra class se ocupa para avisarle al compilador que hemos empezado a escribir un objeto.

La funcion __init__ recibe el nombre tecnico de constructor, en terminos practicos simplemente lo que este puesto ahi seran los valores iniciales de nuestro objeto.

La funcion draw dibuja al personaje en la pantalla, el \ que hay ahi es simpelemente para escribir en 2 lineas, no cumple ningun rol a la hora de correr el juego.

Repasemos el vocabulario antes de seguir:
argumento = valor que recibe una funcion.
clase = abstraccion del objeto.
atributo = cualquier variable o constante definido dentro de la clase.
metodo = cualquier funcion definida dentro de la variable que contenga el argumento self.
constructor = metodo que permite asignar valores iniciales a un objeto.

advertencia:
A todos los atributos de un objeto los debe preceder un self. , es esto lo que los convierte en atributos


class miclase:
def __init__(self):
a = 0 # Esto no es atributo y no se puede hacer nada con el desde fuera del codigo
self.a = 0 # Esto si es un atributo


Ahora volviendo a nuestro personaje, que ventajas tiene?, como lo usamos?.
Para que esto quede claro voy a juntar la clase personaje con el codigo anterior, y ahi notaran la utilidad, pero antes me falta por explicar un solo concepto que es el de instancia, una instancia es cuando se crea un objeto, esto se hace asi

mi_instancia = mi_objeto()

aqui va el codigo:

#Codigo----
import pygame
from sys import exit
SCREEN = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()

class Personaje:
def __init__(self):
self.posX = 400
self.posY = 300
self.color = (255, 255, 255)
self.radio = 50
def draw(self):
pygame.draw.circle(SCREEN, self.color,\
(self.posX, self.posY), self.radio)
pygame.display.update()

personaje = Personaje()

while True:
clock.tick(60)
SCREEN.fill((0,0,0))
personaje.draw()

for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
personaje.posX = personaje.posX - 10
elif event.key == pygame.K_RIGHT:
personaje.posX = personaje.posX + 10


Espero que haya quedado claro puesto que la programacion orientada objetos es muy util a la hora de desarrollar video juegos, en especial aquellos en 3D.

Controlar la velocidad del juego

Dentro del bucle principal el codigo se lee miles de veces por segundo, y si dibujamos al personaje dentro del bucle principal, el personaje se estaria dibujando miles de veces por segundo, mucho mas de lo que necesitamos, ademas el gasto de recursos de dibujar mil elementos cada segundo es monstruoso, y ya que estamos en la onda ecologica y gastar menos corriente electrica para disminuir el calentamiento global o bien si eso no te interesa y quieres asegurarte que tu juego corra a la misma velocidad independiente si es un pentium de 400 MHz o un pentium 4 de 2.0 GHz entonces debes agregar un reloj al juego, y esto se hace de la siguiente forma:

clock = pygame.time.Clock()

ahora que ya tienes un reloj, dentro del ciclo principal tienes que hacerlo marcar a la velocidad que quieres que corra tu juego, o sea si quieres que tu juego corra a 60 ciclos por segundo, o mejor dicho 60 cuadros por segundo, entonces escribes dentro del bucle principal

clock.tick(60)

y eso seria todo.

Retomando el ejemplo anterior donde dibujabamos un circulo en la pantalla, agregando un reloj el codigo quedaria asi:


#Codigo----
import pygame
from sys import exit

SCREEN = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
posX = 400
posY = 300


while True:
clock.tick(60)
SCREEN.fill((0,0,0))
pygame.draw.circle(SCREEN, (255,255,255), (posX, posY), 50)
pygame.display.update()

for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
posX = posX - 10
elif event.key == pygame.K_RIGHT:
posX = posX + 10

#-------


Los dejo por hoy, que tengan buenas noches.

Postear codigos fuentes en html

Hace ya varios meses que el tema de como postear los codigo en html me estaba volviendo loco, debido a que el uso de espacios antes de un texto cualquiera es ignorado, no podia respetar la identacion que debe tener cada bucle, en algunos lenguajes como C/C++, la identacion puede ser ignorada, es simplemente buena practica, pero en lenguajes como Python es obligatoria.

La solucion que estaba ocupando era usar la etiquita div, y de esa manera darle a cada bloque un margen de 10 pixeles mas respecto al anterior, lo hacia de la siguiente manera:

div style="margin-left: 10px;"
obiamente entre <> pero si los pongo en el ejemplo se formatea mi texto y queda invisible.

pero el problema de esta solucion es que los espacios son virtuales, realmente no existen, son solo una capa de estilo y si deseascopiar el codigo de la pagina y pegarlo en otra parte la identacion se suprime.

Hoy por fin encontre la solucion. Es ocupando la etiqueta pre.
De esta manera se respeta al 100% el codigo que tu escribas, pero cuidado si escribes una linea muy larga la pagina puede adquirir un scroll horizontal muy grande y eso es incomodo para los lectores, de hecho de por si el scroll horizontal para un texto es mala idea, evitalo.

aqui va una prueba para que lo vean funcionando


sin etiqueta pre:
hola
hola
hola
hola

con etiqueta pre:
hola
hola
hola
hola


Saludos.

viernes, 8 de febrero de 2008

Diccionarios

Los diccionarios son otra de las claves para hacer juegos en python, funcionan muy parecido a las listas, pero en lugar de ordenarse los terminos a traves de un indice, se ordenan a traves de una clave, la clave la pones tu.

Para crear un diccionario vacio:
mi_diccionario = {}

Para agregar un elemento al diccionario:
mi_diccionario[clave1] = un_valor

para sacar un elemento de un diccionario:
mi_diccionario.pop(clave)

Supongamos que queremos cargar imagenes al juego, podriamos cargarlas todas en variables separadas, tambien podriamos cargarlas todas a una lista, pero definitivamente la mejor manera es administrarlas a traves de un diccionario de la siguiente manera:

images = {}
images["Heroe"] = pygame.image.load("heroe.png")
images["Enemigo"] = pygame.image.load("enemigo.png")

De esta manera si quisieramos dibujar al heroe en la pantalla bastaria con:
SCREEN.blit(images["Heroe"], (posicion_X, posicion_Y).

De la misma manera podemos usar los diccionarios para administrar los sonidos, y como resultado tener un codigo limpio y ordenado y facil de mantener.

jueves, 7 de febrero de 2008

Ballons Beta

He trabajado todo el dia pero ya tengo un adelanto listo, esta en version beta todavia, falta poner la introduccion, el final, hacer las etapas, en fin, falta todo. pero por lo menos ya es "jugable".



Hagan click en la imagen para descargar el codigo fuente, necesitan python y pygame para correr el juego


Si lo de la imagen no resulta por alguna misteriosa razon, y quieres descargar el codigo, la direccion donde lo puedes descargar es la siguiente:

http://es.geocities.com/war_chocobo/balloonsV8.zip

Ojala les guste, espero su opinion.

miércoles, 6 de febrero de 2008

Balloons

El primer juego que hice se llamaba Balloons, es ese que esta en la foto de alla abajo, consiste en agarrar los globos los cuales salen de las cajas antes de que ellos salgan de la pantalla, el codigo es relativamente sencillo y por lo demas el juego es muy tierno, tiene tres niveles distintos (mañanta, tarde y noche) y la diferencias es que iban apareciendo globos de distintos colores que eran mas rapidos. Para hacer mas entretenido el juego quise agregarle plataformas sobre las que tu pudieras saltar, y asi darle un toque mas de destresa al juego, pero como la caida del personaje tiene aceleracion y por lo tanto la velocidad cambiaba cada frame no lograba detectar si debajo del personaje habia o no plataforma, y por ende el personaje a veces las atravesaba o quedaba metido entre medio de ellas, al final opte por remover las plataformas del juego, pero por el mismo motivo el juego quedó tan simple que aburria muy rapido puesto que lo unico que habia que hacer era agarrar los globos antes de que estos se escaparan.




Ayer rehice el juego ocupando algunas tecnicas nuevas aprendidas, como por ejemplo una matriz que guarda la informacion del escenario de la cual hablare en un futuro post. Ademas ocupe tecnicas de sprite por lo que mejore el rendimiento del juego, ahora por cada cuadro solo se actualiza el personaje y no todo el escenario. De lo anterior tambien hablare mas adelante aunque en los links que publique se trata bien a fondo el tema de los sprites.


Pronto publicare el juego asi que paciencia.
Buena suerte y buenas noches.

Tutorial sobre Pygame

Siempre es mejor que sobre informacion a que falte, en esta ocasion voy a poner un link a una blog que contiene bastante informacion respecto a temas que todavia no he tratado, como por ejemplo el uso de los sprites y como hacer scroll de un fondo de pantalla, asi que para los que estan muy ansioso por aprenderlo todo y aprenderlo ya, aqui les dejo el link

http://miprogramacionenjuegos.wordpress.com/category/pygame/

Suerte y gracias por su tiempo.

martes, 5 de febrero de 2008

Deteccion de Colisiones

Ya hablamos anteriormente acerca de como dibujar tu personaje en la pantalla, aunque solo fuera un circulo, y de la misma manera podemos poner otros personajes en la pantalla, el problema que tenemos ahora es como saber si dos o mas de los personajes estan tocandose, para solucionar esto existen los Rects, un rect (un rectangulo) el cual es una especie de contenedor de la superficie, para crear uno basta con:

mi_rectangulo = pygame.Rect(posicion_izquierda, posicion_derecha, ancho, alto)

Donde todas las medidas estan en pixeles, o sea si quiero crear un rectangulo de ancho 100 y de alto 100 en el extremo superior izquierdo de la pantala seria:

mi_rectangulo = pygame.Rect(0, 0, 100, 100)

Advertencia para los matematicos: la pantalla no es igual al plano cartesiano, en el sentido de que si quieres dibujar algo mas abajo en la pantalla, son mas pixeles, puesto que todo se mide en distancias de pixeles desde el extremos superior derecho de la superficie principal creada.

Aprovecho el tema y la oportunidad para explicar como dibujar un cuadrado en la pantalla, esto se hace muy parecido a los circulos, se hace asi:

pygame.draw(superficie, color, rect)

o sea si la superficie principal es SCREEN, el color azul, y el rectangulo el que declaramos anteriormente, entonces para dibujar el cuadrado seria:

pygame.draw(SCREEN, (0, ,0, 255), mi_rectangulo)

Ahora viene la parte importante, ¿como sabemos si 2 rectangulos estan sobrepuestos?, puesto que nos gustaria saber si nuestra paleta golpeo la pelota, o si una bala dio con un blanco, o si estamos chocando contra una pared.

Para solucionar eso existe la funcion colliderect, y se usa de la siguiente manera mi_rectangulo.colliderect(otro_rectangulo).

La funcion retornara verdadero o falso segun corresponda.

Mas adelante entrare mas en el tema de las colisiones que es uno de los puntos criticos a la hora de crear juegos.

lunes, 4 de febrero de 2008

Tutorial sobre SDL para C/C++

Para todos aquellos que son mas amigos de C/C++ encontre un tutorial muy bueno sobre programacion de juegos con SDL, a continuacion les dejo el link.

http://www.javielinux.com/articulos/sdln1/sdl-n1/book1.html

Tutorial de linuxjuegos

Encontre un tutorial muy bueno sobre programacion de video juegos en español usando python y pygame, vale la pena verlo asi que no si les interesa aprender a programar juegos, no se lo pierdan.

Los tutoriales pertenecen a la comunidad de Linux Juegos, la cual tiene mucha informacion importante, parece que voy a pasar varias horas leyendo antes de seguir escribiendo.


Aqui les dejo los links.
tutorial parte 1
tutorial parte 2

Buena lectura.

Listas

Las listas son una de las claves para hacer juegos, una lista es una especie de contenedor que sirve para agrupar datos, una especie de lo que vendria siendo un array en otro en lenguaje pero altamente dinamico. Una lista se declara de la siguiente manera:

nombre_de_lista = []

Se le puede asignar valores iniciales y estos valores no tienen porque ser del mismo tipo

cosas = ["mesas", "comida", 23, 2]

Si quisieramos acceder a los elementos de una lista, podemos accederlo a traves de su indice, tal como si fuera un array, o sea si escribimos cosas[0], obtendriamos como resultado el string mesas.

si quisieramos recorrer completamente la lista lo podemos hacer de la siguiente manera:

#Codigo---
for elemento in cosas:
print elemento

#-----

con ese codigo podemos escribir toda la informacion que hay en la lista.

Si quisieras cambiar algun valor en la lista basta con saber su indice, o sea el lugar en que esta en la lista, debes recordar que la enumeracion empieza desde 0 y no de 1 y que por lo tanto el ultimo valor es el tamaño de la lista menos uno. Pues si intentas acceder a un valor que no existe el programa se cerrar. Supongamos que queremos cambiar el tercer elemento de la lista, entonces basta con cosas[2] = "nuevo elemento"

Existe otro tipo de contenedor que se llama tupla, las tuplas o mas genericamente conocidas como n-plas, son mas livianas que las listas, pero no soportan reasignacion, si la idea simplemente es contener datos utiliza una tupla, pero si quieres estar cambiando los valores, utiliza una lista.

Como ultimo me falta explicar como se agregan y se sacan datos de las listas, esto se hace a traves de la funcion append, para agregar un dato seria cosas.append("nueva cosa").
Para remover el dato basta con cosas.remove("nueva cosa"), tambien es posible remover el ultimo valor utilizando al funcion pop, o sea cosas.pop(), nos retornaria el ultimo valor, veamos un ultimo ejemplo para ver si quedo todo claro.

#Codigo---
a = [] # Creamos una lista vacia
a.append(1) # Agregamos un elemento
a.append(2)
print a # Esto nos mostraria en la pantalla [1,2]
print a[0] # Esto nos mostraria el numero 1 en la pantalla
b = a.pop
print b # Esto nos mostraria el numero 2 en la pantalla
#---------------

Tambien es posible copiar una lista a otra lista, se hace de la siguiente forma:

a = [1,2,3,4,5]
b = a

Este tipo de copia tiener una caracteristica especial, se llama copia por referencia, es muy rapido pero como consecuencia tiene que si yo modifico a o b, tambien modifico la otra lista, ejemplo:

a = [1,2,3,4,5]
b = a
a[0] = 5
print b
>>> [5,1,2,3,4,5]

Hay una segunda forma de copiar una lista, y es haciendolo por valor, aunque podrias poner los elementos 1 a 1, iterando la primera lista y haciendo appends a la segunda vacia, hay una forma aun mas comoda y es la siguiente

b = a[:]

Los dejo hasta aca, mucha suerte que tengan un buen dia.

Funciones

Las funciones sirven para no tener que reescribir codigo y a su vez para mantenerlo ordenado.

¿Como se crea una funcion en python?

def nombre_funcion(arg1, arg2, .....)
aqui se pone el codigo de la funcion
aqui va el retorno de la funcion

Una vez que la funcion llega al retorno, o se encuentra sin mas codigo debajo se devuelve a leer donde estaba antes, en caso que desees que la funcion no reciba ningun argumento simplemente no pongas nada entre los parentesis.

veamos un ejemplo concreto por ejemplo la funcion suma.

#Codigo ---
def suma(a, b):
c=a+b
return a+b

En el ejemplo anterior a es el primer argumento, y b el segundo argumento y por ultimo el retorno de la funcion es la suma de ambos argumentos, ahora en adelante para sumar dos valores podriamos ocupar la funcion suma y simplemente escribir suma(4, 7) y obtendriamos como resultado 11.

una funcion como retorno puede hacer un llamado a otra funcion o asi misma, en este ultimo caso se llama funcion recursiva pero ese es un tema que trataremos mas adelante.

domingo, 3 de febrero de 2008

Crear una ventana con pygame

El hola mundo de los video juegos, o sea el codigo mas sencillo posible consiste en crear una ventana donde pondremos los objetos de nuestro juego, como el heroe y los escenarios, aqui les escribo el codigo



#Codigo ----
import pygame
from sys import exit

SCREEN = pygame.display.set_mode((800, 600))
SCREEN.fill((0,0,0))

while True:
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()


Aqui no hay mucho que explciar, se importa primero la libreria pygame y luego la funcion exit para salir del programa desde la libreria sys.

Luego se crea una ventana a traves del comando pygame.display.set_mode(), la cual como parametro recibe una tupla, o sea 2 datos, los cuales son el ancho y el alto.

Luego pintamos esa pantalla de negro, los colores estan dados en el sistema RGB, eso quiere decir que cada uno de los valores es un numero entre 0 y 255 que corresponde a la cantidad de color de los colores respectivos, la R es de RED, la G de GREEN y la B de BLUE. Si quisieramos pintar la pantalla de rojo deberias pasar el parametro (255, 0, 0).

Cada vez que hagamos un cambio en la pantalla para poder visualizarlo tenemos que actualizarla, eso se hace a travez del comando pygame.display.update()

Una vez lista la pantalla entramos al bucle principal y nuestro programa queda esperando hasta que alguien lo cierre.

ahora veamos un poco mas, como hacer un personaje, digamos que nuestro heroe es un circulo, y que solo se puede mover horizontalmente con las teclas flecha derecha y flecha izquierda, el codigo para hacer eso seria el siguiente:


#Codigo----
import pygame
from sys import exit

SCREEN = pygame.display.set_mode((800, 600))
posX = 400
posY = 300


while True:
SCREEN.fill((0,0,0))
pygame.draw.circle(SCREEN, (255,255,255), (posX, posY), 50)
pygame.display.update()

for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
posX = posX - 10
elif event.key == pygame.K_RIGHT:
posX = posX + 10

#-------

Ahora el codigo se parece mucho al anterior, las diferencias son que este programa responde a 2 eventos mas, que son presionar la tecla izquierda y presionar la tecla derecha, ademas de lo anterior se dibuja un circulo de color blanco en la posicion posX, posY las cuales podemos variar a medida que vamos presionando las teclas flecha izquierda y flecha derecha.



La funcion dibujar circulo recibe los siguientes parametros:
  1. Superficie de destino, en este caso la pantalla
  2. Color, tiene que estar en RGB
  3. Posicion del centro
  4. Radio
Bueno ya hicimos una introduccion a pygame, mas rato o mañana escribire un poco mas respecto al tema, como por ejemplo como dibujar cosas mas complejas que circulos.

Enlace interesante

Navegando por ahi encontre una blog de programacion de video juegos usando python y pygame que tiene varios enlaces a informacion y tutoriales, inclusive contiene un video de mas de media hora sobre una conferencia sobre el tema de la programacion de video juegos, los enlaces pueden ser vistos en http://kalans.wordpress.com/category/programacion/python/

Importar librerias en python

La filosofia python para resolver un problema es el siguiente.

Importar algo de la libreria para resolver tal problema
Resolver tal problema

Ahora pongamonos un problema real para solucionarlo con python, digamos que calcular la raiz cuadrada de 2, entonces el codigo seria algo asi:

#Codigo ---
import math
math.sqrt(2)
-----

hay 2 formas comunes de importar librerias en python, la primera es como ya lo explique, o sea importar toda la libreria, la otra es importar solo parte de ella, eso en el ejemplo anterior seria:

#Codigo ----
from math import sqrt
sqrt(2)
#----

En el segundo caso solo importamos la funcion sqrt.
Ahora para importar las funciones de pygame hacemos lo siguiente

#Codigo -----
from pygame import *
#----

O sea importamos todas las funciones, tambien podriamos hacerlo una por una, pero la filosofia de python es codigo claro sin trabajar de mas.