PROYECTO SAI - BATALLA NAVAL - COMPONENTES
←
→
Transcripción del contenido de la página
Si su navegador no muestra la página correctamente, lea el contenido de la página a continuación
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 Figura 3 Thomas Manrubia y Elena Burdiel 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 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 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
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