Scripting con Blender y Python

En los anteriores articulos vimos como empezar a usar BGE y realizar un pequeño ejemplo de juego FPS, usando el Game Logic Editor de blender, usando “logic briks”, pero si queremos avanzar en el desarrollo de sistemas mas completos y personalizar a nuestro gusto el juego tendremos que empezar a usar scripts de python en blender, como veremos a continuacion:

La consola de Python Para poder empezar a depurar los posibles errores que tengamos al escribir codigo python y ver los mensajes por pantalla, tenemos que usar la consola.La forma de activar la consola es diferente dependiendo del sistema operativo, En Gnu/Linux no existe la opcion de consola dentro de blender, para poder ver estos mensajes tenemos que iniciar blender desde el terminal, en guindows u otros sistemas si tenemos la opcion de consola, desde el menu de blender, para activarlas podeis mirar la siguiente direccion https://wiki.blender.org/index.php/User:Fade/Doc:2.6/Manual/Interface/Window_system/Console_window

Scripting Para empezar a realizar nuestros scripts, tendremos que activar el “text editor” para ello lo mejor es que dividas la pantalla, para tener la vista 3D en un lado y el editor de texto en la otra.(como vimos en los anteriores articulos)


Creamos un simple “hello world” y lo llamamos test.py

print ('Hola mundo')

Ahora volvemos a dividir la vista 3d pasa sacar el editor logico, y creamos el siguiente patron en nuestro objeto cubo, ahora cuando iniciemos el Game Engine con la letra ‘p’ nos aparecera el mensaje en consola.

Simple, no pues vamos a meterle un poco mas de “chicha” el tema, ahora vamos a meterlo movimiento a nuestro cubo, para ello escribimos el siguiente codigo en nuestro archivo test.py(luego lo explicamos)

import bge
cont = bge.logic.getCurrentController()
own = cont.owner
mover = cont.actuators["mover"]
arriba = cont.sensors["arriba"]
abajo = cont.sensors["abajo"]
velocidad = mover.dLoc[1]

if arriba.positive:
    velocidad = velocidad + 0.05
    mover.dLoc = [0.0, velocidad, 0.0]
    cont.activate(mover)

Guardamos el archivo como test.py(o el nombre que queramos) y creamos el siguiente patron logico

El fichero contiene las instrucciones que nuestro programa seguira, una vez los sensores sean activados, para ello lo primero que hacemos es llamar a la libreria bge con import, despues accedemos al controlador y a su dueño y definimos las variables para acceder a los controladores y sensores. Una vez son accedidos incrementamos sus valores como vemos en la condiccion if. El valor mover.dLoc1 lo que hace es acceder a las propiedades del actuador(mover) que definimos y modificar el valor de su segundo campo, si hubieramos puesto mover.dLoc accederiamos al primer campo.

Una vez tenemos definido el codigo solo necesitamos que el esquema logico que realizamos coincida con los nombres que le hemos dado en el codigo, ejemplo un sensor del tipo keyboard que se llame(arriba,abajo) un controlador python llamando al fichero test.py y un actuador que se llame(mover). Con esto podremos empezar a mover nuestro cubo por la pantalla, jugando con los valores de X,Y,Z, modificandolos en nuestro script.

Modificando nuestro FPS

Ahora que conocemos como funciona python scripting en blender y con ayuda de la documentacion oficial https://docs.blender.org/api/2.78a/bge.logic.html, podemos modificar nuestro anterior fps, para añadir algunas funciones interesantes.

  • Contador de balas

Para hacer funcionar el script necesitamos crear una propiedad para nuestro juego llamada municion, que fijamos en 10(10 balas) y un actuator llamado disparo, que apunte a nuestro sensor de disparo, dentro de nuestro objeto bala. Que queda de la sigueinte forma:

Ahora creamos un script llamado disparo.py con el siguiente código:

import bge
cont = bge.logic.getCurrentController() 
own = cont.owner
disparo = cont.actuators["disparo"]
balas=own["municion"]
ataque= cont.sensors["disparo"]
if  ataque.positive:
    while (balas >=1):
        balas=balas-1
        print('Tenemos balas',balas)
    else:
        print('No quedan balas')
        cont.activate(disparo)

De esta manera creamos un contador de balas, que cuando llegue a 0 a parte de escribir el mensaje(en la consola) de que no nos quedan balas finaliza el objeto bala, por lo que no podemos seguir disparando.

Con lo que hemos visto hasta ahora, tambien podriamos gestionar las vidas de nuestro enemigo y hacerle desaparecer de la pantalla cuando estan se acaben, de la siguiente manera:

  • Vidas Enemigo

Creamos una nueva propiedad llamada vidaEnemigo y la fijamos en 3(vidas) luego creamos el siguiente esquema lógico:

Añadimos un modelo de enemigo(cualquiera de licencia libre y formato para blender. y le creamos un actuator del tipo edit object, con la propiedad end object, y para finalizar creamos un sensor del tipo colision.

Los unimos con nuestra colision creando el script enemigo.py

import bge
cont = bge.logic.getCurrentController() 
own = cont.owner
muerte = cont.actuators["muerte"]
vidaEnemigo=own["vidaEnemigo"]
colision= cont.sensors["colision"]
if colision.positive:
    while (vidaEnemigo >=1):
        vidaEnemigo=vidaEnemigo-1
        print('vidas',vidaEnemigo)
    else:
        print('No quedan vidas')
        cont.activate(muerte)

Ahora en la consola se mostrara un contador de vidas que empieza a decrecer desde 3(el valor que le fijamos en la propiedad) y que cuando llega a 0 hace desaparecer el enemigo.

Evidentemente todos los mensajes que sacamos por consola con print son solo para depurar, no son necesarios para el desarrollo del juego.

En proximos articulos, veremos como animar a nuestro enemigo, para que el tambien nos pueda atacar.

Leave a Reply

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax