PROYECTO SAI - BATALLA NAVAL - COMPONENTES

Página creada Leandro Canuto
 
SEGUIR LEYENDO
PROYECTO SAI - BATALLA NAVAL - COMPONENTES
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
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
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
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                                             Figura 3

Thomas Manrubia y Elena Burdiel
                                                                                      4
PROYECTO SAI - BATALLA NAVAL - COMPONENTES
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
PROYECTO SAI –BATALLA NAVAL -COMPONENTES 2013

                     Figura 8                               Figura 9

                   Figura 10                               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
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
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
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
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
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
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= 0.5 and timer
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
También puede leer