Escrito por:
Colaiacovo Maria F
Lanza Yojana
Romero Hector
Quintero Sor
Sanchez Ensor
Vargas Yunior
1
Titulo Original: Pygame Sabor Venezolano, Para Hacer Juego En Pygame
Por:
Colaiacovo Maria F.
Lanza Yojana.
Romero Hector.
Quintero Sor.
Sanchez Ensor.
Vargas Yunior.
Para nosotros este trabajo signica la continuacin de grandes
proyectos de vida y de las innumerables experiencias, que nos han
hecho crecer aceleradamente y por otro lado, es el comienzo de una
nueva etapa como profesional. Durante su realizacin hemos apren-
dido a valorar mucho ms a nuestros seres queridos, amigos y todas
aquellas personas que han sido un gran apoyo para llegar al nal de
esta etapa y a quienes indiscutiblemente dedicamos este smbolo de
esfuerzo tan importante para nosotros.
Primeramente agradecemos inmensamente a Nuestro Padre Ce-
lestial, con el que siempre hemos contado incondicionalmente en cada
etapa de nuestra vida, quien nos gua, abriendo y cerrando los caminos
que debemos tomar para as cometer menos errores; gracias Padre
Celestial por darnos la fuerza, inteligencia, el coraje y la ayuda para
culminar este proyecto con xito, siempre muy agradecidos contigo
por ser el mejor padre que podemos tener. Seguido muy agradecidos
con nuestros Padres terrenales, ya que siempre estn a nuestro lado
apoyndonos en cada meta que nos trazamos para as cumplirla con
2
xito y sea un logro familiar, gracias padres por estar en los buenos y
malos momentos, y por siempre poder contar con ustedes los amamos,
gracias por ser los mejores padres que pudimos y tenemos en la tierra
son excelentes.
Agradecemos a nuestros familiares y amigos por siempre de-
mostrarnos su cario y aportar su grano de arena para el xito de
cada uno de nosotros, siempre estarn en nuestros corazones como
personas especiales. Gracias a cada uno de nuestros profesores que
han puesto su esfuerzo, conocimiento, dedicacin para formarnos ex-
celentes profesionales, gracias por sus grandes aportes a lago de este
tiempo tan importante para nosotros el cual es de aprendizaje y
conocimientos tanto a nivel profesional y personal.
3
INDICE GENERAL
Contents
4
Este manual de Pygame Sabor Venezolano, es un de los primero
en elaborarse en la ciudad de el Tigre, estado Anzotegui, por un
grupo de estudiante de ingenieria de sistemas, la cual brindara una
serie de de programas que permitira que experimentes el poder de
simular acciones de la vida real y llevarlo de una manera, extraa, de
aventura, divertida, fantastica, donde puedas crear tu propias ideas,
jugar, modicar y contriburir con todo lo que tu quieras para crear
tu propia aventura.
Este libro es ideal para las personas que estan aprendiendo a
programar ya que se le daran las herramientas necesarias para disear
su propio juego dandole un toque venezolano.
Para inicializar a la programacion es necesario:
1. Instalar Dependiendo del sistema operativo (Windows ,
GNU/linux) realizar su previa instalacion.
Como Instalar en mi sistema operativo ?
Pero no desesperes!
5
Puedes instalar Python a golpe de ratn, independientemente del sistema
operativo que uses.
Para eso es necesario de descargar la ultima version de Python para Windows
y descargar el instalador .exe.
Haga doble clic en el instalador, Python-2.xxx.yyy.exe. El nombre depen-
der de la versin de Python disponible cuando lea esto.
Siga los pasos que indique el instalador.
Si le falta espacio en el disco, puede eliminar el chero HTMLHelp, los
scripts de utilidades (Tools/), y la batera de pruebas (Lib/test/). Si no
dispone de derechos administrativos en su mquina, puede escoger Ad-
vanced Options, y elegir entonces Non-Admin Install. Esto slo afecta al
lugar donde se crean las entradas en el Registro y los atajos en el men
Inicio.
Una vez terminada la instalacin nos dirigimos hacia Inicio -> Todos los
programas -> Python 3.0 y ejecutamos IDLE (Python GUI).
La instalacin es facilsima, ya que la losofa de Python es esa.
Como Instalar en mi sistema operativo ?
Si ests usando una cuenta en un servidor alojado, quiz tu ISP
ya haya instalado Python 3. Si ests ejecutando Linux en casa, puede
que ya tengas Python 3 tambin. La mayora de las distribuciones
GNU/Linux populares incluyen Python 2 en la instalacin por de-
fecto. Un nmero pequeo pero creciente de distribuciones incluye
tambin Python 3.
En Linux, busca en el men Aplicaciones una orden llamada Terminal.
Escribe en tu ordenador python3 (en minsculas, sin espacios) y ver qu
sucede.
6
Capitulo I
La enseanza de Python como lenguaje de programacin para
nios, nias y jvenes en este libro permite que interacten, exper-
imenten como desarrollar bsicamente juegos, evitando entorpecer
por tecnicismo propio del lenguaje la creacin de estos. En simpli-
cidad Python es un lenguaje de programacin que cuenta con una
plataforma y es orientado a objeto, preparado para utilizar cualquier
tipo programa. Es un lenguaje interpretado, lo que signica que no
se necesita compilar el cdigo para poder ser utilizado.
La sintaxis de de forma sencilla
Se puede observar a travs de un ejemplo sencillo la sintaxis,
ya que no se necesita utilizar la cabecera de una biblioteca estndar,
para que este pueda mostrar el tradicional Hola, Mundo .
Python va directo como se muestra en el ejemplo:
print Hola, Mundo.
Python es un lenguaje interpretado
Este lenguaje anima a los nios, nias y jvenes a experimentar
debido a su fcil sintaxis, este lenguaje interpretado permiten ciclos
de desarrollo cortos (edicin y ejecucin), dispone de un entrono de
ejecucin que permite la detencin de errores, sealados con mensajes
muy informativos. Este tambin ofrece un entorno interactivo con el
que se pueden efectuar pequeas pruebas o disear fcilmente las
soluciones a los problemas.
7
Durante toda la vida, nuestros familiares siempre nos dicen,
ordena esto y ordena aquellos. Si queremos aprender a programar en
Python tambin tendremos que hacerlo lo s, se escucha ms difcil
ordenar tu cuarto que aprender un nuevo lenguaje de programacin
pero poco a poco nos iremos acostumbrarnos y les contaremos a todos
lo limpio y ordenado que esta nuestro cuarto o al menos que sabemos
programar muy bien en Python. Lo primero que debemos hacer para
ordenar nuestro cuarto por ejemplo, es limpiar todo lo sucio que
veamos y guardar las cosas que no necesitamos en algn lugar o lo
que siempre necesitamos tenerlo rpidamente al alcance, supongo que
te gusta encontrar rpido tus cosas, bueno vamos a buscar una caja
y le pondremos una etiqueta llamada colonia Ok?, si ya lo hiciste
puedes entonces ir rpidamente a tu interprete de Python y crear
ese mismo lugar para almacenar algo, que es comnmente llamado en
todos los lenguajes de programacin una Variable. Pero espera, al
tener la caja y la etiqueta necesito que busques tus colonia favoritas
y la coloques en ella, para que en el momento que la necesites puedas
saber cuntas estn ah simplemente buscando en la caja llamada
colonia. En Python las variables son ms parecidas a las etiquetas
que pegas en la caja que las cosas que en realidad tienes dentro.
Ve a tu interprete de Python y podrs crear tu etiqueta llamada
colonia y a as saber siempre cuntas colonias tendrs. Para crearla
solo debes escribir el nombre colonia y luego utilizar un smbolo de
igual (=) para decirle cuantas colonias tenemos dentro de la caja,
de esta manera estamos escribiendo una etiqueta bien linda llamada
colonia con un nmero( La cantidad de colonias que tendremos en la
caja). Supongamos que encontraste todas tus colonias favoritas (diez
colonias) pues vamos a escribir en Python esta etiqueta, conocida
tambin como variable.
Por ejemplo:
# >>> colonia = 10
8
Ahora, si nos equivocamos al momento de escribir la etiqueta,
ya que no haban diez colonias en realidad, pues simplemente pode-
mos borrarla y colocar un nuevo nmero. Lo que en Python seria,
asignarle nuevamente otro valor a la misma variable. # >>> colonia
= 8 Si miramos la etiqueta de nuestra nueva caja, podemos ver un
luminoso ocho en este momento, que nos recuerda la cantidad de colo-
nias dentro de la caja pero en Python debemos simplemente colocar
el nombre de la caja en este caso colonia y nos dir la cantidad de
colonias que almacenamos en la variable, as como hemos mostrado
en las imgenes anteriores. Estamos siendo un poco ms ordenados
ahora, incluso en este lenguaje de programacin podemos hacer recor-
dar el nombre de la caja por otro mucho ms fcil de recordar. De
esta manera podemos hacer que una variable pueda ser apuntada por
otra ms: # >>> caja 1 = colonia # >>> caja1 # >>> 8 En el
ejemplo pasado, colocamos en nuestros apuntes que la caja1 es la caja
que tiene una etiqueta llamada colonia y ah se encuentran nuestras
ocho colonias. Pues estamos asignando, a una variable ya creada otra
variable con otro nombre para simplemente demostrar que pueden ser
apuntadas a otras mas y si colocamos la nueva variable, en este caso
nos mostrara la cantidad de colonias que asignamos anteriormente a la
variable. Inteligente no? Pues si, este lenguaje de programacin nos
obliga y ayuda a ser ordenados con nuestro cuarto o lo que se conoce
como ser un excelente programador. Si eres fantico de la progra-
macin y necesitas por todos los medios imprimir algo en pantalla,
cualquier cosa que necesites expresar, lo podrs hacer colocando print
luego un (=) igual para despus colocar lo que se te antoje luego de
ese igual, de esta manera podrs mostrar lo que necesites comunicar.
Por ejemplo, si queremos gritarle a Python Esto es un ejemplo y
que me lo muestre en la pantalla, simplemente hacemos lo siguiente:
# >>> print = (Esto es un ejemplo) # >>> Esto es un ejemplo
Si te encantaron los nombres que te colocaron tus padres o pien-
sas que no debieron haberlo hecho, pues en Python puedes cambiar
las variables en un dos por tres y colocar ms adelante mejores nom-
bres que te hagan recordar lo que necesitabas buscar, ya que si eres
ordenado colocando tambin nombres te facilitara la vida a la hora
de encontrar tus cosas. Imagnate ya en tu propia casa y deseas re-
gresar a la casa donde creciste para buscar dentro de tus cosas algn
viejo recuerdo que te haga recordar esos maravilloso momentos de la
niez, estoy seguro que si le colocaste un nombre ms familiar que
caja1 podrs fcilmente recordar una variable o tal vez fue tan malo
9
el nombre que colocaste que ya ni tienes idea por tantos aos que
han pasado lo que estaba en esa casa por ms ordenado que en tu
niez fuiste. Te dar unos concejos para que asignes an mejor en
Python las variables y puedas fcilmente recordar que haba dentro
en cada uno de las cajas o en este caso en la variable caja1. Simple-
mente si conocemos la cantidad de colonias que existen en la caja1 y
sabemos que lo que estamos guardando son unas colonias, pues colo-
camos: # >>> numero_de_colonias = caja1 De esta manera, si ya
tenamos asignada las ocho colonias en caja1 ahora se pasara a llamar
numero_de_colonias.
El cdigo ASCII es un estndar para la representacin de sm-
bolos y caracteres alfanumricos. Cualquiera de los smbolos de uso
comn se poda representar como un byte (un octeto de bits). la cual
sirven para representar imagenes, caracter numericos, entre otros.
Tabla de Cdigo ASCII
10
Ejemplo: utilizando las libreras de Tcl/Tk para crear estas interfaces grcas.
Sin embargo, hay que aprender un poco ms de Python y de programacin
para poderlas usar.
Como lograr ciertos "Efectos" con la consola?Vamos a empezar con
lo ms bsicos
Algunas secuencias de escape son:
11
12
Sistemas de codicacin de caracteres - Unicode
A continuacin un resmen de los bloques de caracteres que me pa-
recieron ms interesantes:
Mtodos de entrada de caracteres Unicode y cmo trabajar con
Unicode en Python En Linux, podemos ingresar caracteres Unicode
desde la consola o editor de textos (o inclusive desde este navegador)
apretando las teclas CTRL y SHIFT juntas. Manteniendo estas te-
clas apretadas, tecleamos la letra "U" seguida de los cuatro dgitos
hexadecimales correspondientes al cdigo Unicode del caracter que
queremos.
13
Para trabajar con expresiones en Python que contengan carac-
teres unicode en literales de cadena, tenemos que agregar la letra u
antes de las comillas del literal de la cadena. Dentro de las comillas,
colocamos la secuencia de escape \u seguida de los cuatro digitos
hexadecimales del caracter. Al imprimir estas cadenas, se vern los
caracteres unicode indicados por las secuencias de escape. Ejemplo 1
de un script de un barquito:
Este script dibuja un barquito en la pantalla:
Cmo crear animaciones simples y agregar color al texto en la cnsola.
Ejemplo2. de un script sobre una embarcacio en movimiento
14
Secuencias de escape ANSI - que son?
Todo comando para lograr los "efectos especiales" como los que
se ven en la animacin de arriba comienza por imprimir (mediante
15
una sentencia print en Python) un iniciador de secuencia de control,
o CSI por sus siglas en ingls. Existen CSI's de un caractr, como por
ejemplo los que emitimos para dar un salto de lnea, una tabulacin
horizontal o vertical, mandar un beep al terminal. Estos CSI's de un
caracter fueron expuestos en la primera parte de esta serie de entradas
sobre efectos de la cnsola. Ahora, los que nos interesan son los
comandos que podemos emitir con el CSI de dos caracteres: ESC+[
(un caracter de escape, cdigo ASCII 27 en decimal, ms el caracter
de corchete cuadrado izquierdo, cdigo ASCII 91 en decimal). Por ser
el primer caracter el ESCape, las secuencias de control que comienzan
con este CSI se conocen como secuencias de escape ANSI. Despues
del CSI, los otros caracteres que se imprimen a continuacin indican
ms informacin sobre la secuencia de control. A continuacin una
lista no exhaustiva:
Comandos ANSI para posicionamiento de cursor, desplazamiento o
borrado:
16
Se puede observar cmo crear animaciones, controlar los colores
y otros atributos de visualizacin en modo texto usando secuencias
de escape ANSI. En esta entrada se ver cmo utilizar una librera
llamada libcaca que se ha portado a Python en forma sencilla. La
librera se debe instalar desde synaptic el cual es un programa in-
formtico que tiene una interfaz grca GTK+ de APT, para el sis-
tema de gestin de paquetes de Debian GNU/Linux y los bindings
de Python los deben descargar por aqu.
Se mostrara un pequeo script de un poco ms de 100 lineas
implementando el famoso juego de la culebra (recuerdan, el que vena
en los Nokia?), pero en modo texto. Ustedes pueden implementar su
propia librera de visualizacin en modo texto usando secuencias de
escape ANSI, pero las ventajas que ofrece libcaca es que permiten
crear ventanas aparte, controlar eventos con dispositivos de entrada
(ratn, teclado, etc.)
El cdigo para este juego se puede observar a continuacin, es importante
resaltar que Cuando vayan a correrlo,
asegrense de tener "caca.py" en el mismo directorio.
Script del cdigo de la culebrita
17
18
19
Capitulo II
Diseemos Ventanas Primeros Comienzos
Te encantan los videojuegos?
Pues, estoy seguro que si una de las graticaciones ms grandes
a la hora de realizar esta documentacin, es la de preparar a muchos
desarrolladores de video juegos y lograr algo importante, poder crear
o modicar como se nos antoje los juegos que queramos siempre y
cuando sean libres claro. Como bien, ya debes haber conocido lo
bsico de este poderoso lenguaje de programacin y todas sus venta-
jas. Ahora vamos a trabajar con una librera llamada Pygame, donde
utilizaremos un conjunto de mdulos previamente creados para facil-
itarnos la vida y poder crear de una manera ms rpida y profesional
innidades de juegos donde la limitante solo la pondremos nosotros.
Pues a partir de ahora te explicaremos con ejemplos sencillos como
crear un videojuego y demostrarte lo maravillo que pueden ser los
lenguajes de programacin libres. Dado la simplicidad, puedes agre-
gar incluso funciones de fsica, como una gravedad para darle ms
realismo a los juegos, colocarle sonidos, grcos de una manera sen-
cilla pero con un gran poder. Como hemos venido documentndote
en lo que es creacin de videojuegos sin usar esta librera, debes
conocer que todo lo que hemos realizado es en modo texto, lo que
era en muchos aos atrs, la ltima moda de los videojuegos, incluso
hemos desarrollado una pequea inteligencia articial en el juego de
tres en raya. Pero ahora vamos a ir a un entorno ms graco en dos
dimensiones para ser ms exactos. En esta guida alentamos el uso
de software libre a la hora de realizar videojuegos y este lenguaje de
programacin libre, pero no signica que no puedas crearlos usando
otros sistemas operativos. Ya que una de las bondades de libertad
es que puedas usarlo y ejecutarlos en otros sistemas. A partir de
20
este momento, te estar llamando pequeo diseador ya que sers
capaz de usar toda esta documentacin para disear una nueva gran
aventura que no solo te va a divertir a ti, sino a todos los que deseen
probar tu nuevo proyecto.
Ok, soy un pequeo diseador Pero cmo diseo?
Debes de pensar en grande, la prxima gran aventura que dis-
ees debe tener un comienzo, una trama, un nal, puntuaciones,
ganadores, perdedores, sonidos, dibujos llamativos y muchas con-
guraciones en donde tus amigos se puedan divertir. Para realizar
un videojuego necesitamos conocer que necesitamos para poder re-
alizarlo, pues lo primero y estoy seguro que se te vino a la mente
es como usar la librera de Pygame Pues es muy sencillo, primero la
instalacin: Ya conocemos como instalar Python en tu Gnu/Linux
favorito, de la misma manera vas a instalar Pygame, desde tu centro
de software o cualquier sistema de gestin de paquetes (synaptic) solo
debes colocar el nombre de Pygame e instalar, automticamente te
buscara la ltima actualizacin de esta importante librera en Python,
por supuesto debes tener instalado Python, resulta que estamos us-
ando un arsenal de herramientas necesarios para crear videojuegos
provenientes de Python.
Figura: instalacin de Pygame en gnu/linux
Pero si an deseas sacricar todas tus libertades sin ninguna
razn aparente e instalarlo desde otro sistema operativo, por ejem-
plo usando uno privativo puedes hacerlo tambin, pero esta docu-
mentacin no sacricara lo tico por ninguna razn aparente. Con-
tinuando, luego de un regao de libertades. Ahora que tenemos in-
stalada nuestra librera, debemos conocer como importarla a nuestro
cdigo de Python, como en ejemplos anteriores en la creacin de
videojuegos, no tuvimos la necesidad de usar impactantes sonidos o
grcos para crear sencillos pero divertidos juegos de texto y aun
as debimos importar libreras matemticas como la de buscar un
nmero aleatorio en algn lugar, de esta manera lograr esos trucos
que hacan mantener el juego en algo ms realista. De la misma man-
era sucede con Pygame, debemos importar esta librera en nuestro
cdigo para poder todos estos mdulos. Cmo lo hacemos?, Ab-
rimos nuestro editor favorito de programacin en Python y simple-
mente como mostramos en el siguiente ejemplo importamos la librera
Pygame y sys, donde la ltima representa los controles del sistema,
escribiendo la palabra import seguido de los nombres pygame y sys:
# import pygame, sys Recordemos que import hace que importe toda
una librera de funciones para poder acceder y usar esas funciones.
21
Ahora si queremos de un solo golpe acceder a todas las constantes o
variables como QUIT (funcin, que controla todos los eventos para
poder salirse de una ventana en un juego) debemos decir que desde
las locales de Pygame imprtame todo, el smbolo * signicara la
palabra todo en este caso. Y entonces escribimos en el editor:
# from pygame.locals import *
Estamos bien, ahora que tenemos todo montado en su lugar
debemos decir que queremos ya disear, porque esa es la idea no?
Ser diseador de videojuegos, entonces vamos a seguir imaginarnos
que Python es nuestra el acompaante y ella har lo que uno siempre
le diga, entonces le decimos Inicializar PyGame o escrito en cdigo
seria:
# pygame.init()
22
Figura: Una linda ventana de la vida real
Por n, llego el momento de hacer nuestro primer diseo con
Pygame. Si miras alrededor de tu casa probablemente tengas una o
un par de ventanas que sirven como salida a ese mundo natural e
inspirador que quizs te sirva para pensar una buena trama en los
videojuegos, pero si quieres seguir programando te aconsejo que no
salgas por ella y sigamos diseando. Pues te mostrare, como hacer
una en tu sistema operativo, siempre cuando estamos jugando inicia-
mos un lugar donde est todo lo referente al juego y si te das cuenta
puedes cambiar de un lugar a otro fcilmente, por ejemplo ests ju-
gando a Frets of Fire (Tambin realizando con Pygame) y cambias a
tu navegador favorito ya ests en otro lugar completamente distinto,
es eso en trminos de informtica llamado ventanas. Ahora, no vamos
a ejecutar el cdigo dentro del texto como lo hacamos en el diseo
de anteriores videojuegos, si no que vamos a disear una nueva ven-
tana y ah vamos a poner lo que se nos antoje. Vamos a suponer, que
somos unos fuertes herreros y queremos crear la ventana ms fuerte
para nuestro reino, lo primero que debemos pensar es el tamao que
tendr esta, que tan ancha y alta ser para que sea impresionante o
compacta a lo que necesitemos. En Pygame, vamos a denirla sim-
plemente dicindole a nuestra el amiga serpiente cuanto queremos
23
que mida el ancho y la altura de la ventana. Vamos a colocarle 200
pixeles para empezar a dibujar una pequea pero bonita ventana que
aunque an no tiene colores, se ver bien.
# ANCHOVENTANA = 200
# ALTOVENTANA = 200
Listo, ahora pasaremos a indicar en donde est esta ventana
y toda su supercie, para ellos usaremos otra herramienta poderosa
llamada Display, es un mdulo dentro de Pygame donde posee una
funcin llamada set_mode, donde por una serie de rdenes o par-
metros se le indica donde estar la supercie que estamos diseando.
Primero vamos a crear una variable llamada supercie donde primero
que nada le indicamos la dupla del ancho y largo de la ventana que
resultara como dije anteriormente en pixeles y Por qu en pixeles?,
pues resultara ser la peor medida para un herrero, pero ya que en
realidad no somos herreros si no pequeos diseadores digitales pues
necesitamos una medida minscula a las necesidades digitales y nada
tan perfecto como un pixel, podemos ver en la imagen un ejemplo
de lo que representa esta medida, si le hacemos a cualquier imagen
digital una gran ampliacin poco a poco iremos detallando ms esos
puntos de color llamados pixeles.
Luego, el siguiente parmetro podemos denirlo colocando un 0,
Por qu? Este parmetro sirve para opciones avanzadas de interfaz
donde normalmente no ser necesario alterarlo, el ltimo parmetro
es la profundidad de color que usaremos, donde el valor ms alto
representara ms colores verdaderos para nuestro ojo humano. En
este caso colocaremos 32 para usar el esquema de 256 valores para
cada tono primario donde un cuarto canal denominado alfa que rep-
resenta la transparencia. Este valor se utiliza si tambin queremos
superponer dos imgenes. Entonces escribimos en nuestro editor:
24
#supercie = pygame.display.set_mode ((ANCHOVENTANA, ALTOVEN-
TANA), 0,
Ya tenemos nuestra primera ventana diseada usando Pygame. Donde podr
verse algo parecido a esto:
Figura 1: instalacin de Pygame en gnu/linux
Me podrs llamar, loco, pero luego de disear esa bonita ven-
tana tambin puedes ponerle un nombre, colocarle muchos colores
e incluso agregarle texto o guras geomtrica, si ya s que en una
ventana de verdad no perders el tiempo haciendo eso pero si deseas
perder el tiempo con algo Por qu no lo haces aprendiendo hacerlo
en digital? Es ms barato e incluso puedes modicarla siempre que
quieras. Si te gusta mucho tu nuevo diseo y quieres que tenga un
nombre o cuando estemos haciendo el videojuego siempre necesitaras
colocar el nombre de el en todos los lados posibles para as identicar
donde estas parado, puedes hacerlo con Pygame.
A continuacin vamos a crear nuestra primera ventana de texto
usando el popular y el mejor ejemplo desde punto de vista didctico
en un lenguaje de programacin el Hola Mundo pero en este caso le
25
diremos un gran Hola a nuestra ventana y mientras ms aprendas
de este lenguaje incluso hars que tambin la ventana te responda.
Maravilloso no? Seguiremos usando display donde en ella llamare-
mos una funcin llamada set_caption esto quiere decir bueno dime
el ttulo de la ventana, en donde luego de su respectivo parntesis
y comilla simple colocaremos dentro de ella lo que sea que se nos
ocurra, en este caso Hola Ventana!
# pygame.display.set_caption('Hola Ventana!')
Si pensabas que colocarle un nombre a una ventana era genial,
pues te sorprender que colocarle colores es algo espectacular, sim-
plemente podramos ir a donde venden pinturas y escoger el que ms
nos guste para pintar nuestro cuarto ya ordenado por cierto y luego
echarle pintura a las paredes, ventanas o puertas. Aqu, podemos
hacer lo mismo, pero vamos a denir los colores en vez de comprarlos
y vamos a decirle a Python que color queremos en vez de escoger-
los. Cmo lo hacemos?, pues primero debes conocerte un modelo
de colores muy popular llamado RGB (Rojo, Verde, Azul) donde usa
la composicin del color en trminos de la intensidad de los colores
primarios con que se forma: el rojo, el verde y el azul. Es un modelo
de color basado en la sntesis aditiva, con el que es posible represen-
tar un color mediante la mezcla por adicin de los tres colores luz
primarios.
Figura: Cubo RGB
En nuestro editor, lo que haremos es crear variables con re-
specto a los colores y su denicin ser igual a la cantidad de valores
altos o mnimos en deciman en cada rojo, verde y azul. Por ejemplo,
el valor mnimo seria el color negro denido en el RGB y el color
mximo el blanco donde son denidos de la siguiente manera:
26
# NEGRO = (0, 0, 0)
# BLANCO = (256, 256, 256)
La personalizacin de los colores, lo indicaran los valores que
alteremos, por ejemplo, si solamente dejamos el valor de 256 en el
canal R y colocamos 0 en los otros canales. El color predominante
ser el ROJO y podemos denirlo sencillamente as:
# ROJO = (256, 0, 0)
Ahora si quieres crear un valor naranja o morado, puedes jugar
con los nmeros decimales en cada canal agregarle a ella, cualquier
texto, dibujos e incluso colorear los mismos, aqu comienza una etapa
bastante difcil para todos, la de pensar, porque tu imaginacin solo
es la nica que pondr lmites a las cosas que podrs colocar dentro
de la ventana, tan fcil como siempre lo ha sido este lenguaje, si
queremos escribir algo en la ventana, lo primero que debemos saber
es con qu tipo de letra lo haremos, si ya s que te gusta escribir
corrido o a veces te gusta escribir en MAYUSCULAS en un chat,
que resulta bastante molesto por cierto ya que eso es el equivalente a
GRITAR. En n, debemos traer de nuestro Pygame las fuentes que
deseamos, podemos denir una o las que se nos antojen, usaremos
para este caso una modulo llamado Font que contienen funciones para
personalizar letras donde un primer parmetro seria el tipo de letra
y el segundo su tamao usando la funcin SysFont. Mostramos un
ejemplo a continuacin:
# fuenteBasica = pygame.font.SysFont(None, 48)
Si te has dado cuenta, colocamos None en vez de alguna letra en
particular como Arial, Verdana o la que uno quiera colocar. Entonces,
lo que har es buscar una fuente predeterminada que tenga Pygame
y la usara por defecto y usamos un tamao de letra de tamao 48.
Ahora que tenemos ya la fuente elegida lo que debemos hacer es
dibujar ese texto en la supercie de la ventana. Cmo lo hacemos?,
Creamos una variable llamada y usamos render con la fuente que
anteriormente creamos en este caso fuenteBasica. Para indicarle los
27
parmetros tales como; el texto que vamos a colocar, donde el segundo
lo dejaremos en True, luego indicamos el color de la fuente y por
ltimo el fondo de la fuente. Mostramos un ejemplo a continuacin:
# text = fuenteBasica.render('Hola Ventana!', True, BLANCO, ROJO)
Excelente, pero ahora necesitamos sacar las medidas del espa-
cio donde estar este texto, Por qu?, pues hasta el momento hemos
denido que estar escrito, su color y tamao pero no le hemos in-
dicado en que parte esta de la supercie de la ventana. Necesitamos
decirle a Python en que posicin estar lo que queremos dibujar.
Para eso necesitamos saber desde donde comienza el texto y hasta
donde llega, debemos denir el tamao del lugar donde estar lo que
estamos dibujando
# textRect = text.get_rect() .
Mostramos en el siguiente ejemplo, como denimos donde es-
tar el texto y luego le decimos que lo centre en X y lo centre en Y
Qu quiere decir esto?, esto es muy importante si sabes que es un
plano cartesiano, si eres muy novato en matemticas no te preocupes,
estoy seguro que te documentaras lo suciente en este ejemplo para
entender incluso un poco de matemticas.
Figura: Ejemplo de tres coordenadas en un plano cartesiano
Cuando estamos trabajando con coordenadas, podemos obser-
var que siempre el primer valor que se nos indique estar en el eje
de las X como puedes observar en la gura y el segundo valor ser
tomado en el eje de las Y luego de que podamos obtener estos dos
28
valores, el punto de interseccin de las dos rectas que pasen por esos
puntos estar ubicado nuestro elemento. En la imagen, el color verde
represente un valor 2 en el eje de las X y un valor 3 en el eje de las
Y, creando as un punto de interseccin entre los dos puntos. Sigu-
iendo con el cdigo, lo que en realidad queremos que entiendas es que
cuando nos referimos a centrar en alguna posicin en este caso X o
Y el buscara el centro y me colocara todo lo que necesite colocar.
# textRect.centerx = supercie.get_rect().centerx
# textRect.centery = supercie.get_rect().centery
Para qu necesitamos esto? al momento de nosotros dibujar
guras geomtricas como lneas, rectngulos, elipses, etc., fcilmente
podemos darle vida en nuestra supercie usando las coordenadas, de
esta manera le indicas a Python, la manera de dibujar lo que necesitas.
Por cierto si queremos colocarle un color blanco a nuestra supercie
de la ventana solo debemos escribir:
# supercie.ll(BLANCO)
Figura 8: supercie con color blanco
Pasemos a dibujar algunas lneas azules, para ello debemos usar
una funcin dentro de Pygame llamada draw.line donde contendr los
parmetros del lugar donde estar la lnea, el color de la lnea y las
coordenadas que necesitas desde el punto inicio hasta el punto nal,
mientras que el ultimo parmetro es el groso que tomara la lnea
dibujada. Si an no has entendido bien lo del plano cartesiano te
recomiendo que regreses a esa parte o te documentes un poco mejor
con libros matemticos que expliquen an ms detalladamente sobre
ellos. Si ya entendiste, te felicito pues entonces acabaras creando las
guras geomtricas que desees. Te mostramos en la gura parte del
cdigo que necesitas ejecutar para lograr el dibujo de una lnea de un
groso tamao 4 y de color azul en las posiciones mencionadas en la
supercie.
29
# pygame.draw.line (supercie, AZUL, (60, 60), (120, 60), 4)
Figura 9: lneas azules dibujada con Pygame
De la misma forma, suceder si quieres dibujar un crculo azul
sin bordes como se ve en la gura, deberemos colocar para el ter-
cer parmetro la posicin de X y Y, ya para el cuarto colocamos su
dimetro y el ltimo parmetro podemos colocar si hay un relleno o
no, mostramos el cdigo a continuacin:
# pygame.draw.circle (supercie, AZUL, (300, 50), 20, 0)
Figura 10: circulo azul dibujado con Pygame
Si buscamos dibujar una elipse roja con un pequeo grosor,
como se ve en la gura, tendremos que trazar dos dimetros, uno
vertical y uno horizontal, donde el tercer parmetro denir la posi-
cin X y el segundo la posicin Y, el tercero el dimetro horizontal y
el cuarto el dimetro vertical mostramos el cdigo a continuacin:
# pygame.draw.ellipse (supercie, ROJO, (300, 250, 40, 80), 1)
30
Figura 11: elipse rojo dibujado con Pygame
Si buscamos dibujar una elipse roja con un pequeo grosor,
como se ve en la gura, tendremos que trazar dos dimetros, uno
vertical y uno horizontal, donde el tercer parmetro denir la posi-
cin X y el segundo la posicin Y, el tercero el dimetro horizontal y
el cuarto el dimetro vertical mostramos el cdigo a continuacin:
# pygame.draw.ellipse (supercie, ROJO, (300, 250, 40, 80), 1)
Una de las cosas ms importantes que debes siempre recordar,
pero recurdalo bien, que nunca se te olvide, es cerrar una ventana
antes de salir de tu casa, porque posiblemente no encontraras nada
cuando regreses, en el mundo real sucede as y como Python es un
lenguaje muy fcil de utilizar y parecido a lo que hacemos en ese
mundo real, pues deberas hacer lo mismo, tienes que permitir cerrar
todo lo que haces porque si no, probablemente tampoco encontraras
nada dentro, bueno quizs estoy exagerando pero en realidad debes
permitirle siempre a las personas cerrar lo que hacen, te imaginas
miles de ventanas abiertas en tu sistema sin poder cerrar ni saber
qu hacer con ellas ahora, porque alguien simplemente le gusta dejar
que lo roben.
No tendra sentido hacer una cosa como esa, verdad?
31
Pues, en este momento debes ser todo un Picasso creando dibu-
jos, letras coloridas o guras inimaginables y peor aun ponindole
nombres a tus mascotas y a las ventanas de tus futuras obras de artes.
Primero para recordar siempre los resultados que haces y mostrar-
los indenidamente en la ventana debes crear un While True: para
as pasar a cerrar la ventana con una funcin que al principio te
avisamos que la usuraramos llamada QUIT. Te mostramos en modo
cdigo como lo hars es algo sencillo no te compliques en recordar
esto, ya que puedes usarlo en casi todos los cierres o nalizacin de
una ventana. Se puede explicar sencillamente, donde el evento en
Pygame tipo salir sucede, pues todo se va a cerrar.
# while True:
# for event in pygame.event.get():
# if event.type == QUIT:
# pygame.quit() # sys.exit()
Figura 12: cerrando una ventana
Quizs hasta este momento te estas frustrando porque no has
podido realizar nada de lo mostrado en las imgenes y ejemplos, pa-
ciencia, porque hay una cosa muy importante que siempre y esto
tambin debers recordar colocar, algo llamado actualizar. Si, debes
siempre recordarle a nuestra amigo Python todo lo que hiciste, porque
a veces tiene mala memoria y debes garantizar que todo lo que hiciste
fue cierto, podemos decirle eso, usando:
# pygame.display.update()
Tambin ocurrir, que el texto que queras incluir no apareciera
por alguna extraa razn, pero no es nada de extrao, solo debes
repetirle a nuestro amigo olvidadizo que queremos incluir el texto
creado en la supercie de la ventana, para eso usamos el siguiente
cdigo:
32
# supercie.blit(text, textRect)
Si seguiste todos los pasos de esta parte de la documentacin,
ahora si eres todo un Picasso en Pygame y podrs ver como se muestra
en la siguiente imagen todo lo que has hecho hasta el momento.
Figura 13: Dibujos en una ventana diseados con la librera Pygame.
Figura 14: Versin de Frankenstein animado.
33
Llego, la hora de que aprendas algo que en sueos, muchos
cientcos han querido lograr y solo una persona fue trada a la vida
incluso le colocaron Frankenstein, si esa historia te parece un mito.
Pues, hacer animaciones radiantes y que se muevan en una ventana
no es cosa de mitos gracias a Pygame. Vamos a crear algunos cuadra-
dos que se puedan mover a los lados que queramos. Si, as como lo
oyes, en este momento aprenders a darle un poco ms de vida a
esa ventana que ya debe ser toda una obra de arte mi pequeo dis-
eador. Lo primero que debemos decirle a nuestro el amigo Python,
es la direccin y velocidad que tendrn los cuadrados, as es, recuerda
que nuestro amigo tiene mala memoria y tampoco es un adivino, es
un lenguaje de programacin y muy bueno por cierto, mientras que
sea un lenguaje altamente entendible debemos decirle siempre lo que
queremos hacer y l se encargara de hacerlo.
As que, comencemos a denirle las direcciones que tomaran
nuestras nuevas creaciones animadas. Para nosotros, es mucho ms
fcil recordar ciertos nombres, si recuerda en el apartado de variables,
fuimos ordenando nuestra habitacin en cajas con nombres que fcil-
mente recordaramos y nos hara relacionar inmediatamente lo que
estaba contenido, igualmente podemos hacer aqu, si denimos las
direcciones que tomaran nuestro cuadrados por ejemplo, abajo a la
izquierda, abajo a la derecho, arriba a la izquierda y luego que se
mueva arriba a la derecha, fcilmente nuestro amigo recordara que
har toda esta serie de movimientos. Recuerda que debes importar
Pygame y todas sus herramientas, crear el ancho de ventana, la su-
percie e incluso colocarle un nombre a la ventana, estoy seguro que
ya debes saber cmo hacerlo, todo es completamente igual y ahora
podemos continuar agregndole las variables de velocidad que te he
nombrado:
# ABAJOIZQ = 1
# ABAJODERE = 3
# ARRIBIZQ = 7
# ARRIBADERE = 9
Tambin puedes agregarle una variable que dena la velocidad de los
cuadrados movindose, como colocamos a continuacin:
# VELOCIDAD = 4
Si, quieres puedes crear varios cuadrados y agregarles ciertos
colocares para diferenciarlos, estoy seguro que tambin sabes pintar
todo lo que este en tu ventana, te nombro unos colores por si acaso
te gusta alguno de ellos:
34
# NEGRO = (0, 0, 0)
# ROJO = (255, 0, 0)
# VERDE = (0, 255, 0)
# AZUL = (0, 0, 255)
Ahora, solo queda crear los cuadrados usando una funcin lla-
mada, pygame.rect. Recuerdas, el ejemplo del diccionario en el juego
del ahorcado que diseamos anteriormente sin usar Pygame?, pues es
muy parecido estamos deniendo un bloque 1 con un rect de rectn-
gulo y usando las coordenadas (300, 80, 50, 100) podemos crearlo
con un tamao algo grande y le denimos su color, es exactamente
igual a los diseos que has venido trabajando excepto que le agre-
garemos el dir que ser tomado como un valor de direccin, hacia
donde quieres que este se comience a dirigir en el momento de ver tu
ventana. Luego hacemos un arreglo y decimos que en la posicin 0,
estar nuestro primer cuadrado y agregamos dos cuadrados ms en
la posicin 1 y 2 respectivamente.
# b1 = {'rect':pygame.Rect(300, 80, 50, 100), 'color':ROJO, 'dir':ARRIBADERE}
# b2 = {'rect':pygame.Rect(200, 200, 20, 20), 'color':VERDE, 'dir':ARRIBIZQ}
# b3 = {'rect':pygame.Rect(100, 150, 60, 60), 'color':AZUL, 'dir':ABAJOIZQ}
# bloques = [b1, b2, b3]
Perfecto, ya tenemos denido todas las variables que necesita-
mos, ahora viene la parte difcil, hacer que de verdad este viva nuestra
ventana. Para ello, debemos comenzar con un blucle innito que re-
visara primero el evento QUIT. Recordemos que esto har que al
cerrar la ventana detendr todo, algo que siempre debemos recordar.
# while True:
# for event in pygame.event.get():
# if event.type == QUIT:
# pygame.quit()
# sys.exit()
35
Podemos, colocar la supercie en negro, recuerden que esto es
una animacin cuadro por cuadro, necesitamos dibujar algo en un
punto y resultara una animacin completa, si lo dibujamos varias
veces, esta velocidad de actualizacin entre cada cuadro de dibujo, es
lo que se reere a algo llamado Frames por segundos o cuadros por
segundo lo que har posible el traspaso de un cuadro a otro, ser el
bucle innito que estamos colocando desde el principio, por ellos es
imprescindible que colocamos el bucle, cada vez que este comience a
repetirse. Ahora, como logramos ese movimiento?, para realizarlo,
podemos incrementar o restar el valor para arriba y a la izquierda y
esto har que nuestro dibujo donde ocurra la colisin del punto entre
arriba e izquierda se ir cambiando de posicin, esto har que se logre
una simulacin de animacin por segundo.
Figura 15: Ejemplo de cuadros por segundo, en una animacin clsica para un
caballo movindose.
Entonces, tendremos que donde ocurra la colisin, que ms ade-
lante lo explicaremos un poco mejor con otro juego ms divertido.
Vamos a recorrer la estructura de direccin de cada bloque, usando
un for para los bloques a usar en cada posicin:
# for b in bloques:
Figura 16: Figura en movimiento hacia abajo a la izquierda
Ahora, vamos a jugar con el movimiento inicial de arriba (top)
y a la izquierda (left). Primero hagamos que se dirija abajo y a la
izquierda. Para ello, vamos a restarle movimiento a la izquierda e
36
incrementar movimiento hacia arriba, puedes ver en la gura como
har este movimiento.
# if b['dir'] == ABAJOIZQ:
# b['rect'].left -= VELOCIDAD
# b['rect'].top += VELOCIDAD
Si queremos mover nuestro cuadrado arriba y a la derecha, todo
lo contrario al anterior movimiento, vamos a aumentarle movimiento
a la izquierda y restarle hacia arriba. Puedes ver como en la gura
como hace este movimiento.
# if b['dir'] == ARRIBADERE:
# b['rect'].left += VELOCIDAD
# b['rect'].top -= VELOCIDAD
37
Hemos logado hasta el momento, darles vida a guras dentro de
nosotros e incluso con un simptico nombre a la ventana. Pero no te
has preguntado, si nuestra gura llega a salirse de la ventana o incluso
romperla, en captulos anteriores, hablamos que es una mala idea
dejar la ventana abierta pues el crimen est muy alto ltimamente,
pero te imaginas que hagamos pedacitos esa supercie que tanto nos
cost dibujar hasta el momento, estoy seguro que no te has ledo todo
esta documentacin para ver tus obras de artes acabas por una gura
que no sabe hasta dnde llegar y devolverse. Debemos indicarle a
nuestras guras que tienen un lmite que recorrer y que se llegan hacia
el debern devolverse, pues se est prohibido salirse de la supercie.
Para ellos, crearemos unas decisiones anidadas correspondientes a
cada lugar donde la gura llegara. La frontera de este valor, ser
tomada como un 0 y pues todo debe ser menor que l, ya que si llega
a ese valor, se estar moviendo fuera de la ventana y nuestra gura
le har un gran agujero a la ventana y no queremos que pase eso,
verdad? Vamos a comenzar entonces colocando:
# if b['rect'].top < 0:
Y luego, le decimos que si la gura va haciendo un movimiento
de arriba a la izquierda llegando a su lmite, pues simplemente lo
obligaremos que baje y no se salga de la supercie, de igual forma
haremos si se nos viene la gura hacia arriba a la derecha, todo esto
si estamos trabajando desde la parte superior de la supercie
Si nuestra gura este en el fondo de la supercie, igualmente
debemos decirle que no debe pasarse del lmite que le imponemos
y debe regresar como chico bueno por donde vino. En este caso
esteremos hablando del alto de la ventana.
# if b['rect'].bottom > ALTOVENTANA:
Indicaremos los valores que debe tomar la gura en caso de que se
dirija hacia abajo y a la izquierda o hacia abajo a la derecha.
38
# if b['dir'] == ABAJOIZQ:
# b['dir'] = ARRIBIZQ
# if b['dir'] == ABAJODERE:
# b['dir'] = ARRIBADERE
IMAGEN AQUI
De igual manera si la gura intenta dirigirse hacia el lado izquierdo
de la supercie, podemos ordenarle que cambie de rumbo, llevndolo
desde abajo y la izquierda hacia abajo a la derecha o de arriba a la
izquierda hacia arriba a la derecha, como te puedes dar cuenta es
como si la gura estuviera chocando con algo que lo hace devolverse
por donde vino.
# if b['rect'].left < 0:
# if b['dir'] == ABAJOIZQ:
# b['dir'] = ABAJODERE
# if b['dir'] == ARRIBIZQ:
# b['dir'] = ARRIBADERE
IMAGEN AQUI
Por ultimo si se dirige hacia la parte derecha de la supercie, va-
mos a realizar el mismo procedimiento que hemos venido realizando,
en los anteriores casos pero con diferentes oposiciones de movimiento
que representara el ancho de la ventana. Tomaremos en cuenta, la
gura que se dirija abajo a la derecha esta cambiara su rumbo hacia
abajo izquierda o en el caso de que este se dirija a la parte de arriba
a la derecha cambiara hacia arriba y a la izquierda
# if b['dir'] == ABAJODERE:
# b['dir'] = ABAJOIZQ
# if b['dir'] == ARRIBADERE:
# b['dir'] = ARRIBIZQ
39
Sabemos que es tedioso colocarle a cada gura un movimiento
propio, pero de esta forma nos aseguramos que se dirija haca donde
queramos y que no rompa ningunas ventanas en el intento. O como
piensas que los buenos titiriteros logran que sus muecos cobren vida
propia mediante largos hilos que controlan cada movimiento que re-
alicen. No olvides, dibujar el bloque en la supercie, colocndole el
color que desees, usando para esto el siguiente cdigo que ya hemos
venido trabajando:
# pygame.draw.rect(supercie, b['color'], b['rect'])
Ahora, recurdale a nuestro olvidadizo amigo todo lo que has
hecho usando un update: # pygame.display.update() Y podremos ver
muchos cuadrados animados de distintos colores de un lado para otro
sin romper nuestra ventana que tanto nos cost construir.
Una nota importante que debes tener en cuenta es la pausa del
buque que creamos al principio para dar la sensacin de cuadros por
segundo, para eso debemos de darle una velocidad de transicin entre
cada imagen y as mantenga que la ventana se refresca cada vez que
se ejecute el bucle con la nueva posicin del cuadrado. La funcin
time nos permite pasar por ejemplo 0.02 segundos antes de la nueva
posicin. Cabe destacar que una de las libreras que vamos incluir al
principio de nuestro cdigo ser time
# import time
# time.sleep(0.02)
40
Captulo III
Ten cuidado, puedes ocasionar una colisin!
En cada captulo hemos estado preparando esa gran base que te
servir para crear videojuegos usando Pygame. Hemos llegado a un
punto clave de la creacin de los mismos, as que abrchate los cintur-
ones y recuerda siempre tener cuidado al manejar porque puedes oca-
sionar una colisin y en la vida real es muy peligroso tener una, pero
aqu vamos a ensearte a como ocasionarlas y mantener el control
de cualquier gura por nuestra cuenta. Es muy lindo, ver una gura
moverse de un lugar a otro y que no se salga de la ventana o la rompa,
pero es algo aburrido, es por ellos que es hora de que nosotros po-
damos tener un poco ms de control de lo que hacemos agarrando ese
volante y manejar hacia donde queramos incluso ocasionar colisiones
con otras guras, tranquilo aqu no te pasara nada malo si lo haces y
siempre es bueno saber hasta donde tenemos un lmite ya que pode-
mos romper muchas ventanas en el intento si no tenemos cuidado.
Vamos a comenzar a realizar un videojuego muy parecido a nuestro
viejo amigo comeln de los clsicos de los videojuegos, alguna pista
de quin es? Tarde o temprano terminaras adivinando. Recordemos,
que lo primero que debemos hacer para comenzar a crear un video-
juego o algo hecho en Pygame es importar las libreras necesarias,
estoy seguro que ya eres todo un experto importando libreras pero
debo decirte que necesitamos importar nuestra vieja amiga random
para algunas acciones que realizaremos en los siguientes captulos.
# import pygame, sys, random
El paso siguiente, traer todas las herramientas de Pygame:
# from pygame.locals import *
Ahora, Cmo le decimos a nuestro amigo Python, que una gura
est chocando o encima de otra?
41
Ya que tenemos el gran poder de crear las cosas y necesi-
tamos que dos guras choquen, simplemente espero que por puro
conocimiento y aprendizaje, como pueden ver en la gura se muestran
dos posibles escenarios, uno donde las guras colisionan y estn una
encima de la otra o un escenario donde ocurre lo contrario. Nosotros,
ahora debemos decirle a Python lo que sucede cuando una gura este
sobre otra y cmo actuar cuando eso sucede. Tomando un rectngulo
como la gura de ejemplo, haremos dos funciones, una que verique
si uno de los rectngulos esta sobre otro, al detectar la colisin quiere
decir que uno de los puntos del rectngulo esta sobre otro, haremos
que sea verdadero si existe esta colisin o falso si no la hay. Donde
el rectngulo 1 y el 2 si estn uno sobre otro, va a chequear tambin
si las esquinas de uno de los rectngulos est en la parte superior,
inferior, derecha o izquierda del otro rectngulo, estaremos jugando
nuevamente con las coordenadas de un punto a otro, como puedes
ver en la gura, se muestran las coordenadas (50,30), (85,30) ,(50,50)
dentro de uno de los rectngulos, lo que signica que es reconocida
de esta manera una colisin. Para salir, de dudas puedes ver la gura
como se muestra una colisin entre dos rectngulo en este caso.
# def rectSobrePuesto(rect1, rect2):
# for a, b in [(rect1, rect2), (rect2, rect1)]:
# if ((puntoDentroRect(a.left, a.top, b)) or
# (puntoDentroRect(a.left, a.bottom, b)) or
# (puntoDentroRect(a.right, a.top, b)) or
# (puntoDentroRect(a.right, a.bottom, b))):
# return True # return False
42
En la ltima gura, mostramos como la parte superior o la es-
quina de uno de los rectngulos estaban dentro de otro, lo que es
reconocido como una colisin, es grcamente correcto, pero nece-
sitamos decirle a nuestro olvidadizo amigo Python, que realice una
funcin para esto, a continuacin te muestro una manera difcil como
realizar este tipo de funciones para colisiones. Ms adelante, te
mostrare una manera mucho ms fcil identicar las colisiones.
# def puntoDentroRect(x, y, rect):
# if (x > rect.left) and (x < rect.right) and (y > rect.top) and (y = NUEVACOMIDA:
Aqu vamos aadiendo la comida y notaras como aparecer cada cierto
tiempo.
# contarComida = 0
# comida.append(pygame.Rect(random.randint(0, ANCHOVENTANA -
TAMANOCOMIDA), random.randint(0, ALTOVENTANA - TAMANOCO-
MIDA), TAMANOCOMIDA, TAMANOCOMIDA))
Para darle un tono ms realista, coloquemos la supercie de un color
negro y asi podemos jugar un poco mejor con los colores:
# supercie.ll(NEGRO)
Lo dems, es simplemente hacer que nuestro rectngulo hambri-
ento se mueva por toda la supercie, como en la anterior animacin,
sumndole y restndole el valor de arriba (top) y a la izquierda (left)
# if rebotador['dir'] == ABAJOIZQ:
# rebotador['rect'].left -= VELOCIDAD
# rebotador['rect'].top += VELOCIDAD
# if rebotador['dir'] == ABAJODERE:
46
# rebotador['rect'].left += VELOCIDAD
# rebotador['rect'].top += VELOCIDAD
# if rebotador['dir'] == ARRIBIZQ:
# rebotador['rect'].left -= VELOCIDAD
# rebotador['rect'].top -= VELOCIDAD
# if rebotador['dir'] == ARRIBADERE:
# rebotador['rect'].left += VELOCIDAD
# rebotador['rect'].top -= VELOCIDAD
Qu hace falta?, pues que no rompa la ventana, nuestro amigo
hambriento puede estar tan concentrado buscando la comida que
quizs no se percate hasta donde llegara, para eso vamos a indicarle
sus lmites.
La gura se dirige a la parte superior.
#if rebotador['rect'].top < 0:
# if rebotador['dir'] == ARRIBIZQ:
# rebotador['dir'] = ABAJOIZQ
# if rebotador['dir'] == ARRIBADERE:
# rebotador['dir'] = ABAJODERE
# if rebotador['rect'].bottom > ALTOVENTANA:
Nuestro rectngulo ha pasado el fondo.
# if rebotador['dir'] == ABAJOIZQ:
# rebotador['dir'] = ARRIBIZQ
# if rebotador['dir'] == ABAJODERE:
# rebotador['dir'] = ARRIBADERE
# if rebotador['rect'].left < 0:
47
El rectngulo se mueve ms all de la izquierda.
# if rebotador['dir'] == ABAJOIZQ:
# rebotador['dir'] = ABAJODERE
# if rebotador['dir'] == ARRIBIZQ:
# rebotador['dir'] = ARRIBADERE
# if rebotador['rect'].right > ANCHOVENTANA:
La gura se mueve ahora hacia a la derecha.
# if rebotador['dir'] == ABAJODERE:
# rebotador['dir'] = ABAJOIZQ
# if rebotador['dir'] == ARRIBADERE:
# rebotador['dir'] = ARRIBIZQ:
Lo que queda por realizar es simplemente dibujar la gura en
la supercie con su color:
# pygame.draw.rect(supercie, BLANCO, rebotador['rect'])
Revisamos, si hay alguna colisin entre la comida y el rebotador,
en caso verdadero solo debemos invocar a remove y podemos eliminar
la comida. Esto, dar la sensacin de que nuestra gura principal es
un gran glotn.
# for bocado in comida[:]:
# if rectSobrePuesto(rebotador['rect'], bocado):
# comida.remove(bocado)
Para dibujar la comida en la supercie, solo debemos dibujar un pequeo
rectngulo por ejemplo de color verde:
# for i in range(len(comida)):
# pygame.draw.rect(supercie, VERDE, comida[i])
Actualizamos todo lo que hemos hecho:
# pygame.display.update()
48
Recuerde, que es necesario crear el bucle al comienzo del juego
para usar nuestra funcin QUIT y cerrar todo lo que hemos hecho,
si no recuerdas el cdigo, psate por captulos anteriores y podrs
vericarlo. Algo importante que es necesario acotar, es la veloci-
dad de actualizacin de los cuadros por segundo, podemos denir
un reloj principal que se encargue de llevar ese trabajo, colocndole
por ejemplo un valor de 40 sin utilizar alguna funcin: # relojPrin-
cipal.tick(40) Lo prometido es deuda, recuerda que te nombre que
exista una forma menos tediosa y relativamente fcil de detectar las
colisiones que hagamos, pues te dir que usando la funcin collid-
erect preguntamos si un rectngulo esta colisionando con el otro pues
entonces remueve el otro rectngulo que fue colisionado o en los tr-
minos que estamos usando, simplemente comido, de esta manera nos
ahorramos mucho cdigo ya que Pygame ya la mantiene en su arsenal
de herramientas
# for bocado in comida[:]:
# if jugador.colliderect(bocado):
# comida.remove(bocado)
Puedes vericar todo lo que has logrado hasta el momento, com-
parando con la gura Figura: Rectngulo comiendo a todos los dems
mini rectngulos usando Pygame.
49
Te imaginas, en un volante viajando por ciento de ciudades en
Venezuela, disfrutando de los grandes paisajes que te puede ofrecer
este hermoso pas, pues si yo me lo imagino y cuando realizamos
esta documentacin pensbamos en ella siempre, pues es hora de
que agarres tu mejor volante y te prepares a controlar a nuestro
pequeo rectngulo hambriento para comerse todo lo que veamos. Te
enseare a poder usar las echas como teclas de tu teclado favorito y
poder controlar nuestros futuros personajes. Es muy importante que
prestes atencin, ya que es fundamental que sepas como realizar la
deteccin de eventos cuando alguien oprime una tecla. Podemos usar
lo que llevamos hasta ahora, pero hay una gran diferencia y es que
las variables que denimos de direccin vamos a cambiarlas por un
valor falso, Por qu? Ahora nosotros seremos los que deniremos el
movimiento de la gura con la tecla que apretemos, se escucha difcil,
pero en realidad no lo es, vamos a denir entonces nuestra nueva
variable:
# ABAJO = False
# DERECHA = False
# IZQUIERDA = False
# ARRIBA = False
Decimos entonces que si se oprime una tecla o ocurre el evento
de apretar una tecla que es denido como el KEYDOWN, vamos
asignar los movimientos:
# if event.type == KEYDOWN:
Si nos movemos a la izquierda, pues asignamos que es verdadero
a la izquierda y de lo contrario, sea a la derecha ser falso:
# if event.key == K_LEFT:
50
# DERECHA = False
# IZQUIERDA = True
Figura 28: rectngulo en la izquierda
Figura: rectngulo en la izquierda As poco a poco iremos asig-
nando cada una de ellas, por ejemplo si vamos a la derecha hace-
mos lo contrario a la izquierda. Verdadero a la derecha y falso a la
izquierda, Por qu colocar verdadero y falso? Para evitarle confu-
siones a Python dicindole que solo tomara un camino y no dos al
mismo tiempo, esto claro cuando se presiona una tecla:
# if event.key == K_RIGHT:
# IZQUIERDA = False
# DERECHA = True
Figura: rectngulo en la derecha
Si nos movemos arriba:
# if event.key == K_UP:
51
# ABAJO = False
# ARRIBA = True
Figura: rectngulo arriba
Si queremos ir abajo
# if event.key == K_DOWN:
# ARRIBA = False
# ABAJO = True
Figura: rectngulo abajo
Ahora cuando no se presiona ninguna tecla, colocaremos todo
en falso y haremos que se reinicialicen las posiciones, esto har que
nuestro rectngulo se quede quieto ya que no tendr ninguna posicin
a donde dirigirse. Esto es posible usando el tipo de evento KEYUP.
Como algo extra, hemos aadido que si presiona la tecla ESCAPE
simplemente se saldr del juego. Esto no es algo que debes aprenderte
siempre, estas variables estn predenidas en Pygame.
# if event.type == KEYUP:
52
# if event.key == K_ESCAPE:
# pygame.quit()
# sys.exit()
# if event.key == K_LEFT:
# IZQUIERDA = False
# if event.key == K_RIGHT:
# DERECHA = False
# if event.key == K_UP:
# ARRIBA = False
# if event.key == K_DOWN:
# ABAJO = False
Tambin puedes asignar cualquier tecla y asignarle su funcin
en el juego. Por ejemplo, podemos colocar la tecla X para mover
aleatoriamente al rectngulo.
# if event.key == ord('x'):
# jugador.top = random.randint(0, ALTOVENTANA - jugador.height)
# jugador.left = random.randint(0, ANCHOVENTANA - jugador.width)
Existe una variante con respecto a la velocidad, recordando que
los valores de modicacin de arriba a la izquierda se harn ahora
al jugador sea a nuestra gura directamente, igual como lo hemos
venido trabajando. Recordemos que la variable jugado la estamos
asignando a la gura rectangular. Con estamos, haciendo que nuestra
gura no se salga de la ventana
# if ABAJO and jugador.bottom < ALTOVENTANA:
# jugador.top += VELOCIDAD
# if ARRIBA and jugador.top > 0:
# jugador.top -= VELOCIDAD
# if IZQUIERDA and jugador.left > 0:
# jugador.left -= VELOCIDAD
# if DERECHA and jugador.right < ANCHOVENTANA:
# jugador.right += VELOCIDAD
53
Capitulo IV
Llego la hora que ms esperabas, es hora de desarrollar algo
ms completo, con fondo, msica y efectos alucinantes, dile adis a
tus consolas o esos juegos de computadoras que cuestan mucho dinero,
ya que t mismo podrs desarrollar cualquier cantidad de juegos y
como te dije el limite lo pondr tu imaginacin. Vamos a seguir man-
teniendo el esquema que hemos venido trabajando pero en este juego
que haremos, van a cambiar muchas cosas porque en la parte de col-
isiones debemos controlar por un lado la movilidad del juego y por
otro lado los puntajes que pueda tener el jugador. Ya hemos creando
una ventana con una supercie, le pusimos un nombre, la pintamos
y dibujamos varias guras geometras dentro de ella e incluso pudi-
mos controlarla y que se comiera otras guras, respetando siempre
una limitacin de zona que fue impuesta para que no rompiera la
ventana, pero ahora vamos a salirnos de la ventana e incluso de la
mismo planeta para viajar con una pequea nave a muchas galaxias,
siempre ha sido mi sueo viajar por el innito y ms all pero en el
viaje siempre te encontraras con cientos de asteroides, es por ello que
debemos esquvalos y porque no llevar la cuenta para decirle a todos
tus amigos cuantos esquivaste y saliste ileso en el intento o quicas
no tan ileso. Recuerda que primero debes ir importando todas las
libreras y herramientas de Pygame, tambin podemos denir la ve-
locidad de nuestro juego en cuadros por segundo, vamos a colocarle
40.
# FPS = 40
Luego podemos seguir armando variables como el ancho y largo de la ventana
o el color de texto y fondo que pueden ser denidas as:
# COLORTEXTO = (255, 255, 255)
# COLORFONDO = (0, 0, 0)
54
Pasamos a denir las variables fundamentales de los elementos
del juego, tales como los asteroides y nuestra nave. Por ejemplo,
cuanto es el mnimo y mximo de asteroides aparecern en nuestro
viaje y sus velocidades, la velocidad que aparecern cada asteroide
luego de que nos alejemos de unos cuantos y la velocidad de nuestra
nave, podemos indicarle que sea una gran y rpida nave o con una
velocidad modesta.
# ASTEROIDEMIN = 10
# ASTEROIDEMAX = 40
# ASTEROIDEMINVEL = 1
# ASTEROIDEMAXVEL = 8
# AGREGASTEROIDVEL = 6
# VELOCIDADJUGADOR = 5
Denamos de una vez, una funcin que cierre el juego:
# def terminate():
# pygame.quit()
# sys.exit()
Durante, el comienzo del juego es bien importante que logres
llamar la atencin del jugador y de buscar las facilidades para comen-
zar el juego, podemos denir una funcin de espera, Qu quiere
decir eso? Hacemos que el jugador apriete una tecla para comenzar
el juego y as el decidir el momento de inicio o n del mismo usando
los tipo de eventos KEYDOWN donde presione alguna tecla o la tecla
escape para salir usando QUIT.
# def esperarJugadorPresTecla():
# while True:
# for event in pygame.event.get():
# if event.type == QUIT:
# terminate()
# if event.type == KEYDOWN:
# if event.key == K_ESCAPE:
# Presionar escape naliza
55
# terminate()
# return
Si te das cuenta, estamos usando todo lo que hemos aprendido
hasta ahora para realizar un juego ms completo y divertido que
un simple rectngulo, pero aun as necesitamos de colisiones para
saber si nuestra nave chocara con algn asteroide, bsicamente us-
amos el mtodo fcil que anteriormente fue explicado llamado collid-
erect. Mandando el rectngulo perteneciente a la nave espacial con
todo el arreglo del vector de asteroides, recuerda que en un vector de
tipo arreglo pues hemos almacenado todo los asteroides y pues cada
vez que iniciemos el juego, vericara que haga alguna colisin con al-
guno de esos asteroides. # def JugadorColisionAsteroide(naveRect,
asteroides):
# for b in asteroides:
# if naveRect.colliderect(b['rect']):
# return True
# return False
Ya que estamos realizando algo ms profesional, necesitaremos
que nuestro juego llame la atencin es por eso que para ahorrarnos
cdigo vamos a crear una funcin de texto para lo que tengamos que
utilizar y no tengamos que por cada lnea de texto denir las mismas
variables a usar. Donde esta funcin recibir los valores para poder
dibujar el texto que quiero su fuente y donde lo quiero. Recuerden
que en captulos anteriores por cada texto que tenamos que agregar
debimos agregar estas lneas, ahora lo que hacemos es simplicar con
esta funcin.
56
# def dibujarTexto(text, font, supercie, x, y):
# textobj = font.render(text, 1, COLORTEXTO)
# textrect = textobj.get_rect() # textrect.topleft = (x, y)
# supercie.blit(textobj, textrect)
Luego tenemos ms de lo mismo, inicializar la librera llamando
al mtodo INIT, porque Pygame ejecutara cierta cantidad de cdigo
para preparase y un reloj inicial. pygame.init() relojPrincipal =
pygame.time.Clock() Seguimos con la supercie:
# supercieVentana = pygame.display.set_mode((ANCHOVENTANA, AL-
TOVENTANA), 0, 32)
El ttulo de la ventana, donde indicamos que el mouse no se vea
en la pantalla, eso depende del tipo de juegos que realicen, ya que
pueden usar el ratn sin ningn problema en los juegos que diseen,
en este caso no lo necesitamos:
# pygame.display.set_caption('Asteroides')
# pygame.mouse.set_visible(False) Inicializar las Fuentes de nuestro juego:
# font = pygame.font.SysFont(None, 44)
Figura 35: Comienzo del juego en espera que el jugador presione una tecla
Probando, Probando, 1...2...3
57
Ahora, pasemos a algo completamente nuevo, inicializar sonidos
con Pygame es muy sencillo y simple, l nos facilita mucho la vida
con sus funciones mixer.sound y mixer.load, ellas buscan y cargan
respectivamente el archivo de sonido que queremos ejecutar, lo nico
que debemos realizar es crear una variable para ellas y diferenciarla
los sonidos en la trama, por ejemplo para el sonido de n de juego
solo debemos escribir:
# sonidoFinJuego = pygame.mixer.Sound('pygameFinal_over.wav')
# pygame.mixer.music.load('pygameFinal_bg.mid'
El archivo de mixer ser tomado como la msica de fondo, esto
no quiere una variable de control como la variable sonidoFinJuego,
porque automticamente el mixer de Pygame lo ejecuta. Si te has
dado cuenta se ha creado una variable llamada sonidoFinJuego con la
nalidad de controlar ese evento exacto con el sonido cuya extensin
en este caso es .wav. Como nota importante, debes recordar que si
tienes todos los sonidos e imgenes en la misma carpeta ejecutable del
juego, no ser necesaria colocar una ruta pero de lo contrario debers
hacerlo. Cabe destacar, que los sonidos del juego de ejemplo que es-
tamos realizando son basados en los sonidos de Mario Bross. Puedes
colocar cualquier sonido que desees y editarlos, recomendamos siem-
pre el uso de programas libres es por ello que recomendamos el uso
de AudaCity como editor y grabador libre, mostramos en la gura el
logotipo de este maravilloso programa.
Figura: Logotipo de AudaCity, software libre para la edicin de msica y
sonidos.
Amor a primera vista
Ya que tenemos nuestros novedosos efectos de sonido y la msica
de fondo, hay que darle ms vida y eso ser gracias a las imgenes.
Lo primero que haremos es crear una variable que cargue la imagen
donde gracias a la funcin de Pygame image.load podremos cargar
nuestra imagen ubicada en la ruta correspondiente, al nosotros por
ejemplo cargar la imagen de nuestra nave, automticamente debe
58
generar un rectngulo de la aeronave, porque necesitamos saber el an-
cho y alto de la imagen para saber done estn las colisiones, porque
estas van a suceder con el rectngulo de la imagen mas no direc-
tamente a la imagen que subamos, aunque el mismo sea invisible
pero necesario para el paso fundamental de las colisiones. El manejo
de sprites, que son todos estos bits dibujados para nuestra ventana,
pueden ser creados usando tecnologas libres tales como GIMP, un
entorno para la edicin de imgenes completamente gratuito y libre.
Puedes pasar por la imagen y ver su logo.
Figura: Logotipo de GIMP, software libre para la edicin de imgenes.
# imagenNave = pygame.image.load('pygameFinal_avion.png')
# naveRect = imagenNave.get_rect()
En el caso de la imagen de fondo y el asteroide es lo mismo,
debemos cargar nuestras imgenes con la funcin de Pygame que
hemos comentado. # imagenAsteroide = pygame.image.load('pygameFinal_roca.png')
# imagenFondo = pygame.image.load('pygameFinal_campo.png')
De la misma manera que hicimos con la nave, haremos una
variable inmediata del fondo para obtener el ancho y largo del fondo
para las colisiones, me permite acceder a otras propiedades en el
mapa.
# fondoRect = imagenFondo.get_rect()
Para dibujar el campo de asteroides, simplemente usamos una
funcin de Pygame llamada BLIT, me permitir agregar la imagen
fondo con las propiedades del fondoRect, que es lo extraido de la
imagen de fondo.
# supercieVentana.blit(imagenFondo, fondoRect)
59
Pasemos, a mostrar el inicio de nuestro juego, dibujando un
texto muy bonito dndole la bienvenida al usuario y armndole que
si presiona una tecla comenzara el juego, todo el texto estar en las
posiciones X y Y que hemos explicado en captulos anteriores. Y
pasamos a actualizar todo lo que llevamos con update:
# dibujarTexto('Asteroides!', font, supercieVentana, 200, 100)
# dibujarTexto('Presiona una tecla para comenzar', font, supercieVen-
tana, 25,300)
# pygame.display.update()
Hacemos recordarle a Python que se debe esperar a que el ju-
gador presione una tecla, as es, nuestro querido Python puede ser
un poco sobre la marcha si no le advertimos que debe tener un poco
de paciencia, para ello escribimos:
# esperarJugadorPresTecla()
Si, queremos agregarle puntaciones al juego debemos denir en
0 una variable de puntaje alto de esa forma si esta fuera de un bucle
se ira almacenando por cada juego. De esta forma, el jugador seguir
jugando y almacenando sus puntajes pero si cierra el juego y lo vuelve
abrir comenzara de nuevo.
# puntajeAlto = 0
Ahora si podemos comenzar el bucle innito que nos llevara a
seguir el juego, desde aqu el jugador le da una tecla y comenzara el
juego: Que comience el juego
Figura 38: Carpeta donde est almacenado todos los archivos del juego,
incluyendo las imgenes y sonidos.
60
# while True:
Luego del bucle, podemos seguir inicializando condiciones al
juego, las que queramos porque somos los creadores del mismo. Colo-
camos la nave en el centro de la pantalla, la forma ms fcil de realizar
esto, es dividendo el ancho de la ventana entre dos y el alto menos
50 para que quede abajo la nave , el contador de asteroides en 0 y el
puntaje por supuesto desde 0, los asteroides an no hay ninguno:
# asteroides = []
# puntaje = 0
# naveRect.topleft = (ANCHOVENTANA / 2, ALTOVENTANA - 50)
# contadorAsteroides = 0
Para que no exista un movimiento inicial de la nave, debers
colocarlos en falso, te muestro a continuacin una forma ms rpida de
la que mostramos en captulos anteriores, donde una variable puede
ser igual a varias y estas sern al nal igual a falso.
# moverIzq = moverDer = moverArriba = moverAbajo = False
Si deseas aadir algunos trucos, por ejemplo hacer que la nave
este ms lenta o su camino sea reserva, tambin puedes hacerlo, re-
cuerda que los lmites los pondr tu imaginacin, pero desde el prin-
cipio los colocaremos en falso, ya que la activacin de los mismos lo
decidir el jugador:
# trucoReversa = trucoLento = False
Aqu es donde comienza la msica de fondo del juego, es por
eso que la inicialicemos con:
# pygame.mixer.music.play(-1, 0.0)
61
Figura 39: El juego en plena accin con la msica de fondo y sonidos extras
con la temtica de esquivar los asteroides. En la parte superior izquierda, se
muestran los puntajes
Controles Ahora, vamos a iniciar un segundo loop innito, Por
qu?, este se ejecutara para lograr el movimiento de los asteroides y
dems acciones del juego restante.
# while true:
Puedes observar, que desde la interaccin del while vamos a in-
crementar el puntaje que vamos acumulando con la variable puntaje:
# puntaje += 1
Llegamos al punto, donde si sucede le evento salir, sencillamente
se sale del juego recurriendo a la funcin QUIT que har terminar
todo:
# for event in pygame.event.get(): # if event.type == QUIT:
# terminate()
Luego, revisaremos los eventos al presionar una tecla, usando
KEYDOWN como hemos explicado en captulos anteriores, recorde-
mos que debemos jugar con el verdadero y falso de cada uno de los
movimiento. Hay algo muy interesante que destacar, es que si aprieta
la tecla X o Z, estaremos utilizando los trucos, esto signicara que
cambiara a verdadero su valor:
# if event.type == KEYDOWN:
# if event.key == ord('z'):
# trucoReversa = True
62
# if event.key == ord('x'):
# trucoLento = True
# if event.key == K_LEFT or event.key == ord('a'):
# moverDer = False
# moverIzq = True
# if event.key == K_RIGHT or event.key == ord('d'):
# moverIzq = False
# moverDer = True
# if event.key == K_UP or event.key == ord('w'):
# moverAbajo = False
# moverArriba = True
# if event.key == K_DOWN or event.key == ord('s'):
# moverArriba = False
# moverAbajo = True
De igual forma, suceder si las teclas son liberadas, de ninguna
manera deber existir movimiento de la aeronave que queremos con-
trolar, este caso los trucos nuevamente son llevados a falso:
# if event.type == KEYUP:
# if event.key == ord('z'):
# trucoReversa = False
# puntaje = 0
# if event.key == ord('x'):
# trucoLento = False
# puntaje = 0
# if event.key == K_ESCAPE:
# terminate()
# if event.key == K_LEFT or event.key == ord('a'):
# moverIzq = False
63
# if event.key == K_RIGHT or event.key == ord('d'):
# moverDer = False
# if event.key == K_UP or event.key == ord('w'):
# moverArriba = False
# if event.key == K_DOWN or event.key == ord('s'):
# moverAbajo = False
Es tiempo de aadir todos los asteroides necesitados al principio
de la pantalla de ser necesario, si hay algn truco activo no agregara
los nuevos asteroides:
# if not trucoReversa and not trucoLento:
# contadorAsteroides += 1
# if contadorAsteroides == AGREGASTEROIDVEL:
ContadorAsteroides = 0 Los asteroides son agregados aleato-
rios, gracias a random. Hay algo interesante que destacar, es que
en la supercie vamos a agregar la imagen del asteroide con la fun-
cin llamada transform.scale de esta forma nos dar aleatoriamente
el ancho y largo del asteroide. La velocidad tambin es denida.
#ASTEROIDETAM= random.randint (ASTEROIDEMIN, ASTEROIDE-
MAX)
# nuevoAsteroide = {
# 'rect' : pygame.Rect(random.randint(0,
#ANCHOVENTANA-ASTEROIDETAM), 0 - ASTEROIDETAM,
#ASTEROIDETAM, ASTEROIDETAM),
# 'speed' : random.randint(ASTEROIDEMINVEL,
#ASTEROIDEMAXVEL),
# 'supercie' : pygame.transform.scale(imagenAsteroide,
# (ASTEROIDETAM, ASTEROIDETAM)), }
64
Terminando Ahora, vamos a decirle a Python, como se mover
el jugador, en este caso la aeronave:
# if moverIzq and naveRect.left > 0: naveRect.move_ip(-1 * VELOCI-
DADJUGADOR, 0)
# if moverDer and naveRect.right < ANCHOVENTANA: naveRect.move_ip(VELOCIDADJUGADOR,
0)
# if moverArriba and naveRect.top > 0: naveRect.move_ip(0, -1 * VE-
LOCIDADJUGADOR)
# if moverAbajo and naveRect.bottom < ALTOVENTANA: naveRect.move_ip(0,
VELOCIDADJUGADOR)
Movamos los asteroides hacia abajo, siempre vericando los tru-
cos, siempre se mover hacia abajo a la velocidad que nosotros de-
namos y esta ser aleatoria, por eso ac podemos denir que los as-
teroides sern algunos ms lentos y otros ms rpidos, si el truco de
reversa est activado, quiere decir que estos se movern hacia arriba
con el valor -5, si los asteroides pasan al truco lento sern denidos
con el valor de 1.
# for b in asteroides:
# if not trucoReversa and not trucoLento:
# b['rect'].move_ip(0, b['speed'])
# elif trucoReversa:
# b['rect'].move_ip(0, -5)
# elif trucoLento:
# b['rect'].move_ip(0, 1)
Para borrar los asteroides que se pasaron del alto de la pantalla,
pues ya los hemos pasado y no queremos volver a verlos. Usamos un
remove por cada asteroide que va hacia el alto de la ventana (top):
# for b in asteroides[:]:
# if b['rect'].top > ALTOVENTANA:
# asteroides.remove(b)
Pasamos a dibujar la supercie del juego con el color de fondo
denido:
# supercieVentana.ll(COLORFONDO)
65
Y dibujamos el campo de asteroides de fondo, usando blit.
Porque recuerdan que siempre se hacen hacer un update y se realiza
la actualizacin de la pantalla esta se limpiara.
# supercieVentana.blit(imagenFondo, fondoRect)
Mostramos los puntajes llamando el dibujarTexto, usamos el
parmetro d %s para tomar los valores de puntaje y puntajeAlto
con sus respectiva fuente y en donde estar ubicado.
# dibujarTexto('Puntaje: %s' % (puntaje), font, supercieVentana, 10, 0)
# dibujarTexto('Mejor: %s' % (puntajeAlto), font, supercieVentana, 10,
40)
Ahora comencemos a dibujar el rectngulo del jugador con su
imagen:
# supercieVentana.blit(imagenNave, naveRect)
Dibujamos todos los asteroides del vector, vamos a recorrer todo
el vector para poder sacar la supercie y el rect.
# for b in asteroides:
# supercieVentana.blit(b['supercie'], b['rect'])
Actualizamos pantalla:
# pygame.display.update()
Vericamos las colisiones y la velocidad del juego :
# if JugadorColisionAsteroide(naveRect, asteroides):
# if puntaje > puntajeAlto:
# puntajeAlto = puntaje
# dene el puntaje ms alto
# break
# relojPrincipal.tick(FPS)
66
Al salir del segundo bucle, quiere decir que un asteroide toco la
nave. Entonces detenemos la msica de fondo y debe sonar el n de
juego con sus respectivos textos de nal de juego, avisndole si desea
presionar una tecla para jugar de nuevo:
# pygame.mixer.music.stop()
# sonidoFinJuego.play()
# dibujarTexto('GAME OVER', font, supercieVentana, 200, 200)
# dibujarTexto ('Presiona una tecla para jugar otra vez.', font, super-
cieVentana, 25, 300
Hacemos un ltimo recordatorio a Python de todo lo que hemos
hecho hasta ahora con update y para nalizar, declaramos esperar
hasta que el jugador presione una tecla y se activa el sonido de n de
juego, listo y sintete orgullo de desarrollar tu primer juego usando
Python y esta gran librera llamada Pygame.
# pygame.display.update()
# esperarJugadorPresTecla()
# sonidoFinJuego.stop()
Figura 40: Cuando ocurre la colisin, se acaba el juego mostrando un ttulo
para comenzar de nuevo.
67
Videos Juegos Realizados en Python: Sansn y Los Filisteos.
Este Video Juego fue Realizado por: Garca Jocabed Moreno Mariana
Sansn: Se caracteriza por una gura herclea, usando una extraordinaria
fuerza para combatir contra sus enemigos y llevar a cabo actos heroicos
inalcanzables para la gente comn: luchar contra un len (sin ms ar-
mas que sus propias manos), acabar con todo un ejrcito con slo una
mandbula de burro, o derribar un edicio.
Filisteos: Los listeos aparecen en fuentes egipcias donde son presentados
como los enemigos de Egipto venidos del norte, mezclados con otras pobla-
ciones hostiles conocidas colectivamente por los antiguos egipcios bajo el
nombre de Pueblos del Mar.
68
En la lnea 353 imagen.set_colorkey (imagen.get_at((0,0)) , pygame.RLEACCEL
) que hace esa funcin? R: Un sprite es un objeto que tiene dos propiedades:
image y rect. "image" es la imagen a mostrar y "rect" es el rectngulo
en donde se muestra la imagen en pantalla, para ello utilizamos clases
como "bala" que hereda a su vez de la clase "pema" que en este caso
sera nuestro punto de partida. En la clase "bala" denimos el disparador
y su velocidad, si notan la lnea 256 se empiezan a comprobar todas las
condiciones dependiendo si este choca con un objetivo o simplemente hace
contacto con la misma pared de nuestro juego.
Qu hace: letra = pygame.font.Font ('Grandezza.ttf', 25)? R: letra =
pygame.font.Font ('Grandezza.ttf', 25) hace el llamado al archivo que es
para el formato de las letras q se muestra en el inicio.
Sugerencias de Parte del Grupo:
Recuerden que para poder iniciar siempre un juego nuevo o a su vez visto
por primera vez, es necesario que revisemos de manera detallada sus in-
strucciones, para as no presentar muchos inconvenientes a la hora de jugar
el mismo.
Tambin a la hora de realizar cualquier juego, querer modicar los mismos
o modicar los cdigos de los mismos. Hay que respetar esa parte, es decir
respetar los derechos de autor ya que son temas muy delicados y si no los
conocemos a fondo son ms delicados.
El video juego: Sansn y los listeos, es muy bueno, muy creativo y su
parte de diseo es muy original.
Videos Juegos Realizados en Python:
Astuto Ben.
Este Video Juego fue Realizado por:
Blanco Laudis Carrasquel Rosmauris
Guayapero Reynaldo
Leota Brbara Mendoza
Diana Pulido Naicelis
69
Astuto Ben: Es un videojuego basado en Bobby Carrot, creado en el
lenguaje python que busca despertar el inters y la motivacin espontanea
de los usuarios que lo ejecutan. Bobby Carrot es una serie de videojuegos
producida, desarrollada y publicada por la empresa alemana FDG Mobile
Games. La primera entrega de la serie se distribuy gratuitamente, prein-
stalndola en numerosos modelos de telfonos Samsung, por gentileza de
eFUSION Mobile. La serie consta hasta ahora de cinco juegos, todos ellos
diseados para telfonos mviles.
Videos Juegos Realizados en Python: El Helicptero.
Este Video Juego fue Realizado por:
Boada, Jess
Bolvar,Jos
Guevara, Marianny
Quijada, Angel
Helicptero: Es una aeronave que es sustentada y propulsada por uno o
ms rotores horizontales, cada uno formado por dos o ms palas. Los
helicpteros estn clasicados como aeronaves de alas giratorias para dis-
tinguirlos de las aeronaves de ala ja porque los helicpteros crean sus-
tentacin con las palas que rotan alrededor de un eje vertical.
Que Hace la Funcin def (HelicopteroRect, meteoritos):for b in me-
teoritos: return true return false?
R: def (HelicopteroRect, meteoritos):
for b in meteoritos: if HelicopteroRect.colliderect (b[`rect`]):
Return true
70
Return false Esta funcin determina la colisin entre el helicptero y al-
gunos de los meteoritos.
Funcion para terminar juego def terminar():
#Funcion que permite terminar el juego. pygame.quit() sys.exit()
def Esperar():
#Funcion que espera que se presione una tecla despues de la "colision",
para volver a jugar o salir del juego.
Este codigo va debajo de TEXCOLOR = BLANCO
while True:
for event in pygame.event.get():
if event.type == QUIT:
terminar() if event.type == KEYDOWN:
if event.key == K_ESCAPE: #Al presionar escape cierra la ventana de
juego. terminar()
return.
Este otro codigo que es otra funcion es el que nos permite dibu-
jar el texto en la pantalla lo debes colocar debajo de #Funcion que
espera que se presione una tecla despues de la "colision", para volver
a jugar o salir del juego.
#Dibuja el texto en la pantalla.
def DibujarTexto(text, font, screen, x, y):
textobj = font.render(text, 1, TEXTCOLOR)
textrect = textobj.get_rect()
textrect.topleft = (x, y)
screen.blit(textobj, textrect)
# Creamos la fuente y asignamos un tamao a la misma.
font = pygame.font.SysFont(None, 50)
71
Y por ultimo este otro codigo lo debes colocar debajo de Pun-
taje_Panta('Juego Terminado.Puntaje: %s' % puntos, font, screen,
0, 0, BLANCO)
#muestra el mensaje de game over.
DibujarTexto('Presiona una tecla.',font, screen, (SCREEN_WIDTH / 3)
- 50, (SCREEN_HEIGHT / 3) + 50)
DibujarTexto('para intentarlo nuevamente.',font, screen, (SCREEN_WIDTH
/ 3) - 130, (SCREEN_HEIGHT / 3) + 80)
pygame.display.update()
pygame.display.ip() #Actualizamos la pantalla E