PROYECTO SAI –BATALLA NAVAL

Anuncio
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013
PROYECTO SAI – BATALLA
NAVAL - COMPONENTES
Thomas Manrubia y Elena Burdiel
Thomas Manrubia y Elena Burdiel
1
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013
PROYECTO SAI - COMPONENTES
Batalla Naval en las Neveras
ALUMNOS
► Elena Burdiel Pérez
►Thomas Manrubia Fuet
TIPO DE PROYECTO
Blender Game
COMPONENTES
RESULTADO DE APRENDIZAJE
► Apuntar con
el ratón.
► Profundizar en
la lógica con objetos
►
Texture painting
►
Addons
► Utilización
de texturas realizadas a partir de video renderizado previamente.
► Programación
en python.
► Combinación de programación en python y logic bricks para el manejo de
acciones.
► Estado “idle”.
ELEMENTOS
► Luces
► Cámaras
► Mar
Thomas Manrubia y Elena Burdiel
2
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013
► Islas
► Torretas
► Armas
► Profesores
► Llave
► Cofre
► Barcos
DESARROLLO
Se parte del fichero base.blend. Se elimina el cubo (tecla x) y se deja el resto de
elementos: Lamp, Lamp.001, Lamp.Fill, Camera y Floor. Se comprueba que están
situados en su capa correspondiente (apartado ELEMENTOS) y, de no ser así se corrige
(tecla m y se elige la capa).
A continuación se procede a crear el resto de elementos (serán una versión muy
básica, que irá mejorándose en otras fases de diseño del juego).
ESCENARIO
Se crea el escenario descrito en la figura 1 a partir de cubos. Más adelante se
modelarán como corresponde. Todos estos elementos han de situarse en la capa 3.
Se crean (shift a -> mesh -> cube) y se les da su tamaño (s x, s y, s z) y posición (g x, g
y, g z) correspondiente. Según se crean se les da su nombre correspondiente (panel
de propiedades -> object).
Mar: 72x123x2 unidades blender.
Islas: 12 islas de tamaño variable.
Muelles: 2 muelles de 12x6x4 unidades blender.
OBJETOS
Se crean los objetos descritos en la figura 1 a partir de cubos. Más adelante se
modelarán como corresponde. Todos estos elementos han de situarse en la capa 2.
Se crean (shift a -> mesh -> cube) y se les da su tamaño (s x, s y, s z) y posición (g x, g
y, g z) correspondiente. Según se crean se les da su nombre correspondiente (panel
de propiedades -> object).
Barco: 9x5x4 unidades blender.
Barco_enemigo: 9x5x4 unidades blender.
Partes_arma: 3 partes del arma. Esferas de diámetro 5 unidades blender.
Cofre: 7x3x4 unidades blender.
Thomas Manrubia y Elena Burdiel
3
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013
Para poder distinguir estos elementos fácilmente se les dota además de un material
característico (propiedades -> material).
Figura 1
CREACIÓN DE UNA ISLA
Se va a utilizar la malla “landscape”. Por defecto no está disponible, pero
puede conseguirse haciendo lo siguiente:
►
Ve a la ventana User preferences (figura 2)
►
Pincha en Addons y busca “landscape”. Por último selecciona el cuadrito a
la derecha (en el nombre) para habilitarlo (figura 3).
Figura 2
Thomas Manrubia y Elena Burdiel
Figura 3
4
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013
Vuelve a la ventana3D View y crea una nueva malla seleccionando lansdcape (Shift+A > Mesh -> Landscape). Si resulta demasiado pequeña, escálala (tecla “s” + número).
Tiene muchos vértices por lo que hará que nuestra isla “pese” mucho. Para reducir
vértices, aplicamos el modificador Decimate como se muestra en la figura 4 y figura 5:
Figura 4
Figura 5
Se han reducido notablemente el número de vértices (y caras), pero el aspecto es el
de una isla llena de rocas. Como la isla estará cubierta de arena, es necesario suavizar
la superficie. Para ello se usa el Smooth (tecla T -> Shading -> Smooth) en modo
objeto. Para obtener un suavizado aún mayor se usa Smooth Vertex (tecla T ->
Deform-> Smooth Vertex) en modo edición (figura 6 y figura 7).
Figura 6
Figura 7
Texture painting
Una opción es utilizar una imagen como textura como se ha visto en clase (añadir
textura y utilizar mapa UV), pero el resultado obtenido puede ser un poco malo. Otra
opción es utilizar Texture Painting, es decir, usar texturas como pinceles, tal y como
se explica a continuación:
Thomas Manrubia y Elena Burdiel
5
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013
Figura 8
Figura 10
Figura 9
Figura 11
Se entra en U/V Image Editor (figura 8) y se crea una nueva textura (figura 9). Por
otro lado, en Modo edición: Mesh ->UV Unwrap -> Unwrap.
A continuación se selecciona el modo Texture Paint (figura 10) y dentro de las
herramientas (tecla T), dentro de Texture, se crea una nueva textura (figura 11). A
continuación, dentro de la ventana Properties, en Textures se selecciona la textura que
acabamos de crear, tipo image or movie, y se le asigna la imagen que deseemos para
nuestra textura (figura 12). El radio del “pincel” se puede seleccionar en herramientas
(tecla T) -> Radius (figura 13). Se recomienda usar un tamaño intermedio: no muy
pequeño para no estar mucho tiempo pintando ni muy grande para poder aprovechar
la herramienta correctamente. Se puede pintar sobre el propio objeto o sobre la
textura, en la ventana U/V Image Editor, habilitando el modo image painting (figura
14). Como consejo, es recomendable usar una textura “tileable”.
Thomas Manrubia y Elena Burdiel
6
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013
Figura 12
Figura 13
Figura 14
BREVE DESCRIPCIÓN DE LOS ELEMENTOS MÁS IMPORTANTES
CÁMARAS
En la escena “Principal” hay tres cámaras: una para el mapa y dos para el barco.
Después, hay una cámara para cada escena (“Ganar, “Menu”, “Vida”,etc)
ESCENAS
Hay un total de ocho escenas:
- AnimTexto: Escena que hace que se ponga en la pantalla, volver: Letra Q.
- Controles: Escena con la explicación de lso ocntroles del juego.
- Ganar: Escena que aparece cuando se logra superar el juego. Permite volver al menú
principal reiniciar el juego o salir.
- Ins: Escena con el vídeo explciativo sobre el juego.
- Menu: menú principal del juego, la primera escena que aparece al comenzar a
jugar. A partir de aquí se puede acceder al juego, leer las instrucciones (comandos),
ver un vídeo explicativo o salir del juego.
- Perder: Escena que aparece cuando no se logra superar el juego. Permite volver
al menú principal reiniciar el juego o salir.
- Principal: Escena para el desarrollo de la acción del juego.
- Vida: Escena que pone la información del angulo de tiro, la vida, cuantas torretas
se han destruído.
Thomas Manrubia y Elena Burdiel
7
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013
ISLAS, TORRETAS; ARMAS Y PROFESORES
Hay once islas en el mar: diez islas “de los profesores” y una onceava en la que se
encuentra el cofre. Cada isla “de los profesores” tiene una torreta. En cada torreta se
encuentra vigilando un profesor, el cual dispone de un arma (ametralladora). El
funcionamiento es el siguiente: el arma dispara al barco del alumno cuando este
sobrepasa un determinado radio de cercanía. Según se mueve el barco, el arma rota
para intentar alcanzarlo con los disparos.
Si el alumno intenta disparar a las torretas, transcurrido un tiempo ellas también
dispararan, esto lo hacen para poder protegerse cuando se les dispara y ser difícilmente
destruidas.
El alumno puede evitar ser alcanzado por los proyectiles disparando sobre los que
vienen encima, por eso la velocidad de los proyectiles es lo suficientemente lenta como
para verlos y poderles disparar y así evitar que los impactos quiten vida al alumno.
El profesor se encuentra emparentado con el arma, de manera que también rota
siguiendo el movimiento del barco del alumno. Cuando el arma no ha detectado al
alumno, el profesor se encuentra ejecutando una animación “idle”. Cabe destacar que
los profesores tienen un modelado naif, dado que la atención del juego no se centra en
ellos.
Texturado del profesor
El modelao del profesor, al igual que la creación y animación de su esqueleto, no es
muy relevante, ya que es muy similar a lo realizado con el ejercicio del “Tortugo”. Sin
embargo, el texturado puede resultar algo más complicado, debido a que se utilizan
varias texturas para un solo personaje. Para ello es necesario crear tantos materiales y
mapas de coordenadas U/V como texturas diferentes se vayan a utilizar. El
procedimiento es el siguiente:
- En propiedades, en material, se añade un nuevo material (figura 15) y se
le pone un nombre significativo.
- En modo edición, se seleccionan las partes de la malla que se quieran utilizar
en la textura y se hace acepta la selección con Assing (figura 15, encima del
recuadro 4, izq).
- En Object Data, se crea un nuevo mapa U/V con nombre significativo
(figura 16)
- En textures se crea una nueva textura, dotándola de un nombre significativo, se
elige su tipo y, si es necesario, demás características (figura 17).
- Por último, se accede al escritorio 4 UV y se procede como se ha visto en
los ejercicios de texturado realizados en clase.
Thomas Manrubia y Elena Burdiel
8
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013
Figura 15
Figura 17
Figura 16
MAR
En el documento “PROYECTO SAI – BATALLA NAVAL - FUENTES” se indican los
tutoriales utilizados para la creación del mar. En el juego “la batalla naval” se
han usado 4 empty para animar en vez de 2 para que el mar sea más realista.
BARCOS
Hay dos barcos en el juego. Uno de ellos es el barco del alumno. Su funcionamiento
se describe en la figura 18.
Figura 18
El otro barco es el barco enemigo. Sigue al barco del alumno por el escenario
del juego, disparándolo.
Thomas Manrubia y Elena Burdiel
9
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013
PROGRAMACIÓN EN PYTHON
Para aprender a programar en python se han utilizado un conjunto de páginas y
videos que cubren los aspectos más fundamentales de la programación en python.
Pueden consultarse en el documento “PROYECTO SAI – BATALLA NAVAL - FUENTES”.
MARCADORES
Se disponen de los siguientes marcadores para conocer en todo momento los logros
en el juego:
-Vida del alumno: se comienza con 100 puntos. Se pierden 10 puntos cada vez que
es alcanzado por un disparo. Al llegar a 0 puntos se pierde el juego.
-Llave: Recuento de las partes de la llave obtenidas hasta el momento
-Ángulo de disparo: indica el ángulo con el que está apuntando el cañón. Se
actualiza según se mueva el ratón para apuntar.
- Dirección del barco: disponible solo desde la vista del cañón.
ASPECTOS INTERESANTES
Cómo acceder directamente al teclado sin los sensores keyboard
Se puede acceder directamente a las teclas utilizando los módulos Game
Logic (bge.logic) y Game Keys (bge.events) del Game Engine.
Se ilustra este proceso con un ejemplo para su mayor comprensión.
Pretendemos realizar una determinada acción al pulsar la tecla “W” del teclado,
para ello utilizaremos una expresión condicional:
if bge.logic.KX_INPUT_ACTIVE == bge.logic.keyboard.events[bge.events.WKEY]:
Para otras teclas se puede reemplazar el contenido entre corchetes por la
tecla correspondiente.
Thomas Manrubia y Elena Burdiel
10
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013
Cómo controlar la vista o un objeto con el ratón
En esta parte se empleará a modo de ejemplo un script simplificado. Partimos del
archivo por defecto de blender realizamos las siguientes modificaciones:
- Seleccionamos Blender Game en vez de Blender Render.
- Duplicamos el cubo por defecto y situamos otro cubo encima de este.
- Renombramos el cubo que esta abajo con el nombre “cubo01” y el que
está encima con “cubo02”.
- Se crea una cámara y se sitúa encima del cubo02 (encima de los dos cubos)
- Se sitúa enfrente de la cámara un objeto “Monkey” para ver cómo se
mueve la cámara.
- Se emparenta la cámara con el cubo02 y el cubo02 con el cubo01
- En el Logic Editor del cubo01 añadimos dos sensores “Always” y “Mouse” y un
controlador python tal y como se muestra en la figura 19. (Hemos abierto una
ventana Text Editor y creado un documento movimiento.
Figura 19
Thomas Manrubia y Elena Burdiel
11
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013
Ahora pegaremos el siguiente código comentado en“movimiento.py”
import bge
from bge import render as R
cont = bge.logic.getCurrentController() #Se importa el controlador
cubo01 = cont.owner
scene = bge.logic.getCurrentScene ()
cubo02 = scene.objects['cubo02'] #Se importan los objetos de la escena que van a
ser movidos por el raton
raton = cont.sensors['Mouse'] #Se importa el sensor del raton
R.showMouse(False) #Se escoge si se muestra el raton o no
cz= R.getWindowWidth()//2 # Se obtiene el centro de la pantalla
cy= R.getWindowHeight()//2
lat = 0.7 # latencia del movimiento 0: no latencia. 0.99: mucha latencia
s = 0.5 #sensibilidad del raton 0.0 a 1.0 recomendado
if 'rz' not in cubo01:
cubo01['rz']=0.0 #Se inicializan a 0 los movimientos de las rotaciones de los
ejes Z e Y
cubo01['ry']=0.0
R.setMousePosition(cz,cy) #Se inicializa la posicion del raton en el centro de la
pantalla
else:
rz= raton.position[0] #Se separa la posicion del raton en variables rz y ry
ry= raton.position[1]
dz= (cz-rz) #se calcula cuantos pixeles se ha movido el raton
horizontalmente (respecto al centro de la pantalla)
dy= (cy-ry) #se calcula cuantos pixeles se ha movido el raton
verticalmente (respecto al centro de la pantalla)
Thomas Manrubia y Elena Burdiel
12
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013
cubo01['rz']= cubo01['rz']*lat + dz*(1.0-lat) #Se ajusta la latencia
del movimiento del raton
cubo01['ry']= cubo01['ry']*lat + dy*(1.0-lat)
rz = cubo01['rz']*(s/400) #Se ajusta la cuantia del movimiento =
la sensibilidad del raton
ry = cubo01['ry']*(s/400)
cubo01.applyRotation([0,0,rz],True) #se aplica la rotacion al eje Z del cubo01
cubo02.applyRotation([0,ry,0],True) #se aplica la rotacion al eje Z del cubo02
R.setMousePosition(cz,cy) #Se centra el raton para que la fuerza
aplicada varie en funcion del movimiento del raton y evitar que el objeto se
mueva constantemente
#Accedemos al teclado como hemos visto anteriormente para
avanzar retroceder o moverse lateralmente
if bge.logic.KX_INPUT_ACTIVE ==
bge.logic.keyboard.events[bge.events.WKEY]:
cubo01.applyMovement ((-0.1,0,0), True)
if bge.logic.KX_INPUT_ACTIVE ==
bge.logic.keyboard.events[bge.events.SKEY]:
cubo01.applyMovement ((0.1,0,0), True)
if bge.logic.KX_INPUT_ACTIVE ==
bge.logic.keyboard.events[bge.events.AKEY]:
cubo01.applyMovement ((0,-0.1,0), True)
Thomas Manrubia y Elena Burdiel
13
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013
if bge.logic.KX_INPUT_ACTIVE ==
bge.logic.keyboard.events[bge.events.DKEY]:
cubo01.applyMovement ((0,0.1,0), True)
Se adjunta un archivo “movimiento.blend” en el que se puede observar
el funcionamiento de la cámara.
Cómo generar un efecto de humo en disparos:
Se dispone previamente de una imagen “humo”, creada mediante el programa
photoshop con la herramienta pincel.
Para la creación del humo en el juego, cada vez que se dispara se ejecutan estas líneas en
python.
while i <= cantidadHumo : #(1)
humo = scene.addObject("humo", "BulletSpawn" , vidaHumo*i) #(2)
humo.applyForce((0,(-1)**i*efectoHumo/i,200),True) #(3)
i +=1 #(4)
La primera variable “cantidadHumo” representa el número de veces que se quiere crear
la imagen de humo con transparencia, en el juego se han probado valores entre 30 y 70 y
el juego no se ralentizaba sustancialmente, poner unos valores más altos sí que ralentiza
de manera más notable el juego.
En la segunda línea (2) se crea la imagen humo en un objeto “Empty” con
scene.addObject.
scene.addObject(objeto a añadir, objeto que añade a la escena , tiempo de vida)
Este objeto se suele poner en la boca del arma que dispara. La variable “vidaHumo”
representa el tiempo que va a permanecer en la pantalla el objeto creado, en el juego se
han empleado valores en torno a 5.En esta sentencia se observa que a medida que “i”
aumenta la vida de las imágenes creadas aumenta, esto provoca que las imágenes más
alejadas del proyectil desaparecen más tarde y las que están justo en la boca del arma
desparecen antes.
La tercera línea se encarga de desplazar las imágenes creadas hacia delante del arma y
hacia detrás, en caso de que detrás del arma se sitúe una cámara dará la sensación más o
menos lograda de humo/niebla. Se emplea:
Thomas Manrubia y Elena Burdiel
14
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013
applyForce(fuerza en el eje X, fuerza en el eje Y, fuerza en el eje Z),relativa a la
orientación del objeto (1)o del entorno (0))
La variable “efectoHumo” está multiplicada por
, eso provoca que según la
orientación del objeto, las imágenes vayan alternativamente hacia adelante y hacia atrás.
A continuación se divide por “i” para que las imágenes no se sitúen todas en un mismo
punto, sino que estén repartidas a lo largo del eje empleado. En este caso el humo tenía
que ir en el eje Y, por ese motivo se ha puesto en la segunda posición del vector de
fuerza.
En el juego la variable “efectoHumo” tenía un valor de 3000
En la cuarta línea se incrementa i para que vaya aumentando cuando se ejecuta el bucle
while. Previamente se inicializa a 1.
Existe otra variante para generar una explosión de humo cuando muere un enemigo.
while i <= cantidadHumo: #(1)
humo = scene.addObject("humo2", torreta , vidaHumo*i) #(2)
humo.applyForce((0,0,efectoHumo/i),True) #(3)
i +=1 #(4)
En este caso en la línea 2 se observa que se ha empleado otra imagen humo2, que se ha
escalado para que sea más grande y englobe al objeto destruido torreta.
En la linea (3) la aplicación de la fuerza solo se ha realizado en una dirección del eje Z. Los
valores de las variables empleados son los siguientes:
cantidadHumo = 20 ; efectoHumo = 5000 ; vidaHumo = 3
Cómo crear la inteligencia artificial de las torretas:
De manera simplificada se comenta el código empleado para crear la inteligencia de las
torretas sin utilizar un actuador en el logic editor.
1) Localización del jugador:
Para que la torreta apunte constantemente a jugador la torreta obtiene primero su
posición y la posición del jugador, seguidamente calcula la posición relativa entre jugador
y torreta y la distancia relativa entre jugador-torreta que se empleará para determinar
cuánto impulso hay que aplicar al proyectil para que alcance al jugador.
Para finalizar se aplica a la rotación de la torreta las posiciones relativas entre jugador y
Thomas Manrubia y Elena Burdiel
15
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013
torreta:
jX=jugador.position[0] #Se obtiene la posicion global del jugador en variables locales
jY=jugador.position[1]
tX=torreta.position[0] #Se obtiene la posicion global de la torreta en variables locales
tY=torreta.position[1]
dx=jX-tX # Se obtiene la posicion relativa entre jugador y torreta
dy=jY-tY
d=(dx**2+dy**2)**0.5 #Se calcula la distancia entre jugador y torreta
tRotacion= torreta.orientation #Se obtiene la rotacion de la torreta en una variable
dxn=dx/d #Se normalizan las posiciones relativas en funcion de la distancia entre
jugador y torreta
dyn=dy/d
tRotacion[0] = (dyn, dxn, 0) #Se establece la rotación de la torreta para alcanzar el
objetivo parado
tRotacion[1] = (-dxn, dyn, 0)
tRotacion[2] = (0, 0, 1)
Nota: los signos asociados a “dyn” y “dxn” pueden variar según la orientación del objeto.
2) Disparo de la torreta:
Para determinar cuando la torreta dispara se emplea un sensor Random, se utilizan los
parámetros “frequency” y “Seed” que establecen una frecuencia de disparo y un grado
de aleatoriedad.
La torreta dispara cuando el enemigo a entrado en un radio previamente fijado (se
utiliza la distancia entre jugador y torreta calculada previamente) y cuando el sensor
Random se ha activado.
Thomas Manrubia y Elena Burdiel
16
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013
En el juego se ha mejorado un poco la inteligencia de manera que si el jugador dispara, la
torreta dispare tras un determinado tiempo y así pueda desviar el proyectil, para ello
cada vez que el jugador dispara se activa un contador que se envía al script que maneja a
la torreta.
Para que se envíe el contador a otro script diferente y contar con unidades de tiempo se
puede emplear la siguiente sentencia en el script del jugador:
bge.logic.globalDict['timer'] += 1.0 / bge.logic.getLogicTicRate()
La segunda parte del script de la torreta es la siguiente:
timer = bge.logic.globalDict['timer']
Disparo = cont.sensors["frecuenciaDisparo"]
if (d>torreta['r1'] and d<torreta['r2']): #Establece el rango de deteccion del radar
if fDisparo.positive or (timer >= 0.5 and timer <= 0.51): #dispara un proyectil según
la frecuencia de disparo aleatoria establecida o tras un retardo si el jugador a disparado
previamente
proyectil = scene.addObject("bullet", BulletSpawn , 150)
proyectil.applyForce((0, bulletSpeed,inclinacion),True)#a
Los valores de las variables son las siguientes:
bulletSpeed = d*33 ; inclinacion = 3.0*d
Se observa como tanto la inclinación “inclinacion “y la velocidad del proyectil
“bulletSpeed” dependen de la distancia entre jugador y torreta
3) Movimiento del enemigo:
Para que el enemigo se mueva, se puede añadir en el logic editor, un actuador Steering,
conectado directamente a un sensor always y un controlador And.
La torreta entonces se emparentaría con el objeto que tiene el actuador Steering
En el juego como la torreta estaba si
No es necesario realizar grandes modificaciones al script anterior dado que el enemigo ya
dispara con los paramentos escogidos anteriormente. Se tienen que modificar la
inclinación “inclinación” y la velocidad del proyectil “bulletSpeed” y el método de aplicar
el impulso. En el juego se ha empleado:
Thomas Manrubia y Elena Burdiel
17
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013
proyectil.setLinearVelocity((0, d,5.2),True) #(en el lugar de la sentencia #a)
Si la opción “facing” está activada se podría prescindir de la parte encargada de calcular
la orientación y utilizar solo la que calcula la distancia y la que realiza el disparo según las
condiciones establecidas.
Problemas con Blender:
Durante el desarrollo del videojuego han ocurrido números problemas. Estos se deben en
parte porque no se habían finalizado las escenas que estaban en modo overlay antes de
cambiar a otra escena distinta. Se tiene que tener mucho cuidado en el manejo de las
escenas en modo overlay y en general en el cambio de escenas. Si se utilizan variables
accesibles mediante varios scripts utilizando: bge.logic.globalDict['variable'] hay que
asegurarse que la variable esté definida antes de acceder de una escena a otra, sino
puede cerrarse el programa inesperadamente en el cambio de escena. En caso de que el
script esté realizando un cálculo y se cambie de escena también durante ese cambio se
puede cerrar inesperadamente. Conviene emplear condiciones para asegurarse que el
cambio de escena no interrumpa un proceso y se genere inestabilidad.
En muchos casos se había finalizado el código y verificado que funcionaba mediante la
tecla “P” pero al generar el ejecutable el programa se volvía inestable y cerraba, pienso
que es muy recomendable dividir la creación del juego en distintas partes que acumulan
mejorar y cada versión guardarla en un archivo .blend, y verificar que funciona bien
generando un ejecutable, probándolo varias veces y en ordenadores distintos. Esto evita
frustrarse y poder localizar más fácilmente de donde proviene el error. (Es muy difícil
averiguar el problema si se han implementado varias mejoras y están todas juntas)
Hay otros problemas que no he podido resolver y que me han obligado a tener que dejar
de implementar mejoras (proyectiles que se parten en trozos y que se hunden) porque al
juntar todas las mejoras creando el ejecutable se bloqueaba o funcionaba de manera
muy inestable. (a veces si que funcionaba y a veces no)
En varias ocasiones si no se modificaba un archivo archivo1.blend y lo volvía a guardar en
un archivo2.blend, y se creaban los ejecutables de las versiones archivo1.blend y
archivo2.blend. El ejecutable del archivo1.blend si funcionaba correctamente y el del
archivo2.blend no se podía jugar, funcionaba hasta el menú pero al dar al botón jugar sí
que funcionaba.
En otras ocasiones al ejecutar el ejecutable una vez funcionaba y al quererlo ejecutar otra
no funcionaba. También me ocurrió lo mismo al probarlo en ordenadores distintos.
Thomas Manrubia y Elena Burdiel
18
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013
A veces programar en blender puede ser desesperante por la falta de un modo de
depuración. Muchos errores pueden verse en “Toogle Version Console” en la versión
2.63 está en el apartado Help, pero aunque no haya errores en esa ventana, el juego
puede cerrarse y no se puede saber por qué.
TRUCOS
Se obtienen diez puntos de vida cada vez que se pulsa la tecla “v”.
Se puede ganar el juego pulsando la tecla “g”
Thomas Manrubia y Elena Burdiel
19
Descargar