Air Warriors Documentation
Air Warriors Documentation
Air Warriors Documentation
Descriptores
iii
Índice de contenido
1. INTRODUCCIÓN ................................................................................................................ 1
3. INVESTIGACIÓN TECNOLÓGICA................................................................................... 17
3.1 INTRODUCCIÓN................................................................................................................17
3.2 PSP ......................................................................................................................................17
3.2.1 Características técnicas .................................................................................... 18
3.2.2 Escena .................................................................................................................. 20
3.3 LTE GE .................................................................................................................................21
3.3.1 Sistema de coordenadas................................................................................... 22
3.3.2 Estructura del motor............................................................................................ 23
3.3.3 Clase IUnknown ................................................................................................... 24
3.3.4 Grafo de escena................................................................................................. 25
3.3.5 Temporizador ....................................................................................................... 25
3.3.6 Animadores.......................................................................................................... 25
3.3.7 Cámaras............................................................................................................... 26
3.3.8 Octree .................................................................................................................. 27
3.3.9 Eventos ................................................................................................................. 27
3.3.10 Efectos especiales .............................................................................................. 27
3.3.11 Colisiones.............................................................................................................. 30
3.3.12 Terreno irregular................................................................................................... 31
v
3.3.13 Skybox ................................................................................................................... 32
3.3.14 Sombras ................................................................................................................ 33
3.4 HERRAMIENTAS Y TUTORIALES ........................................................................................ 33
3.4.1 Programación ...................................................................................................... 33
3.4.1.1 Cómo ejecutar hombrew en la PSP ...............................................................................33
3.4.1.2 PSPLINK .................................................................................................................................36
3.4.1.3 iR Shell...................................................................................................................................39
3.4.1.4 Cómo instalar LTE GE en sistemas Win32 .......................................................................40
3.4.1.5 Cómo compilar una aplicación creada con LTE GE usando Microsoft Visual C++
2005 Express Edition ...........................................................................................................41
3.4.1.6 Cómo preparar una aplicación de prueba con LTE GE ............................................44
3.4.1.7 Resolución de problemas de programación ...............................................................48
3.4.2 Modelado ............................................................................................................ 50
3.4.2.1 MilkShape 3D ......................................................................................................................51
3.4.2.2 Cómo corregir la posición y el desplazamiento en los archivos SMD .....................53
3.4.2.3 Q3Radiant ...........................................................................................................................54
3.4.2.4 WAD2BMP............................................................................................................................57
3.4.3 Comunicaciones ................................................................................................. 57
3.4.3.1 Modo ad-hoc. ....................................................................................................................59
3.4.3.2 Modo infraestructura.........................................................................................................59
vi
5.3.1.1 Clase State ..........................................................................................................................75
5.3.1.2 Clase StateMachine ..........................................................................................................75
5.3.2 Clases base elementales ................................................................................... 76
5.3.2.1 Clase Object3D ..................................................................................................................76
5.3.2.2 Clase GameObject3D ......................................................................................................76
5.3.3 Elementos del menú ........................................................................................... 76
5.3.3.1 Clase SelectionBallMenu ..................................................................................................76
5.3.3.2 Clases SelectionBall y LightingSelectionBall ..................................................................77
5.3.3.3 Clases LightingBillboard y FlyCircleLightingBillboard ...................................................77
5.3.3.4 Clase TexturedBox..............................................................................................................77
5.3.4 Comportamientos............................................................................................... 77
5.3.4.1 Clase Behaviour..................................................................................................................77
5.3.4.2 Clases ObjectBehaviour, GameBehaviour y PlayerSpaceshipBehaviour ...............77
5.3.4.3 Clase NormalFireBehaviour ..............................................................................................78
5.3.4.4 Clase TurningBehaviour.....................................................................................................78
5.3.4.5 Clase LateralTranslationBehaviour ..................................................................................78
5.3.4.6 Clase FitToGameAreaBehaviour .....................................................................................78
5.3.4.7 Clases ActivatingBehaviour y MoveAfterActivatingBehaviour .................................78
5.3.4.8 Clase PursuitBehaviour ......................................................................................................79
5.3.4.9 Clase TiltingBehaviour........................................................................................................79
5.3.4.10 Clase DeceleratingBehaviour......................................................................................79
5.3.4.11 Clases ChangeFactionBehaviour y ColouredChangeFactionBehaviour ...........79
5.3.5 Juego.................................................................................................................... 79
5.3.5.1 Clase Game ........................................................................................................................79
5.3.5.2 Clase CollisionFaction .......................................................................................................80
5.3.5.3 Clase CollisionController ...................................................................................................80
5.3.5.4 Clases CollisionManager, ArcadeCollisionManager y AdventureCollisionManager....80
5.3.5.5 Clases GameHUD y ArcadeGameHUD .........................................................................80
5.3.6 Juego arcade y aventura ................................................................................. 81
5.3.6.1 Clases ArcadeGame y AdventureGame .....................................................................81
5.3.6.2 Clase EnemySpaceshipGenerator..................................................................................81
5.3.6.3 Clases ArcadeGameBackground, TerrainGenerator y FlyingCamera ....................81
5.3.7 Naves (modo arcade) ....................................................................................... 81
5.3.7.1 Clase Spaceship.................................................................................................................81
5.3.7.2 Clase PlayerSpaceship......................................................................................................81
5.3.7.3 Clases EnemySpaceship, PursuitEnemySpaceship, TurningEnemySpaceship y
LateralEnemySpaceship ...................................................................................................82
5.3.7.4 Clases Tail y EnemySpaceshipTail....................................................................................82
5.3.8 Armamento y disparos (modo arcade)........................................................... 82
5.3.8.1 Clase Weapons ..................................................................................................................82
5.3.8.2 Clases LinearCanon y LockingCanon ............................................................................82
5.3.8.3 Clases DartSingleCanon, DartDualCanon, DartTripleCanon y DartLockingCanon......83
5.3.8.4 Clases W01SingleCanon, W01DoubleCanon y W01TripleCanon..............................83
5.3.8.5 Clases Shot y PursuitShot ...................................................................................................83
vii
5.3.9 Items, explosiones (modo arcade) y portales (modo aventura).................. 83
5.3.9.1 Clase Item ...........................................................................................................................83
5.3.9.2 Clases ExtraShieldsItem, DualCanonItem y TripleCanonItem ....................................83
5.3.9.3 Clase ExplosionBillboard ...................................................................................................83
5.3.9.4 Clase PortalBillboard .........................................................................................................84
5.3.10 Gestión de eventos (modo arcade) ................................................................ 84
5.3.10.1 Clase ArcadeGameEventController..........................................................................84
5.3.10.2 Clase ArcadeGameEvent............................................................................................84
5.3.10.3 Clases ArcadeGameFireForgetEvent y ArcadeGameContinuousEvent ............84
5.3.10.4 Clase CreationArcadeGameEvent............................................................................84
5.3.10.5 Clase MissionCompletedArcadeGameEvent ..........................................................85
5.3.10.6 Clase RadioArcadeGameEvent .................................................................................85
5.3.11 Gestión del motor y de los eventos de la entrada y del GUI ........................ 85
5.3.11.1 Clases EngineController y MyEventReceiver ............................................................85
5.3.11.2 Clase EventController....................................................................................................85
5.3.11.3 Clase EventValue...........................................................................................................86
5.3.11.4 Clases InputEventValue y GUIEventValue ................................................................86
5.3.12 Personajes (modo aventura) ............................................................................. 86
5.3.12.1 Clase AdventureGuy.....................................................................................................86
5.3.12.2 Clases PlayerControlledGuy y TalkingGuy ................................................................86
5.3.13 Observer ............................................................................................................... 86
5.3.13.1 Clase Observable ..........................................................................................................86
5.3.13.2 Clases Observer y DeleteObserver.............................................................................87
5.3.14 Otras clases auxiliares ......................................................................................... 87
5.3.14.1 Clase MessageWindow ................................................................................................87
5.3.14.2 Clase LoadingScreen....................................................................................................87
5.3.14.3 Clase TimeController .....................................................................................................87
5.3.14.4 Clase GameUtils.............................................................................................................87
5.3.14.5 Clases SoundController y SoundFader.......................................................................87
5.3.14.6 Clase StoryTeller .............................................................................................................88
5.3.14.7 Clase GameParameters...............................................................................................88
5.3.14.8 Clase FilePaths................................................................................................................88
5.4 DISEÑO PRELIMINAR DEL MODO MULTIJUGADOR...................................................... 88
5.4.1 Limitaciones de LTE GE ....................................................................................... 88
5.4.2 Modo multijugador ............................................................................................. 89
viii
6.3.5 Flujo de ejecución............................................................................................. 106
6.3.6 Gestor de colisiones.......................................................................................... 106
6.4 MODO AVENTURA..........................................................................................................107
6.4.1 Escenario............................................................................................................ 107
6.4.2 Flujo de ejecución............................................................................................. 108
6.4.3 Gestor de colisiones.......................................................................................... 108
7.1 INTRODUCCIÓN..............................................................................................................109
7.2 OBJETIVOS .......................................................................................................................109
7.3 DEFINICIÓN DE LA ESTRATEGIA DE PRUEBA................................................................109
7.4 CRITERIOS DE ACEPTACIÓN .........................................................................................110
7.5 RESULTADOS ....................................................................................................................110
7.5.1 Primera fase ....................................................................................................... 110
7.5.2 Segunda fase .................................................................................................... 112
7.5.3 Tercera fase ....................................................................................................... 113
8.1 INTRODUCCIÓN..............................................................................................................115
8.2 REQUERIMIENTOS TÉCNICOS ........................................................................................115
8.3 INSTALACIÓN Y EJECUCIÓN.........................................................................................115
8.4 MENÚ PRINCIPAL ............................................................................................................115
8.4.1 Menú del modo individual............................................................................... 116
8.4.2 Menú del modo multijugador ......................................................................... 117
8.4.3 Menú de opciones............................................................................................ 118
8.4.3.1 Opciones de sonido ........................................................................................................118
8.4.3.2 Opciones de control........................................................................................................119
8.4.4 Menú de servicios en línea .............................................................................. 120
8.5 MODO INDIVIDUAL ........................................................................................................120
8.5.1 Historia ................................................................................................................ 120
8.5.2 Personajes .......................................................................................................... 122
8.5.3 Naves .................................................................................................................. 122
8.5.4 Ítems.................................................................................................................... 124
8.5.5 Nuevo juego ...................................................................................................... 126
8.5.5.1 Modo arcade ...................................................................................................................127
8.5.5.2 Modo aventura ................................................................................................................128
8.6 ERRORES CONOCIDOS .................................................................................................130
ix
Índice de figuras
FIGURA 2.1. ORGANIGRAMA PARA EL DESARROLLO DE UN VIDEOJUEGO. ................................................. 8
FIGURA 2.2. DIAGRAMA GANTT DE LAS FASES GENERALES DEL PROYECTO. .............................................. 14
FIGURA 3.1. VISTA FRONTAL Y POSTERIOR DE LA VIDEOCONSOLA PORTÁTIL PSP. ...................................... 17
FIGURA 3.2. SISTEMA DE COORDENADAS DE LTE GE (MANO IZQUIERDA). ............................................... 23
FIGURA 3.3. CONEXIÓN EN MODO AD-HOC.......................................................................................... 58
FIGURA 3.4. CONEXÍON EN MODO INFRAESTRUCTURA. ........................................................................... 58
FIGURA 5.1. DIAGRAMA DE ESTADOS GENERAL...................................................................................... 72
FIGURA 5.2. DIAGRAMA DE ESTADOS DEL ESTADO ADVENTUREGAME. .................................................... 73
FIGURA 5.3. DIAGRAMA DE ESTADOS DEL ESTADO ARCADEGAME.......................................................... 73
FIGURA 5.4. INTERCAMBIO DE MENSAJES DEL MODO MULTIJUGADOR. ..................................................... 89
FIGURA 5.5. DIAGRAMA DE CLASES: MODO MULTIJUGADOR. ................................................................. 90
FIGURA 5.6. DIAGRAMA DE CLASES: ESTADOS Y MÁQUINA DE ESTADOS................................................... 91
FIGURA 5.7. DIAGRAMA DE ESTADOS: ELEMENTOS DEL MENÚ. ................................................................. 92
FIGURA 5.8. DIAGRAMA DE CLASES: COMPORTAMIENTOS. ..................................................................... 93
FIGURA 5.9. DIAGRAMA DE CLASES: JUEGO. ......................................................................................... 94
FIGURA 5.10. DIAGRAMA DE CLASES: JUEGO ARCADE Y AVENTURA ........................................................ 95
FIGURA 5.11. DIAGRAMA DE CLASES: NAVES (MODO ARCADE). ............................................................ 96
FIGURA 5.12. DIAGRAMA DE ESTADOS: ARMAMENTO Y DISPAROS (MODO ARCADE). .............................. 97
FIGURA 5.13. DIAGRAMA DE CLASES: ÍTEMS, EXPLOSIONES (MODO ARCADE) Y PORTALES (MODO
AVETNTURA).................................................................................................................................. 98
FIGURA 5.14. DIAGRAMA DE CLASES: CLASES BASE ELEMENTALES............................................................ 98
FIGURA 5.15. DIAGRAMA DE CLASES: GESTIÓN DE EVENTOS (MODO ARCADE). ....................................... 99
FIGURA 5.16. DIAGRAMA DE CLASES: GESTIÓN DE EVENTOS DE LA ENTRADA Y DEL GUI. .......................... 99
FIGURA 5.17. DIAGRAMA DE CLASES: PERSONAJES (MODO AVENTURA) Y OBSERVER. ............................ 100
FIGURA 5.18. DIAGRAMA DE CLASES: OTRAS CLASES AUXILIARES........................................................... 100
FIGURA 6.1. BUCLE DE EJECUCIÓN DEL VIDEOJUEGO. .......................................................................... 101
FIGURA 6.2. DISPOSICIÓN DEL ESCENARIO, CÁMARA Y ÁREA DE JUEGO................................................ 102
FIGURA 6.3. UMBRAL DE CREACIÓN. ................................................................................................... 103
FIGURA 6.4. MOVIMIENTO DE LA NAVE DEL JUGADOR. ......................................................................... 103
FIGURA 6.5. EVOLUCIÓN DEL ESCENARIO Y LA CÁMARA....................................................................... 104
FIGURA 6.6. MAPAS DE ALTURAS. ........................................................................................................ 105
FIGURA 6.7. FLUJO DE EJECUCIÓN DEL MODO ARCADE........................................................................ 106
FIGURA 6.8. FLUJO DE EJECUCIÓN DEL MODO AVENTURA..................................................................... 108
FIGURA 8.1. MENÚ PRINCIPAL. ............................................................................................................ 116
FIGURA 8.2. MENÚ DEL MODO INDIVIDUAL. ......................................................................................... 116
FIGURA 8.3. MENÚ DEL MODO MULTIJUGADOR.................................................................................... 117
FIGURA 8.4. MENÚ DE OPCIONES........................................................................................................ 118
FIGURA 8.5. OPCIONES DE SONIDO..................................................................................................... 118
FIGURA 8.6. OPCIONES DE CONTROL. ................................................................................................. 119
FIGURA 8.7. MENÚ DE SERVICIOS EN LÍNEA........................................................................................... 120
FIGURA 8.8. VISTA EXTERIOR DEL W-01................................................................................................ 123
FIGURA 8.9. VISTA EXTERIOR DEL DARDO.............................................................................................. 123
FIGURA 8.10. VISTA EXTERIOR DEL DOBLE DARDO. ................................................................................ 123
x
FIGURA 8.11. VISTA EXTERIOR DEL DARDO AVANZADO. ........................................................................124
FIGURA 8.12. VISTA EXTERIOR DEL SEMBRADOR DE MUERTE....................................................................124
FIGURA 8.13. VISTA EXTERIOR DEL ÍTEM DE DISPARO DOBLE....................................................................125
FIGURA 8.14. VISTA EXTERIOR DEL ÍTEM DE DISPARO TRIPLE.....................................................................125
FIGURA 8.15. VISTA EXTERIOR DEL ÍTEM DE NIVEL DE ESCUDOS EXTRA......................................................125
FIGURA 8.16. IMAGEN INICIAL DE LA INTRODUCCIÓN DEL JUEGO. .........................................................126
FIGURA 8.17. PANTALLA DE SELECCIÓN DEL MODO DE JUEGO..............................................................126
FIGURA 8.18. PANTALLA DE CARGA DEL MODO ARCADE......................................................................127
FIGURA 8.19. TRANSMISIÓN DE RADIO DEL MODO ARCADE...................................................................127
FIGURA 8.20. ELEMENTOS DEL JUEGO DEL MODO ARCADE. ..................................................................128
FIGURA 8.21. PORTALES Y HUD DEL MODO AVENTURA.........................................................................129
FIGURA 8.22. PERSONAJES DEL MODO AVENTURA. ...............................................................................129
FIGURA 8.23. MENSAJE INTERACCIÓN DEL MODO AVENTURA. ..............................................................130
Índice de tablas
TABLA 2.1. ESTIMACIÓN GLOBAL DE CARGAS.........................................................................................12
TABLA 2.2. ESTIMACIÓN DETALLADA DE CARGAS ....................................................................................13
TABLA 2.3. REPARTO DE CARGAS POR PERFIL..........................................................................................14
TABLA 2.4. PLAN DE TRABAJO................................................................................................................15
TABLA 3.1. COMANDOS BÁSICOS DE PSPLINK. .....................................................................................38
TABLA 6.1. RELACIÓN DE FACCIONES Y COLISIONES DEL MODO ARCADE...............................................107
TABLA 7.1. RESULTADOS DE LAS PRUEBAS DE UNIDAD DE LA PRIMERA FASE. .............................................112
TABLA 7.2. RESULTADOS DE LAS PRUEBAS DE UNIDAD DE LA SEGUNDA FASE. ...........................................113
TABLA 7.3. RESULTADOS DE LAS PRUEBAS DE LA TERCERA FASE. ..............................................................114
Índice de código
CÓDIGO 3.1. EXTRACTO DE CÓDIGO DEL EJEMPLO 04.MOVEMENT. INVOCACIÓN DEL MÉTODO DROP()
DESPUÉS DE ASIGNAR EL OBJETO ELIMINADO A UN NODO DE ESCENA................................................24
CÓDIGO 3.2. EXTRACTO DE CÓDIGO DEL EJEMPLO 08.SPECIALFX. CÓMO AÑADIR UN EFECTO DE AGUA.
....................................................................................................................................................28
CÓDIGO 3.3. EXTRACTO DE CÓDIGO DEL EJEMPLO 08.SPECIALFX. CÓMO CREAR UN SISTEMA DE
PARTÍCULAS QUE SIMULA EL FUEGO. ................................................................................................29
CÓDIGO 3.4. EXTRACTO DE CÓDIGO DEL EJEMPLO 10.RENDERTOTEXTURE. CÓMO CREAR LA TEXTURA DE
RENDERIZADO................................................................................................................................30
CÓDIGO 3.5. EXTRACTO DE CÓDIGO DEL EJEMPLO 10.RENDERTOTEXTURE. CÓMO CAMBIAR EL OBJETIVO
DE RENDERIZADO...........................................................................................................................30
CÓDIGO 3.6. ASIGNACIÓN DE UN SELECTOR DE TRIÁNGULOS A UN NODO DE ESCENA.............................31
CODIGO 3.7. EXTRACTO DE CÓDIGO DEL EJEMPLO 09.TERRAINRENDERING. CÓMO CREAR UN TERRENO
IRREGULAR. ...................................................................................................................................32
CÓDIGO 3.8. EXTRACTO DE CÓDIGO DEL EJEMPLO 09.TERRAINRENDERING. CÓMO CREAR UNA SKYBOX.32
CÓDIGO 3.9. CONFIGURACIÓN DEL ARCHIVO PSPLINK.INI PARA HACER USO DE LA CONEXIÓN USB HOSTFS.
....................................................................................................................................................37
CÓDIGO 3.10. LÍNEA DE CÓDIGO EN EL BUILD.MAK QUE ELIMINA EL ARCHIVO ELF STRIPPED.....................38
CÓDIGO 3.11. CÓMO GENERAR MANUALMENTE EL ARCHIVO ELF STRIPPED............................................38
xi
CÓDIGO 3.12. CONTENIDO DE UN ARCHIVO MAKEFILE GENÉRICO PARA LTE GE.................................... 41
CÓDIGO 3.13. CONTENIDO DEL ARCHIVO CLEAN.BAT........................................................................... 43
CÓDIGO 3.14. CONTENIDO DEL ARCHIVO REBUILD.BAT. ........................................................................ 43
CÓDIGO 3.15. APLICACIÓN DE PRUEBA (BAREBONES) PARA UTILIZAR LTE GE......................................... 48
CÓDIGO 3.16. SOLUCIÓN AL CONFLICTO DE NOMBRES DENTRO DE WCHAR.H. ....................................... 49
CÓDIGO 3.17. ARCHIVO MD2.QC DE EJEMPLO. ................................................................................... 53
CÓDIGO 3.18. EXTRACTO DE UN ARCHIVO SMD DE EJEMPLO. .............................................................. 54
CÓDIGO 3.19. EXTRACTO DE CÓDIGO DEL EJEMPLO 02.QUAKE3MAP. CÓMO AÑADIR UN ARCHIVO .PK3
AL SISTEMA DE FICHEROS DE LTE GE............................................................................................... 57
CÓDIGO 3.20. ARGUMENTOS DE WAD2BMP......................................................................................... 57
xii
INTRODUCCIÓN
1. INTRODUCCIÓN
En este capítulo se ofrece una visión general del contenido de la presente memoria. Los
diferentes capítulos de los que ésta consta son:
2. Objetivos del proyecto. Se describen los diferentes objetivos del proyecto, su alcance,
las tareas a desarrollar para realizarlos y la planificación temporal.
5. Especificación del diseño. Recoge las diferentes vistas del diseño del Proyecto.
7. Plan de pruebas. Recoge las pruebas realizadas para garantizar la calidad del código
obtenido tras las fases de análisis y diseño.
8. Manual del usuario. Documento que explica cómo hacer uso de la aplicación
desarrollada a nivel de usuario.
1
OBJETIVOS DEL PROYECTO
Muchos usuarios creativos comenzaron a preguntarse qué les podía ofrecer la PSP en
términos de desarrollo de software. Si bien existía un SDK oficial proporcionado por Sony, este
se encontraba reservado a las compañías privadas encargadas de la creación de contenidos
para la marca japonesa, y pronto la comunidad de usuarios comenzó a crear su propio SDK y
otras herramientas para poder programar sus aplicaciones.
Los videojuegos conforman sólo una parte de las múltiples aplicaciones que pueden ejecutarse
sobre una PSP, aunque frecuentemente son los más representativos en cuanto al empleo de
las diferentes tecnologías existentes (gráficos, sonido, comunicaciones…). La idea de este
proyecto surge del deseo de investigar y aprender acerca de la aplicación de dos tecnologías
concretas, como son gráficos 3D y WI-FI, al desarrollo de videojuegos, pero haciéndolo en un
entorno novedoso con posibilidades distintas a las que podría ofrecer, por ejemplo, un PC. A
esto hay que añadir la aspiración a aportar nuevos contenidos y conocimientos que puedan en
cierta manera ayudar a la creación de aplicaciones por parte de otros usuarios.
3
PROYECTO FIN DE CARRERA
Aunque la temática del videojuego aún está por concretar (trama, escenarios,
personajes, etc) como parte de las tareas de concepto y diseño preliminar, hay algunos
aspectos relativos al alcance que ya están definidos. El género escogido es el de los
videojuegos de acción, dado que es uno de los que mejor explota las tecnologías
planteadas anteriormente (gráficos 3D y WI-FI). Por un lado, permite disponer de un
entorno gráfico suficientemente elaborado con el que el jugador pueda interactuar y al
mismo tiempo no exige dedicar demasiado tiempo a otros elementos como pueden ser
el argumento o las reglas de juego. Por otro lado, permite introducir el apartado
multijugador de manera sencilla sobre el concepto inicial. El juego presentará por tanto
dos modos: el modo individual, que consistirá en uno o dos niveles por los que tendrá
que pasar el jugador para completar el juego, y el modo multijugador, donde se
aprovechará la capacidad WI-FI de la consola para que varios jugadores cooperen en
la resolución de los diferentes niveles.
Hay que comentar que otros aspectos del desarrollo como la música o los efectos
sonoros se limitarán a la búsqueda y utilización de material creado por terceros. Lo
mismo se aplica al modelado 3D de personajes y escenarios, pero teniendo en cuenta
que en este caso puede ser necesario crear nuevos contenidos que se adapten al
videojuego. De hecho, debido a la naturaleza académica del proyecto, el alcance es
mucho menor que el que pudiera tener un desarrollo comercial de las mismas
características.
En principio, no entra dentro del perímetro funcional del proyecto la programación de otro tipo
de aplicaciones para la PSP, como reproductores de contenidos multimedia o emuladores; a no
ser que sean factores determinantes para lograr el objetivo del proyecto. También hay que
aclarar que todo el trabajo de documentación se centra en el desarrollo de videojuegos y por
tanto, trata únicamente aquellos aspectos importantes en este tipo de aplicaciones.
4
OBJETIVOS DEL PROYECTO
• Diseño del sistema. Recoge en base al informe de requisitos las diferentes decisiones
de diseño tomadas para la realización del videojuego y que posteriormente guiarán su
implementación.
• Plan de pruebas del sistema. Especifica las diferentes actividades a realizar para
asegurar el correcto funcionamiento del videojuego una vez sea aprobado por el
director de proyecto.
El plan aplicado se basa en el método de desarrollo por fases, dividiendo la creación del
videojuego en dos etapas bien diferenciadas: diseño (preproducción) e implementación
(producción).
5
PROYECTO FIN DE CARRERA
Una vez que el equipo de diseño haya determinado el guión del juego en cuanto a temática,
mecánica, interacción y objetivos, se continuará con la búsqueda en Internet de las
herramientas y librerías necesarias para comenzar el proceso de programación. Mientras el
departamento de programación se encarga de implementar la lógica que haga realidad el
diseño generado, los departamentos de gráficos y sonido trabajarán simultáneamente para
integrar finalmente los resultados de los 3 departamentos en lo que será la versión alfa del
videojuego, todo ello procurando cumplir con los plazos de tiempo y coste establecidos.
1. Organización y control.
4. Diseño preliminar.
c. Jugabilidad. Las reglas de juego. Definición inicial de lo que podrán hacer los
usuarios mientras juegan y lo que no podrán hacer.
6
OBJETIVOS DEL PROYECTO
a. Motor gráfico. Utilización del motor gráfico escogido para crear los diferentes
módulos que facilitarán el trabajo con el entorno gráfico (sistema de cámaras,
generación de terrenos…).
a. Diseño de gráficos.
b. Desarrollo de sonido.
7
PROYECTO FIN DE CARRERA
9. Depuración de errores.
a. Pruebas. Tarea con las que se trata detectar los errores que se puedan
encontrar en la versión beta del juego, tales como fallos de jugabilidad, sonido,
gráficos, etc.
2.5 ORGANIZACIÓN
En este punto se debe precisar que aunque se hable en términos de departamentos y
diferentes perfiles, esto se hace exclusivamente para dotar al proyecto de una organización
teórica. En la práctica, las diferentes tareas y roles descritos se reparten entre los dos
miembros de equipo (autores de la presente memoria), por lo que se trata en todo caso de una
organización lógica.
DIRECCIÓN
8
OBJETIVOS DEL PROYECTO
• Pruebas. Verifican que el contenido y funcionalidad del juego son correctos y están
completos.
El equipo de trabajo constará de los siguientes perfiles relacionados con las diferentes áreas de
competencias que se abordan:
• Diseñador. Crea el diseño conceptual del videojuego (“¿a qué se juega?”) y establece
las diferentes reglas y mecánicas por las que se rige el juego.
• Tester. Comprueba que el videojuego hace lo que debe y que lo que hace es divertido.
9
PROYECTO FIN DE CARRERA
Los medios que se dispondrán para el desarrollo del videojuego serán los siguientes:
• Hardware.
o Al menos dos videoconsolas PSP con todos los accesorios precisos para
probar el videojuego durante su desarrollo, así como el apartado multijugador.
• Software.
o Librerías para el manejo de gráficos 3D, WI-FI y demás requisitos del juego en
la PSP (PSPSDK y LTE GE).
Existirá un director de proyecto que se encargará de tomar las decisiones que puedan afectar
al plazo de entrega de los productos o al coste del proyecto. También será el responsable de la
designación de los jefes de cada departamento, si bien se intentará que este proceso de
selección sea lo más natural posible. El director de proyecto supervisará semanalmente el
10
OBJETIVOS DEL PROYECTO
Los jefes de departamento deberán elaborar informes semanales para poner en conocimiento
del director de proyecto cualquier incidencia ocurrida en su departamento, indicando además el
trabajo realizado. Igualmente, cualquier decisión tomada por algún jefe de departamento que
pueda modificar el plan de trabajo no podrá ser ejecutada sin la previa aprobación del director
de proyecto.
La recepción y aceptación final del videojuego dependerá tanto del resultado de las pruebas
realizadas por el equipo de pruebas, como de la correspondiente comprobación final realizada
por el director de proyecto junto al resto de los jefes de departamento sobre el documento de
requisitos inicial. Sólo cuando el director de proyecto considere que el sistema presenta la
funcionalidad acordada, será declarado terminado. Para ello dispondrá de un plazo de 3 días,
pasado el cual el producto será rechazado automáticamente, requiriendo la correspondiente
entrega a los jefes de departamento de un informe con las funciones pendientes de finalización.
Todas las peticiones tomadas por alguno de los departamentos durante la ejecución del
proyecto, que impliquen cambios en las especificaciones, diseños o desarrollos ya realizados,
serán objeto del siguiente procedimiento: [1]
2.7 PLANIFICACIÓN
La estimación de cargas previstas para las diferentes actividades está representada en la tabla
2.1. Cada carga corresponde a un día de 2 horas de trabajo.
Actividad Carga
A1 Organización y control 68
11
PROYECTO FIN DE CARRERA
A2 Concepto 1
A3 Preproducción 14
A4 Producción 75
A5 Depuración de errores 8
TOTAL 166
A1 Organización y control 68
A1.1 Organización 3
A1.2 Control 65
A2 Concepto 1
A3 Preproducción 14
A3.1.2 Escenarios 1
A3.1.3 Jugabilidad 1
A4 Producción 75
12
OBJETIVOS DEL PROYECTO
A4.5.2 Doblaje 1
A4.5.3 Música 1
A4.6 Integración 3
A5 Depuración de errores 8
A5.1 Pruebas 3
A5.2 Corrección 5
Perfil Carga
Director de proyecto 68
Diseñador 4
13
PROYECTO FIN DE CARRERA
Programador 77
Diseñador gráfico 11
Técnico de sonido 3
Tester 3
TOTAL 166
A continuación se detalla el plan de trabajo estimado para la correcta realización del proyecto.
La figura 2.2 representa de manera aproximada el tiempo dedicado a las fases generales.
Cada una de estas (excepto la etapa de “Concepto”) se descompone en una serie de
subtareas. La tabla 2.4 recoge esta información de manera ordenada en lo que es el plan de
trabajo propiamente dicho.
Organización y control
Concepto
Preproducción
Producción
Depuración de errores
PLAN DE TRABAJO
14
OBJETIVOS DEL PROYECTO
personajes
Tecnologías de
A4.1.2 A4.1.1 Carlos 5 10 06/07/07 11/07/07
IA
Interfaz de
A4.1.3 A3.3 Jon 5 10 22/06/07 27/06/07
juego
Implementación
A4.1.2
A4.2 de la lógica de Jon, Carlos 19 38 12/07/07 02/08/07
A4.1.4
juego
Programación
A4.3 A4.5.3 Jon 5 10 07/08/07 11/08/07
del contenido
Modelado de
A4.4.1 A4.2 Carlos 6 12 03/08/07 09/08/07
personajes
Modelado de
A4.4.2 A4.4.1 Carlos 5 10 10/08/07 15/08/07
escenarios
Integración de A4.3
A4.6 Jon, Carlos 3 6 15/08/07 17/08/07
contenidos A4.4.2
A1.2
A5.1 Pruebas Jon, Carlos 3 6 18/08/07 21/08/07
A4.6
Corrección del
A5.2 A5.1 Jon, Carlos 5 10 21/08/07 25/08/07
código
15
INVESTIGACIÓN TECNOLÓGICA
3. INVESTIGACIÓN TECNOLÓGICA
3.1 INTRODUCCIÓN
En el presente capítulo, se realizará una presentación de una serie de tecnologías y
herramientas que han sido investigadas para la realización del proyecto. Únicamente se
destacan aquellas que se han considerado fundamentales para el desarrollo de un videojuego
sobre la PSP. Además, se incluye una descripción de la videoconsola y de sus características
técnicas. También se analizan las aplicaciones y librerías que pueden ser de ayuda para el
programador en forma de tutoriales.
3.2 PSP
La PSP es una videoconsola portátil desarrollada y distribuida por Sony Computer
Entertainment. Su lanzamiento fue anunciado por primera vez en la feria del E3 en el 2003,
siendo presentada oficialmente el 11 del Mayo del 2004 en una conferencia para la prensa. El
sistema comenzó a comercializarse en Japón el 12 de Diciembre del 2004. El 24 de Marzo del
siguiente año lo haría en Estados Unidos y Canadá. A Europa y Australia no llegaría hasta el 1
de Septiembre del 2005.
17
PROYECTO FIN DE CARRERA
• 2 MB de VRAM.
• Pantalla LCD ancha a color de 480 x 272 pixels (aproximadamente 1.8 : 1).
Además cuenta con los siguientes elementos hardware adicionales, que si bien no son
imprescindibles para el desarrollo de un videojuego, pueden ser igualmente aprovechados:
18
INVESTIGACIÓN TECNOLÓGICA
• Diseñado para ser manejado con un API sencillo, similar al de las librerías gráficas más
conocidas.
• Morphing y skinning.
El núcleo de la PSP no sigue una arquitectura estrictamente monolítica, sino que está formado
por un conjunto de módulos separados. Las aplicaciones de usuario se consideran igualmente
módulos. Estos pueden cargarse en memoria (en posiciones fijas o variables) y ejecutarse sin
restricciones. Además pueden exportar e importar funciones de otros módulos. El núcleo de la
19
PROYECTO FIN DE CARRERA
PSP no reconoce el concepto tradicional de proceso tal y como se entiende en otros sistemas
operativos.
La PSP utiliza el formato de los archivos ELF como base para sus módulos. El núcleo puede
cargar 3 tipos de ficheros de manera nativa:
• PRX. Formato ELF modificado. Puede ser ubicado en cualquier dirección de memoria.
• ˜PSP. Formato envoltorio cifrado tanto para archivos ELF como PRX.
3.2.2 Escena
Se entiende por escena a todo aquello que está relacionado con la personalización de un
producto. En este caso, la escena de la PSP engloba tanto software desarrollado por usuarios,
como modificaciones realizadas sobre el hardware. En Mayo del 2005 se descubrió que una
PSP con la versión firmware 1.00 podía ejecutar código que no había sido digitalmente firmado
por Sony. Esto suponía que cualquiera podía crear sus propias aplicaciones “caseras” (el
término utilizado en inglés es homebrew) y ejecutarlas sobre la PSP.
Para conseguirlo se utiliza una modificación de GNU GCC y GNU Binutils que permite compilar
código adaptado a la PSP (basada en un procesador MIPS). El compilador fue desarrollado a
partir de experiencia obtenida en un proyecto similar realizado sobre la PS2 y admite código
escrito en los lenguajes de programación C y C++. Está pensado para funcionar sobre
sistemas *nix, por lo que su uso en Windows requiere de Cygwin o MingW (DevkitPRO).
LibGU es fundamental para el desarrollo de gráficos acelerados por hardware para la PSP.
Permite controlar tanto el GE como el hardware de visualización. Además gestiona las listas de
visualización y el frame buffer. Por su parte, libGUM es una librería que permite la manipulación
de matrices y es utilizada directamente por libGU. Mantiene una pila de matrices similar a la de
otras librerías gráficas y proporciona la funcionalidad necesaria para calcular matrices de
proyección, rotar vectores, etc. LibGU y libGUM no son las únicas librerías creadas para la
visualización de gráficos en la PSP. Existen otros desarrollos importantes como:
• PSPGL. Una librería para el manejo de gráficos 3D acelerados por hardware que
mantiene una API con un estilo similar al de OpenGL.
20
INVESTIGACIÓN TECNOLÓGICA
Aunque los principales lenguajes para el desarrollo de software en la PSP son C y C++, existen
otras alternativas como Python, Lua o Macromedia Flash. No obstante, mientras que C y C++
permiten trabajar con entornos 2D y 3D, la programación con Lua y Macromedia Flash se limita
al manejo de gráficos 2D.
La política de Sony no acepta en ningún momento la posibilidad de que los usuarios puedan
desarrollar sus propias aplicaciones, de manera que la empresa japonesa ha ido presentando
diferentes actualizaciones para el firmware de la PSP. Cada nueva versión mejora el
funcionamiento de la videoconsola portátil, añade diferentes capacidades y condiciona el
software oficial que puede ser ejecutado. Pero al mismo tiempo, también corrige los exploits
utilizados por los seguidores de la escena para poder ejecutar sus aplicaciones. Esto ha
llevado a una pequeña batalla entre los usuarios más avanzados y Sony, en la que cada nuevo
firmware va acompañado al poco tiempo de un nuevo exploit.
3.3 LTE GE
A primera vista, desarrollar un juego para la PSP puede parecer una tarea sencilla,
especialmente si se limita a mostrar gráficos 2D. Para ello no sólo existen lenguajes de
scripting intuitivos como Lua, sino también librerías de alto nivel como SDL que ya han
demostrado su potencial sobre el PC. En el momento en el que se introducen gráficos 3D el
trabajo de programador parece complicarse considerablemente. Las alternativas vistas hasta
ahora pasan por utilizar directamente las librerías libGU y libGUM, pero dado el bajo nivel de
implementación de las mismas, su manejo es extremadamente complejo a medida que el
proyecto crece. Algo parecido ocurre con PSPGL, si bien el hecho de usar una API similar a
OpenGL facilita el desarrollo del videojuego, todavía deja en manos del programador un gran
número de tareas básicas que exigen ingentes cantidades de código. Además estás librerías
sólo contemplan el apartado gráfico del juego, por lo que aspectos como el sonido o la
conexión WI-FI deben ser tratado mediante otras librerías especializadas.
LTE GE[2] soluciona la mayoría de los problemas comentados hasta ahora. Se trata de un
motor para la creación de juegos, de manera que no se centra exclusivamente en los gráficos,
sino que también añade funciones para reproducir sonido, leer y escribir en ficheros, crear
interfaces de usuario o gestionar conexiones WI-FI. Si bien toma como base la librería PSPGL,
construye sobre esta una API similar a la utilizada por Irrlicht, un popular motor gráfico para PC.
En realidad, LTE GE aprovecha que Irrlicht es una distribución de software libre para adaptarlo
a los requisitos de la PSP, y al mismo tiempo añade toda una serie de características
adicionales para convertirlo en un completo motor de desarrollo de videojuegos.
21
PROYECTO FIN DE CARRERA
• Efecto cel-shading.
• Multi-texturizado.
• Environmental Mapping.
• Sistema de animación.
• Efectos de partículas.
• Billboards.
• Luces dinámicas.
• Soporte de 9 formatos de mallas (.md2, .bsp, .x, .3ds, .obj, .dmf, .dae, .ms3d, .b3d).
• Soporte de fuentes.
• Detección de colisiones.
• Generación de terrenos.
22
INVESTIGACIÓN TECNOLÓGICA
• Core. Clases básicas como vectores, matrices, planos, listas… También algunas
funciones y constantes de uso general.
• GUI. Presenta clases que permiten crear una interfaz gráfica de usuario de manera
sencilla. Se pueden añadir elementos como etiquetas de texto, cajas de selección
desplegables (combo box), botones de selección (check box)…
• IO. Proporciona interfaces para la entrada y salida de datos. Incluye clases para
escribir y leer archivos, así como documentos XML.
• Net. Contiene clases para acceder al controlador de red. La comunicación entre nodos
a través de la conexión WI-FI se realiza mediante unas clases diseñadas como
sockets.
23
PROYECTO FIN DE CARRERA
• Scene. La gestión del grafo de escena se realiza dentro de este espacio de nombres.
Existen diferentes tipos de nodos (terrenos, mallas animadas, sistemas de partículas,
animadores…).
El acceso a todos los objetos del motor parte de un único objeto representado por la clase
engineDevice. Por lo tanto, tras el código necesario para la puesta a punto de la PSP, lo normal
será que se disponga de una llamada a la función createDevice(). El primero de los parámetros
se utiliza para pasar al motor un gestor de eventos personalizado. Este será una clase que
herede de IEventReceiver. El segundo es de suma utilidad durante el desarrollo del videojuego
e indica si se va a visualizar (true) o no (false) el logo de Sony y de LTE GE. Si se utiliza el
valor false al cabo de 10 minutos la aplicación se cerrará, pero dado que los primeros pasos
irán encaminados a realizar un gran número de pruebas rápidas sobre el código, suele ser
tiempo suficiente.
Una vez se dispone del engineDevice, se pueden recuperar punteros a los diferentes
controladores del motor (audio, vídeo, red, GUI y escena), al sistema de ficheros, al cursor o al
temporizador, entre otros.
Se trata de la clase base para la mayor parte de los objetos del motor. Proporciona un
mecanismo básico de contabilización de referencias mediante dos métodos: drop() y grab().
Cuando se crea un objeto invocando un método del motor que comienza por create se
devuelve un puntero al objeto creado. Es responsabilidad del programador eliminarlo cuando
ya no lo necesite más utilizando el método drop(). Esto destruirá el objeto siempre que en otra
parte del código no se haya invocado el método grab(). En caso contrario, sólo reducirá en uno
el contador de referencias de dicho objeto.
Suele ser habitual encontrarse con trozos de código en los que el método drop() se llama
inmediatamente después de asignar el objeto creado a un nodo.
node->addAnimator(anim);
anim->drop();
Código 3.1. Extracto de código del ejemplo 04.Movement. Invocación del método drop()
después de asignar el objeto eliminado a un nodo de escena.
24
INVESTIGACIÓN TECNOLÓGICA
Esto es posible porque el controlador de la escena pasa a hacerse cargo del objeto. La
sentencia node->addAnimator(anim) internamente realiza una llamada a grab(), por lo que el
correspondiente drop() puede realizarse después o dejarlo para el final del programa.
Es una representación esquemática de la escena que contiene todos y cada uno de los
elementos que forman parte del mundo 3D que posteriormente se dibuja en la pantalla. Se
gestiona mediante un objeto de tipo ISceneManager. A través de este se pueden añadir todo
tipo de nodos a la escena. Son objetos que derivan de la clase ISceneNode y que van desde
los nodos que representan las cámaras hasta otros que contienen las mallas animadas.
3.3.5 Temporizador
La clase ITimer permite recuperar tanto el tiempo real del sistema (getRealTime()) como el
tiempo virtual (getTime()) obtenido a partir de un contador software controlado por el propio
motor. El temporizador virtual puede ser manipulado por el programador pudiendo asignarle un
valor determinado, detenerlo, volver a ponerlo en marcha…
3.3.6 Animadores
25
PROYECTO FIN DE CARRERA
consiguiéndose entonces una gestión de colisiones del jugador con el escenario del
juego similar a la de los juegos de acción en primera persona.
3.3.7 Cámaras
Existen diferentes tipos de cámaras a disposición del programador, siendo además posible
crear varias, aunque en cada instante sólo puede haber una activa. Las cámaras son tratadas
como nodos y al igual que estos forman parte del grafo de escena. Pueden ser hijos de otros
nodos, en cuyo caso se verán afectados por las transformaciones realizadas sobre su padre.
Las cámaras que pueden añadirse mediante el ISceneManager son:
26
INVESTIGACIÓN TECNOLÓGICA
3.3.8 Octree
Es un tipo especial de nodo empleado para trabajar con mallas formadas por grandes
cantidades de geometría estática. Un octree permite dibujar aproximadamente sólo la parte de
la geometría que es visible en cada momento. Esto supone en la mayoría de las ocasiones una
mejora en el rendimiento del motor gráfico, aunque depende totalmente de la complejidad y el
tamaño de la geometría. Puede resultar especialmente útil para generar los escenarios o
mapas en los que tiene lugar la acción del juego.
3.3.9 Eventos
La gestión de eventos se realiza creando una clase que herede de IEvenReceiver. Esta interfaz
dispone de un método abstracto (OnEvent()) que hay que implementar en el nuevo gestor de
eventos. El motor del juego se encargará de invocarlo cada vez que tenga lugar algún evento y
sea necesario tratarlo (mecanismo de callback). Estos pueden ser de 4 tipos:
• MouseInput. Eventos del ratón (representado en la PSP por un cursor que se controla
con el mando analógico).
El manejo de sockets con la conexión WI-FI supone otra serie de eventos que son controlados
mediante un gestor diferente. En este caso, la clase que se encarga de atender dichos eventos
debe heredar de la interfaz INetworkCallback, y se asigna al inicializar el controlador de red con
el método initialize().
LTE GE proporciona algunos efectos especiales que pueden ser añadidos en un videojuego.
Su número es bastante reducido, por lo que un uso extensivo de los mismos requiere que el
programador los elabore por cuenta propia.
27
PROYECTO FIN DE CARRERA
mesh = smgr->addHillPlaneMesh(“myHill”,
core::dimension2d<f32>(20,20),
core::dimension2d<s32>(40,40), 0, 0,
core::dimension2d<f32>(0,0),
core::dimension2d<f32>(10,10));
node = smgr->addWaterSurfaceSceneNode(mesh->getMesh(0),
3.0f, 300.0f, 30.0f);
node->setPosition(core::vector3df(0,7,0));
node->setMaterialTexture(0,
driver->getTexture(“ms0:/media/stones.jpg”));
node->setMaterialTexture(1,
driver->getTexture(“ms0:/media/water.jpg”));
node->setMaterialType(video::EMT_REFLECTION_2_LAYER);
Código 3.2. Extracto de código del ejemplo 08.SpecialFX. Cómo añadir un efecto
de agua.
28
INVESTIGACIÓN TECNOLÓGICA
pasa el tiempo. Si se quiere añadir un nuevo modificador, basta con implementar una
clase que herede de IParticleAffector.
scene::IParticleSystemSceneNode* ps = 0;
ps = smgr->addParticleSystemSceneNode(false);
ps->setPosition(core::vector3df(-70,60,40));
ps->setScale(core::vector3df(2,2,2));
ps->setParticleSize(core::dimension2d<f32>(20.0f, 20.0f));
scene::IParticleEmitter* em = ps->createBoxEmitter(
core::aabbox3d<f32>(-7,0,-7,7,1,7),
core::vector3df(0.0f,0.06f,0.0f),
80,100, video::SColor(0,255,255,255),
video::SColor(0,255,255,255), 800,2000);
ps->setEmitter(em);
em->drop();
scene::IParticleAffector* paf =
ps->createFadeOutParticleAffector();
ps->addAffector(paf);
paf->drop();
ps->setMaterialFlag(video::EMF_LIGHTING, false);
ps->setMaterialTexture(0,
driver->getTexture(“ms0:/media/fire.bmp”));
ps->setMaterialType(video::EMT_TRANSPARENT_VERTEX_ALPHA);
Código 3.3. Extracto de código del ejemplo 08.SpecialFX. Cómo crear un sistema
de partículas que simula el fuego.
29
PROYECTO FIN DE CARRERA
considerablemente afectada, dado que se pasa de renderizar una vez la escena por
cada ciclo a hacerlo dos veces.
video::ITexture* rt = driver->createRenderTargetTexture(
core::dimension2d<s32>(256,256));
test->setMaterialTexture(0, rt);
test->setVisible(false);
smgr->setActiveCamera(fixedCam);
smgr->drawAll();
driver->setRenderTarget(0);
test->setVisible(true);
smgr->setActiveCamera(fpsCamera);
3.3.11 Colisiones
La detección de colisiones puede llevarse a cabo con cualquiera de las siguientes técnicas:
30
INVESTIGACIÓN TECNOLÓGICA
Los dos primeros métodos emplean un objeto ITriangleSelector para restringir la detección de
colisiones a ciertos nodos. Hay diferentes tipos de ITriangleSelector en función del nodo sobre
el que se crean:
• TriangleSelector. Emplea un objeto de tipo IMesh. Aunque es válido para todo tipo de
malla, no es recomendable utilizarlo ni con grandes geometrías ni con modelos
animados por la carga de procesamiento que supone. Funciona correctamente con
sencillas mallas estáticas.
ITriangleSelector* ts = sceneManager->createTriangleSelector(mesh,
node);
node->setTriangleSelector(ts);
ts->drop();
31
PROYECTO FIN DE CARRERA
terrain->setMaterialFlag(video::EMF_LIGHTING, false);
terrain->setMaterialTexture(0,
driver->getTexture(“ms0:/media/terrain-texture.jpg”));
terrain->setMaterialTexture(1,
driver->getTexture(“ms0:/media/detailmap3.jpg”));
terrain->setMaterialType(video::EMT_DETAIL_MAP);
terrain->scaleTexture(1.0f, 20.0f);
Código 3.7. Extracto de código del ejemplo 09.TerrainRendering. Cómo crear un terreno
irregular.
3.3.13 Skybox
Una manera sencilla de recrear en el mundo virtual el cielo es mediante una caja con 6
texturas. La cámara y los demás elementos de la escena se encuentran siempre en su interior.
Cuando la cámara gira, el motor gráfico se encarga de suavizar la transición entre las
diferentes texturas, de forma que a ojos del jugador parece que sólo existe una imagen que lo
envuelve por completo.
driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS,
false);
skybox->setMaterialFlag(video::EMF_CLIPPING, true);
Código 3.8. Extracto de código del ejemplo 09.TerrainRendering. Cómo crear una
skybox.
32
INVESTIGACIÓN TECNOLÓGICA
3.3.14 Sombras
LTE GE permite crear dos tipos de sombras a partir de los nodos de la escena.
3.4.1 Programación
Para ejecutar las aplicaciones programadas por los usuarios en la PSP, se debe disponer de la
versión 1.5 del firmware, ya que es la única que permite este tipo de manipulaciones por parte
del usuario. Aunque la mayoría de las videoconsolas que se comercializan actualmente
presenta una versión del firmware superior, en muchos casos existe la posibilidad de reducir
dicho firmware a una versión anterior (proceso que se conoce como downgrade).
Para este proyecto se han empleado dos PSP: una con la versión de firmware oficial de Sony
2.01 y la otra directamente con el firmware 1.5. Al no existir un programa o método concreto
para reducir directamente de la versión 2.01 a la 1.5, se ha optado por actualizar la versión a la
2.60 y a partir de ahí, utilizar una herramienta (downgrader 2.50-2.60) que directamente (y de
forma automática) reduce finalmente la versión de firmware a la 1.5.
Los pasos para actualizar en primer lugar a la versión 2.60 son los siguientes:
• Para transferir los archivos necesarios se necesita un cable USB con conector tipo
Mini-B.
33
PROYECTO FIN DE CARRERA
• Asegurarse de introducir en la PSP una Memory Stick Duo con suficiente memoria
libre.
• Conectar el sistema PSP al ordenador mediante un cable USB con conector tipo Mini-
B.
• Encender la PSP y acceder a la opción Ajustes → Conexión USB del menú principal y
a continuación, pulsar el botón (X) para activar el modo USB. Tras esto, el ordenador
debería reconocer el sistema PSP como una unidad externa.
• Abrir esta unidad en el ordenador y crear una carpeta para los datos de actualización.
A continuación, crear en la Memory Stick Duo una carpeta con el nombre PSP. Dentro
de la carpeta PSP, crear otra llamada GAME y dentro de esta, otra con el nombre
UPDATE.
Hay que decir que para realizar el downgrade de la versión 2.60 con este instalador es
necesario disponer del juego original GTA: Liberty City Stories de PSP. Esto se debe a
que el downgrader empleado aprovecha un exploit descubierto en el proceso de carga
de este juego para poder acceder al modo kernel.
• Una vez instalado el programa, se debe arrancar el UMD original de GTA: Liberty City
Stories como si se fuera a jugar y mientras se carga la partida el downgrader se
arrancará.
34
INVESTIGACIÓN TECNOLÓGICA
A partir de este punto se puede optar por dejar el firmware 1.5 (suficiente para poder programar
y cargar aplicaciones homebrew en la PSP) o actualizarlo con algún Custom Firmware. En el
proyecto se ha optado por la segunda opción, ya que de esta manera se logra una mayor
compatibilidad con ciertas aplicaciones que se utilizan más adelante en el desarrollo del
videojuego. Para ello se ha empleado la versión del Custom Firmware desarrollado por
Dark~AleX (se puede descargar desde http://dark-alex.org). Esta versión en concreto es la 3.40
OE-A. Su instalación se realiza mediante el Firrmware 3.40 OE-A autoinstaller que es un
programa capaz de actualizar a esta versión de Custom Firmware desde la versión 1.5 (oficial
de Sony) o desde cualquier otra versión de Custom Firmware inferior.
Los pasos para llevar a cabo la actualización al Custom Firmware 3.40 OE-A desde la versión
1.5 son los siguientes:
• Ejecutar el auto-instalador.
• Seguir los pasos que se presentan por pantalla hasta finalizar el proceso de
actualización.
35
PROYECTO FIN DE CARRERA
3.4.1.2 PSPLINK
En un principio, programar una aplicación para la PSP no es una tarea grata. El proceso de
programación, compilación y prueba obliga a repetir una serie de acciones que terminan por
convertirse en un auténtico problema si el proyecto desea desarrollarse de una manera ágil y
fluida. Tras disponer del ejecutable generado por el compilador es necesario copiarlo a la
carpeta correspondiente de la PSP, de manera que se pueda ejecutar el código obtenido y
verificar su funcionamiento. La copia del archivo y la activación de la conexión USB entre la
PSP y el PC deben realizarse manualmente e inevitablemente consumen un tiempo
considerable. Realmente en los primeros pasos del proyecto el tiempo dedicado a probar el
código en ejecución es inferior al perdido en el proceso de preparación previo comentado.
La solución a este problema fundamentalmente logístico viene dada por una aplicación
conocida como PSPLINK[4] (la versión analizada es la 2.0), que como su nombre sugiere,
establece una conexión directa entre la PSP y el PC. Básicamente proporciona un intérprete de
comandos para el usuario construido sobre los 3 medios de comunicación de los que dispone
la PSP: SIO, USB y WI-FI. De esta forma, una vez establecida la conexión con el PC no es
necesario volver a trabajar desde la videoconsola portátil. PSPLINK funciona como un terminal
de texto, enviando comandos desde el PC que son interpretados por la PSP y evitando así
tener que acceder al XMB.
Como se ha comentado, es posible establecer una conexión SIO, USB o WI-FI. Cada una de
estas alternativas requiere su propio proceso de configuración y puede ser utilizada tanto en
sistemas Win32 o *nix. En este caso, se va a describir el proceso de acceso a través de USB.
Su principal ventaja es que permite crear un servidor de ficheros en el PC con una sencilla
aplicación (usbhostfs_pc). El terminal de texto no se conectará entonces directamente a la PSP
limitando el directorio activo al contenido de la videoconsola, sino que lo hará al servidor de
ficheros, el cual se encargará de transferir automáticamente los archivos que se quieran
ejecutar a la PSP. Así pues, desaparece el paso correspondiente a la copia del ejecutable,
pudiendo comprobar el funcionamiento de las aplicaciones con un solo comando.
Los pasos a seguir para la puesta a punto de PSPLINK con una conexión USB HostFS
(servidor de ficheros) sobre Windows son los siguientes:
36
INVESTIGACIÓN TECNOLÓGICA
usbhost=1
usbshell=1
Código 3.9. Configuración del archivo psplink.ini para hacer uso de la conexión
USB HostFS.
• Windows detectará un nuevo dispositivo de tipo PSP Type B para el que necesita los
controladores. Estos se encuentran en la carpeta que se ha descomprimido al
comienzo, concretamente en la siguiente ruta: pc\windows\driver.
Se puede acceder a la lista completa de comandos que pueden ser utilizados escribiendo help.
En primer lugar muestra los diferentes módulos o categorías en los que se agrupan estos
comandos. Escribiendo help categoría se visualizan los comandos disponibles en cada
sección. Todavía se puede conseguir más información acerca de cada comando volviendo a
introducir help comando.
Comando Descripción
37
PROYECTO FIN DE CARRERA
-rm -f strip_$(FINAL_TARGET)
De esta manera ahora en el directorio aparecerá otro módulo ELF que responderá al
nombre strip_programa.elf y que será el que se debe ejecutar desde PSPLINK.
• Ejecutar el archivo PBP en lugar del módulo ELF. Realmente, un archivo PBP contiene
entre otros ficheros un módulo ELF stripped.
38
INVESTIGACIÓN TECNOLÓGICA
PSPLINK es una herramienta muy técnica que puede adaptarse fácilmente a las necesidades
del usuario. Sus posibilidades de configuración son muy variadas e introduce también
mecanismos para llevar a cabo procesos de depuración durante la ejecución (definición de
breakpoints, volcados de memoria y registros…). Todas y cada una de sus funcionalidades se
describen en mayor detalle en el manual que acompaña a la herramienta.
3.4.1.3 iR Shell
iR Shell establece su propia interfaz para acceder a los archivos almacenados en la PSP.
Incluye un amplio abanico de funcionalidades, siendo el uso del usbhostfs la principal ventaja
para el programador. Desde iR Shell se puede navegar fácilmente a través del sistema de
ficheros propio de la PSP hasta acceder al creado en el. Basta entonces con pulsar un solo
botón para ejecutar el PBP seleccionado.
El proceso de instalación depende de la versión del firmware de la PSP. Para la 3.40 Open
Edition de Dark~AleX los pasos a seguir son los siguientes:
• Comprobar que el firmware está configurado para que los ejecutables de la versión
1.50 se guarden en la carpeta ms0:\PSP\GAME150,
39
PROYECTO FIN DE CARRERA
Otra de las características de iR Shell que puede ser útil de cara a una posterior presentación
de la aplicación es que permite realizar capturas de pantalla de la PSP. Para ello basta con
pulsar el botón que contiene el dibujo de una nota musical. Las imágenes se guardan en la
carpeta ms0:\PSP\PHOTO\SNAPSHOT.
Esto es suficiente para instalar LTE GE. Se puede comprobar que el proceso se ha realizado
sin problemas compilando cualquiera de los ejemplos disponibles.
40
INVESTIGACIÓN TECNOLÓGICA
Para facilitar la labor de programación es recomendable usar alguno de los IDE disponibles,
como Microsoft Visual C++ 2005 Express Edition. Los pasos a seguir para configurarlo y poder
compilar el código de un proyecto cualquiera son los siguientes: [5]
• No es necesario cambiar nada en la ventana del asistente, por lo que se puede pulsar
directamente sobre el botón Finish.
• Crear en el directorio del proyecto un fichero que se llame makefile con el siguiente
código:
TARGET = Ejemplo
OBJS = main.o
LIBDIR =
INCDIR =
EXTRA_TARGETS = EBOOT.PBP
41
PROYECTO FIN DE CARRERA
TARGET = Ejemplo
OBJS = main.o
Indica al compilador qué archivos tiene que compilar. En este caso, buscará el archivo
main.cpp en el mismo directorio en el que se encuentra el makefile y generará el
archivo objeto main.o. Si se tuvieran que compilar más archivos, estos se indicarían a
continuación de main.o separados por espacios en blanco.
INCDIR =
La línea que comienza con el carácter # está comentada y por tanto es ignorada al
ejecutar el makefile. La idea es que sólo una de estas líneas esté habilitada. La
diferencia entre ambas es que el parámetro -g compila la aplicación con símbolos de
depuración. La inclusión de estos símbolos permite que el depurador pueda
proporcionar información adicional, pero al mismo tiempo aumenta el tamaño de los
archivos generados.
#PSP_EBOOT_ICON = ICON0.PNG
#PSP_EBOOT_ICON1 = ICON1.PMF
#PSP_EBOOT_UNKPNG = PIC0.PNG
#PSP_EBOOT_PIC1 = PIC1.PNG
#PSP_EBOOT_SND0 = SND0.AT3
42
INVESTIGACIÓN TECNOLÓGICA
Este archivo de texto debe ser guardado en formato Unix, por lo que es recomendable
usar un editor de texto como UltraEdit que dispone de esta opción. Para no tener que
crearlo desde cero también se puede editar alguno de los makefile que se incluyen en
los ejemplos de LTE GE.
del *.elf
del *.o
del *.pbp
del *.sfo
Es una manera sencilla de eliminar todos los archivos generados por el makefile para
poder volver a compilar la aplicación.
del *.elf
del *.o
del *.pbp
del *.sfo
make
43
PROYECTO FIN DE CARRERA
Una vez completado el proceso anterior ya se puede pulsar sobre Rebuild Solution o CTRL +
ALT + F7.
A la hora de enfrentarse por primera vez a un motor para el desarrollo de juegos como es LTE
GE, es muy habitual realizar pequeñas aplicaciones que proporcionan al programador una
noción general de su funcionamiento. Con este propósito, resulta útil disponer de una
aplicación de prueba que pueda ser utilizada a modo de plantilla con los diferentes ejemplos.
Básicamente consiste en un proyecto con el mínimo código necesario para ponerlo en marcha.
Así, cuando se quiera comprobar la validez de un nuevo algoritmo o simplemente ver cuál sería
el resultado en ejecución de una sencilla operación, basta con transferir el código a la
aplicación de prueba que se ha creado.
En esta ocasión se van a presentar extractos de código en primer lugar para finalmente mostrar
el código completo. Como se va a usar el makefile creado previamente, todo el código descrito
a continuación corresponde al archivo main.cpp.
#include <engine.h>
El primer paso para utilizar LTE GE consiste en incluir el archivo de cabecera del motor para
poder acceder a sus diferentes clases y funciones.
#define PSP_ENABLE_DEBUG
#include “common.h”
44
INVESTIGACIÓN TECNOLÓGICA
El archivo de cabecera common.h es empleado por los ejemplos que acompañan a LTE GE
recopilando algunas operaciones de bajo nivel comunes a todos ellos. Aunque podría
integrarse el código correspondiente en la propia aplicación, como se trata de un programa de
prueba se ha optado por aprovecharlo. En él se incluye la estructura condicional sobre el
símbolo PSP_ENABLE_DEBUG.
Se ha utilizado la sentencia using para todos los espacios de nombres. Así se evita teclear
continuamente el espacio de nombres al que se accede, pero también da pie a que puedan
aparecer ambigüedades. En un proyecto real es recomendable referirse de manera explícita a
cada espacio de nombres, aunque el tiempo invertido en ello en ocasiones puede ser excesivo
y muchos programadores terminan por optar por la primera opción.
Estas variables globales son punteros empleados para acceder a toda la funcionalidad que
proporciona el motor. El puntero fundamental entre los declarados es device. Una vez
inicializado permitirá obtener las referencias para los punteros restantes. Dado que se trata de
una pequeña aplicación de prueba, el uso de variables globales no supone mayor problema.
void ini()
{
}
void update()
{
}
void end()
{
}
Las 3 funciones implementadas todavía no contienen código propiamente dicho, dado que este
dependerá de cada aplicación concreta. La primera de ellas, ini(), está pensada para inicializar
45
PROYECTO FIN DE CARRERA
todos los elementos de la escena (cargar modelos, texturas, precalcular valores…). Sólo será
invocada una vez, al comienzo de la ejecución del programa. Por su parte, update() se encarga
de actualizar la lógica de la escena (la posición de los modelos, el momento en el que deben
aparecer o desaparecer, actualizar el estado de los botones…). Se invocará repetidamente
dentro de un bucle hasta que la aplicación finaliza. En ese momento intervendrá la función
end() para garantizar que el programa puede terminar sin problemas.
setupPSP();
Se definen las variables globales. Estas sentencias podrían haberse incluido dentro de la
función ini(), pero al no variar de una aplicación a otra se han dejado en la función principal.
ini();
Después se invoca la función ini() para inicializar la escena con los elementos propio de cada
aplicación.
while(device->run())
{
update();
Este es el bucle principal del juego. La llamada a device->run() al comienzo del bucle es muy
importante. No sólo actualiza el temporizador interno del motor, sino que también detecta
nuevos eventos.
46
INVESTIGACIÓN TECNOLÓGICA
Por cada pasada se actualiza la lógica del juego (update()), el controlador gráfico limpia la
pantalla y el buffer de profundidad (driver->beginScene()), se dibuja el contenido de la escena
(smgr->drawAll()), los elementos del GUI (guienv->drawAll()) y finalmente se vuelca todo a la
pantalla (driver->endScene()). El bucle se repite mientras el juego esté funcionando y hasta que
el usuario indique explícitamente que desea salir o se dé algún error fatal.
end();
Con esta línea de código se finaliza la aplicación asegurándose de que no queda nada
pendiente.
device->drop();
Al llamar a createDevice() se creó una referencia que debe ser eliminada por el programador
mediante el método drop().
sceKernelExitGame();
return 0;
}
Este último paso pretende indicar a la PSP que la aplicación ha terminado. Se trata
prácticamente del único código de bajo nivel que es necesario escribir al programar con LTE
GE.
#include <engine.h>
#define PSP_ENABLE_DEBUG
#include “common.h”
void ini()
{
47
PROYECTO FIN DE CARRERA
void update()
{
}
void end()
{
}
ini();
while(device->run())
{
update();
driver->beginScene(true, true, SColor(255, 14, 4, 31));
smgr->drawAll();
guienv->drawAll();
driver->endScene();
}
end();
device->drop();
sceKernelExitGame();
return 0;
}
Existen algunos problemas conocidos de las librerías de LTE GE o del PSPSDK. Siempre que
ha sido posible se ha recogido la causa del problema y su solución, si bien hay casos en los
que debido a errores internos de las propias librerías ha sido necesario buscar otras
alternativas ante la imposibilidad de solventar el error.
48
INVESTIGACIÓN TECNOLÓGICA
#ifndef _MBSTATE_T
#define _MBSTATE_T
//typedef _mbstate_t mbstate_t;
#endif /* _MBSTATE_T */
o Causa. Está motivado por la utilización de una constate estática de tipo string,
pero se desconoce si existe una causa real o es un problema circunstancial.
o Solución. Basta con declarar las constantes estáticas como char* en lugar de
string.
49
PROYECTO FIN DE CARRERA
3.4.2 Modelado
50
INVESTIGACIÓN TECNOLÓGICA
3.4.2.1 MilkShape 3D
Existen gran variedad de herramientas para modelar y animar objetos 3D, pero pocas con la
sencillez y posibilidad de editar tantos modelos de diferentes juegos comerciales. MilkShape
3D es un modelador de bajo número de polígonos inicialmente diseñado para Half-Life. Desde
entonces se han ido añadiendo nuevas funcionalidades y soporte para formatos de modelos de
otros videojuegos.
MilkShape 3D incluye operaciones básicas para seleccionar, mover, rotar, escalar, subdividir,
extrudir… Permite editar los modelos a bajo nivel, trabajando con los vértices o las caras de los
polígonos, y añadir primitivas básicas como esferas, cubos o cilindros. También dispone de un
animador de esqueletos con el que se pueden modificar las animaciones que ya tienen los
modelos o crear otras nuevas.
Se trata de una aplicación shareware con un periodo de prueba gratuito de 30 días. Pasado el
mismo es necesario comprar una clave de activación para seguir utilizando MilkShape 3D. En
cualquier caso, cuando se recurrió a esta aplicación, el precio a pagar para registrarla era de
25 € o 25 USD. Bastante asequible comparado con el de otras herramientas comerciales y
teniendo en cuenta además que se adapta perfectamente a unas necesidades muy
específicas.
• Marcar todas las casillas dentro del cuadro de diálogo MDL Decompile y pulsar en Ok.
En el directorio en el que se encuentra el modelo se habrán creado una serie de
ficheros .smd. Cada uno de estos representa una animación diferente y generalmente
sólo uno de ellos contiene información acerca de la geometría. Este suele venir
identificado por el nombre del modelo original o yendo acompañado de la palabra
reference.
51
PROYECTO FIN DE CARRERA
o Si el modelo tiene más de un grupo, cada uno de estos tiene su propia textura
asignada. Los modelos .md2 sólo pueden tener una imagen con todas las
texturas, por lo que es necesario recombinar cada imagen en una más grande
que las contenga. Para ello se puede usar cualquier herramienta de edición de
imágenes. Hay que respetar el tamaño original de las texturas, distribuirlas en
una sola imagen de la manera más compacta posible y guardarla como un
archivo BMP. Las dimensiones de la nueva imagen deben ser potencia de 2
para que MilkShape 3D no la deforme.
• Para añadir animaciones al modelo hay que pulsar el botón Anim y pasar al siguiente
cuadro de animación. A partir de aquí se puede importar cualquiera de las animaciones
(archivos .smd) que se generaron en los primeros pasos.
• Finalmente hay que crear un archivo .qc que indica al exportador de MilkShape 3D qué
nombre se va a asignar a cada animación y de cuántos cuadros de animación consta.
En el directorio en el que se instaló MilkShape 3D existe un archivo .qc de ejemplo,
aunque se puede crear directamente con el siguiente contenido:
// skins
$skinwidth 128
52
INVESTIGACIÓN TECNOLÓGICA
$skinheight 128
$skin skin.bmp
// sequences
$sequence idle 1 129
$sequence walk 130 153
$sequence die 154 193
$sequence look 194 294
Un archivo .smd contiene información que puede ser modificada con cualquier editor de texto.
Los datos almacenados pueden ir desde los vértices de los triángulos que definen el modelo,
hasta la posición de los nodos que forman el esqueleto (existe una descripción detallada sobre
el formato de los archivos SMD en http://developer.valvesoftware.com/wiki/Smd).
Para solucionar los problemas comentados hay que fijarse en los bloques de texto que
comienzan después de la palabra time. Cada uno de estos bloques define un cuadro de
animación del modelo. El primer número de cada línea es el identificativo de un nodo del
esqueleto previamente declarado. Los 3 siguientes son su posición (X, Y, Z). Generalmente el
nodo 0 representa el modelo completo, por lo que la corrección de la posición y el
desplazamiento sólo se realiza sobre la primera línea de cada bloque de tiempo. Como el
modelo de referencia suele cargarse en las coordenadas correctas, el valor de la coordenada Y
puede tomarse de su archivo SMD. Copiándolo en la primera línea de cada cuadro de
animación se evita el hundimiento del modelo situándolo a la altura correcta. Si además se
quiere evitar el desplazamiento, es preciso sustituir la primera línea de cada cuadro de
53
PROYECTO FIN DE CARRERA
animación con la de time 0. De esta forma se consigue que la posición del modelo sea siempre
la misma en todos los cuadros de animación, mientras sus articulaciones se mueven
libremente.
time 0
0 0.235347 -0.235347 38.884376 0.000000 0.000000 -1.570874
1 0.679708 -0.015625 0.000000 -1.570795 -1.570796 0.000000
2 -0.000005 0.000007 3.713255 -0.055264 3.176510 -0.210053
time 1
0 0.239254 -0.239254 38.872657 0.000000 0.000000 -1.570874
1 0.671896 -0.015625 0.000000 -1.570795 -1.570796 0.000000
2 -0.000005 0.000007 3.713255 -0.055168 3.176605 -0.213162
3.4.2.3 Q3Radiant
LTE GE permite cargar archivos BSP, el formato creado por IDSoftware para los escenarios de
su videojuego Quake 3 Arena. Este formato utiliza un espacio de particionado binario que
genera niveles rápidamente minimizando la cantidad de polígonos que deben ser dibujados en
pantalla. No obstante, este algoritmo sólo resulta eficiente con escenarios cerrados sin grandes
zonas abiertas.
Para poder crear un mapa BSP se necesita el editor de mapas Q3Radiant (se puede obtener
de manera gratuita en http://www.idsoftware.com/business/techdownloads). El videojuego
Quake 3 Arena no es imprescindible, aunque conviene disponer del mismo para aprovechar las
diferentes texturas que incluye. Tampoco se puede prescindir del mismo si se desea
comprobar el acabado del escenario creado en el PC en lugar de en la PSP, lo cual puede
resultar más rápido permitiendo que el proceso de edición sea más cómodo. Algo similar ocurre
con la herramienta Q3Build (http://q3build.sagnor.com), diseñada para compilar los archivos
.map que se vayan generando y obtener así los .bsp correspondientes. Estos pasos pueden
realizarse igualmente desde Q3Radiant, aunque Q3Build incluye otras opciones como ejecutar
el mapa directamente sobre Quake 3 Arena y una interfaz más completa.
A continuación se describe cómo construir una habitación sencilla, compilar el mapa y probarlo
en Quake 3 Arena: [6]
54
INVESTIGACIÓN TECNOLÓGICA
• La ventana principal de Q3Radiant muestra una vista del plano XY que corresponde a
la vista en planta. Se puede alternar entre los diferentes planos mediante View →
Layout o pulsando la combinación de teclas CTRL + TAB.
• El menú Brush indica cuál es la primitiva que se va a dibujar en el mapa. La que viene
asignada por defecto corresponde a una primitiva de 4 lados, por lo que no hay que
cambiar nada y basta con arrastrar el cursor sobre la vista del plano XY hasta crear
una habitación. Para especificar la altura de la misma es necesario cambiar a la vista
del plano XZ y arrastrar el lado superior del cuadrilátero.
• La cámara que determina la parte del mapa que se visualiza en la vista en perspectiva
se controla mediante las teclas de cursor. La tecla A y Z permiten rotar la cámara hacia
arriba y abajo respectivamente. D se emplea para mover la cámara hacia arriba y C
hacia abajo.
• Una vez se ha creado el bloque que representa la habitación, se debe hacer hueco de
manera que se genere un espacio limitado por 4 paredes. Para ello hay que usar el
botón Hollow de la barra de herramientas. Esta operación también se encuentra en el
menú desplegable Selection → CSG → Hollow.
• Existen una gran cantidad de entidades que se pueden añadir a un mapa de Quake 3
Arena, pero dado que no tienen ningún significado para LTE GE no resultan de utilidad.
En este caso, las únicas que se tienen en cuenta son aquellas que representan luces y
que se emplean para generar los mapas de iluminación. Se puede añadir una entidad
de tipo light en cualquier punto del mapa usando el menú contextual. Cada entidad
tiene una serie de propiedades que pueden ser modificadas para obtener diferentes
efectos. La lista completa de entidades con sus propiedades se encuentra en la
documentación de Q3Radiant. Para ir a la ventana de la entidad hay que pulsar la tecla
N. En este caso, por ejemplo, se puede cambiar el color de la luz a rojo añadiendo la
clave _color con el valor 1 0 0.
• Para probar el mapa en Quake 3 Arena hay que añadir otra entidad que indique la
posición en la que debe aparecer el jugador. Para ello se debe colocar en el interior de
la habitación una entidad de tipo info_player_start.
• Si bien sólo se han comentado las combinaciones de teclas que permiten acceder a los
comandos básicos del editor, hay una lista completa en Help → Command List.
55
PROYECTO FIN DE CARRERA
• Los últimos pasos consisten en salvar el mapa y compilarlo para generar el archivo
BSP correspondiente. Es aquí donde se utiliza la herramienta Q3Build. Lo primero que
hay que hacer es configurar los parámetros para el proceso de compilación. A medida
que la complejidad de la geometría del mapa va aumentando, el tiempo de compilación
es cada vez mayor. Así pues, mientras no sea necesario comprobar el acabado final
del escenario es mejor utilizar los valores por defecto o eliminar determinados cálculos
mediante la opción Custom. Para generar el archivo BSP final es recomendable usar
los parámetros -fulldetail dentro de BSP y -extra dentro de LIGHT. VIS puede
mantenerse con Normal y VLIGHT con None. Si además se marca la casilla Run Q3
After Build, el mapa será ejecutado en Quake 3 Arena una vez haya sido compilado.
• Para que Q3Build funcione correctamente necesita los archivos en tiempo de ejecución
de Visual Basic 6.0. Se pueden descargar desde la página web de ayuda y soporte
técnico de Microsoft (http://support.microsoft.com/kb/192461).
Otro aspecto a considerar relacionado con Quake 3 Arena es que LTE GE puede leer archivos
PK3 con las ventajas que ello conlleva. PK3 es el formato comprimido empleado por Quake 3
Arena para todos los elementos del juego. Aunque no es obligatorio, los mapas y las texturas
deberían ser comprimidos en archivos .pk3 de manera que ocupen el menor espacio posible.
Cuando se quiere cargar un mapa creado con Q3Radiant en la PSP, hay que tener en cuenta
que todos los elementos a los que hace referencia el mapa deben ser incluidos también en la
PSP. Para crear un archivo .pk3 es necesario seguir los pasos siguientes:
• En el directorio maps se tienen que incluir todos los archivos .bsp que se deseen
utilizar en la PSP. Por su parte, en la carpeta textures hay que añadir las texturas que
se utilizan en el mapa respetando los subdirectorios creados por Quake 3 Arena. Dado
que no se requieren todas las texturas disponibles, es importante llevar un listado de
las que se añaden al mapa. Mediante la opción Textures → Show In Use y Textures →
Surface Inspector se pueden obtener todos los datos necesarios.
• Emplear una aplicación de compresión de datos como WinZip o WinRAR para generar
un archivo .zip con la estructura de directorios anterior y cambiar la extensión de .zip a
.pk3.
56
INVESTIGACIÓN TECNOLÓGICA
device->getFileSystem()->addZipFileArchive(
“ms0:/media/map-test.pk3”);
node = smgr->addOctTreeSceneNode(mesh->getMesh(0));
3.4.2.4 WAD2BMP
Si bien es posible encontrar gran cantidad de texturas de diferentes fuentes, no todas ellas
pueden tener la calidad esperada o ajustarse a la temática de un juego concreto. En el caso
concreto de este videojuego, la estética militar, industrial y urbana son fundamentales para
lograr una buena ambientación. Un videojuego como Half-Life incluye suficientes texturas de
estos tipos y existen además varias modificaciones como Counter-Strike o Team Fortress a las
que se puede acceder de forma gratuita con el mismo propósito.
Estas texturas no se encuentran disponibles directamente para ser utilizadas, sino que forman
parte de archivos .wad (Where is All the Data) que agrupan mapas, gráficos y otros datos del
juego. La herramienta comentada, wad2bmp
(http://nemesis.thewavelength.net/files/files/wad2bmp201.zip), permite extraer todas las
texturas almacenadas en uno de estos archivos y guardarlas como imágenes .bmp. Después
pueden ser añadidas al directorio de texturas al que apunta Q3Radiant para usarlas en los
mapas creados con el editor.
No dispone de una interfaz gráfica y se maneja como una aplicación de línea de comandos con
la siguiente sintaxis:
3.4.3 Comunicaciones
La videoconsola PSP cuenta con un dispositivo 802.11b Wireless Ethernet (WI-FI) que permite
establecer conexiones inalámbricas para la transmisión de datos con otros dispositivos WI-FI.
La PSP soporta dos tipos de conexiones en función de la existencia de un punto de acceso:
57
PROYECTO FIN DE CARRERA
Los clientes que están escuchando en el mismo canal reciben los paquetes del
servidor, pudiendo enviar a su vez su dirección MAC para confirmar la conexión.
Aunque para explicar ambas conexiones se ha usado como origen y destino una PSP, en la
práctica, tanto el origen como el destino de la comunicación pueden ser cualquier dispositivo
que disponga de una tarjeta de red WI-FI.
El conjunto de librerías del PSPSDK proporciona las funciones necesarias para poder
establecer las conexiones comentadas. Su manejo obliga al programador a conocer diferentes
aspectos sobre el funcionamiento interno de la PSP, por lo que siempre es preferible buscar
alguna librería adicional que disponga de un grado de abstracción mayor.
58
INVESTIGACIÓN TECNOLÓGICA
LTE GE no incluye clases para establecer este tipo de conexiones, pero un usuario conocido
como PSPet (http://changer.blog48.fc2.com) ha desarrollado una serie de librerías a partir del
PSPSDK que permiten establecer conexiones WI-FI. Están diseñadas de manera similar a
como se trabaja con sockets. Existe un ejemplo con todos los archivos necesarios que se
puede descargar desde http://www.gophinx.co.uk/BlackPhoenix/adhoc-examples.rar.
Para poder trabajar con las librerías de PSPet ha sido necesario usar la función adhocSend()
para el envío de paquetes y adhocRecvBlocked() para su recepción. Aunque en el ejemplo se
utilizan adhocSendRecvAck() y adhocRecvRecvAck() con el mismo propósito, durante la
ejecución las confirmaciones no llegan a los destinatiarios y la comunicación se bloquea.
La principal ventaja del modo ad-hoc frente al modo infraestructura es que la carga de
procesamiento es inferior (no se trabaja con datagramas IP), con lo que el tiempo de respuesta
se reduce considerablemente. Por otro lado, requiere que el emisor y el receptor se encuentren
dentro de un radio de acción muy limitado comparado con el conseguido con el modo
infraestructura.
El espacio de nombres Net de LTE GE incluye una serie de clases para el establecimiento de
conexiones en modo infraestructura. Como ocurría en el modo ad-hoc, su diseño es similar al
de los sockets, aunque requiere tener en cuenta ciertas consideraciones propias de LTE GE.
La gestión de los eventos del dispositivo WI-FI se realiza de forma similar a la de los eventos
de la entrada, asignando una función de callback que se encarga de su tratamiento a medida
que estos se generan. Esta función debe heredar de la interfaz INetworkCallback e
implementar las siguientes funciones que serán invocadas a medida que los eventos tengan
lugar:
Para asignar la función de callback se llama al método initialize() del controlador de red.
Después se pueden crear sockets para una dirección IP destino determinada mediante el
59
PROYECTO FIN DE CARRERA
método createSocket(). La interfaz ISocket obtenida dispone de todos los métodos para el
envío y recepción de datos.
60
ESPECIFICACIÓN DE REQUISITOS DEL SISTEMA
4.1 INTRODUCCIÓN
Este capítulo tiene como objetivo presentar la aplicación que se desea desarrollar, los
requisitos que ha de satisfacer y el análisis realizado para cumplir dichos requisitos. Se trata de
una visión descriptiva del proyecto que no tiene en cuenta los aspectos técnicos. Estos son
desarrollados en las secciones correspondientes a la especificación del diseño y las
consideraciones sobre la implementación.
Aunque este tipo de juegos no se caracteriza especialmente por su profundidad argumental, Air
Warriors proporciona una mayor inmersión por parte del jugador incluyendo una historia que
combina diálogos entre diferentes personajes con la acción característica de los
“matamarcianos”. Con ello se fijan unas metas más elaboradas para el jugador, que pasa de
centrarse exclusivamente en avanzar de misión en misión para poner a prueba sus reflejos y
destreza, a desarrollar una trama que le envuelve y sorprende a lo largo del juego.
El juego está estructurado en una serie de misiones secuenciales que hay que completar para
llegar al final del juego. Antes de iniciar una misión, se permite que el jugador explore mediante
una vista en primera persona un mapa de una localización concreta (modo aventura). En estos
61
PROYECTO FIN DE CARRERA
mapas existen diferentes personajes con los que el jugador puede conversar para obtener
información sobre el argumento del juego. Cada misión sigue el planteamiento introducido por
los “matamarcianos” y presenta diferentes objetivos para su terminación (modo arcade). Por
ejemplo, algunas misiones pueden requerir que el jugador destruya un número concreto de
naves en un tiempo limitado o simplemente que sobreviva con su nave durante un cierto
periodo de tiempo. Después de completar cada misión se presentan unas imágenes en pantalla
a modo de presentación que de manera narrativa desarrollan el guión del juego. En la versión
implementada para este proyecto se incluye una sola misión con los principales elementos del
juego a modo de demostración de la idea global que hay tras el videojuego.
También existe un modo multijugador que abandona el argumento original del videojuego para
proporcionar una acción directa en forma de misiones que se pueden jugar
independientemente con ayuda de otro compañero.
Las tareas de concepto y diseño preliminar pusieron de relevancia un gran número de opciones
y modos de juego. Dado el periodo de desarrollo limitado, muchas de ellas no se incluyen en la
versión actual, aunque se describen a continuación como módulos constituyentes del
videojuego.
o Nueva partida. Inicia una nueva partida. Primero se muestra una introducción
del argumento del videojuego mediante una serie de pantallas que combinan
texto e imágenes. A continuación se pasa a cargar la primera misión del juego,
indicando una breve descripción de los objetivos a cumplir.
62
ESPECIFICACIÓN DE REQUISITOS DEL SISTEMA
Para favorecer la inmersión del jugador y evitar que este pase a aplicar
exclusivamente una técnica de prueba y error, se restringe la opción de guardar
partida de manera que sólo está disponible después de completar una misión.
• Opciones de juego. Son una serie de opciones que afectan al juego en general, tanto
en el modo individual como en el multijugador.
• Servicios en línea. Consiste en una serie de opciones con las que se trata de
proporcionar un servicio adicional al jugador que permita alargar la vida útil del
videojuego. Todos estos servicios se proporcionan mediante un servidor conectado a
Internet para que cualquier PSP pueda acceder fácilmente a ellos.
63
PROYECTO FIN DE CARRERA
El modo aventura precede a cada misión y permite que el jugador explore algunas de las
localizaciones comentadas en el argumento del videojuego.
El jugador adopta el papel del protagonista del juego y se mueve por el escenario con una vista
en primera persona interactuando con diferentes elementos. Las acciones que puede llevar a
cabo son:
• Interactuar. Para poder interactuar con los elementos del escenario hay que
encontrarse dentro del radio de acción del objetivo. Después de pulsar el botón de
interactuar se mostrará un texto descriptivo con el resultado de la acción realizada por
el jugador.
Se consideran únicamente dos elementos. Todos ellos tienen un determinado radio de acción,
por lo que pueden ser activados desde una cierta distancia:
• Portales. Representan los puntos de salida del mapa. Al caminar a través de ellos se
abandona el escenario y se pasa a otra zona. Son elementos indicativos para el
jugador que no forman parte del mapa.
64
ESPECIFICACIÓN DE REQUISITOS DEL SISTEMA
4.3.2.3 HUD
El HUD está formado exclusivamente por un punto de mira que se encuentra en el centro de la
pantalla. Sirve de ayuda al jugador a la hora de seleccionar algún elemento del escenario con
el que desea interactuar.
4.3.2.4 Cámara
La cámara proporciona una vista en primera persona, de manera que al jugador se muestra
aquello que el personaje que está controlando ve desde su posición.
4.3.2.5 Colisiones
El jugador puede colisionar tanto con el escenario como con los personajes que haya en el
mismo. En ambos casos se debe impedir que el jugador atraviese dichos elementos, recreando
un entorno realista.
Los personajes, al no formar parte del escenario, colisionan exclusivamente con las superficies
del mapa.
En este modo transcurre la acción del juego propiamente dicha. Consta de unos objetivos que
el jugador debe completar para avanzar a la siguiente misión.
El jugador interactúa con el entorno mediante una nave espacial que lleva a cabo diferentes
acciones. Al igual que en el caso de los modos de juego, algunas de estas acciones no han
sido implementadas, pero se recogen igualmente en las siguientes líneas.
• Desplazarse. Mediante el mando analógico el jugador puede mover la nave por el área
de juego. El desplazamiento puede realizarse en cualquier dirección dentro del plano
que representa el área de juego. Si la nave abandona esta región, entonces se bloquea
el movimiento y la nave se detiene. Sólo se bloquea la componente del movimiento que
hace que la nave salga del área del juego, por lo que se permite que se deslice por los
bordes del área de juego.
La nave siempre está orientada hacia la dirección en la que avanza el área de juego.
Cualquier movimiento del mando analógico a la izquierda o derecha se traduce en un
desplazamiento lateral.
65
PROYECTO FIN DE CARRERA
• Disparo especial. Sin implementar. Además del disparo normal existe un disparo
especial que complementa al anterior. Según la situación en la que se encuentre el
jugador, puede ser conveniente usar uno u otro disparo.
• Usar ítem. Sin implementar. Una vez se ha seleccionado el ítem que se quiere activar,
pulsando el botón correspondiente a esta acción se hace uso del mismo.
La nave del jugador y las naves enemigas están definidas por una serie de atributos:
• Tiempo de recarga. Cuánto tiempo debe pasar después de realizar un disparo para
volver a disparar.
66
ESPECIFICACIÓN DE REQUISITOS DEL SISTEMA
• Tiempo de bloqueo. Después de una colisión entre naves, cuánto tiempo permanece
la dirección bloqueada hasta que se recupera el control.
• Masa. Se emplea para calcular la velocidad con la que nave sale despedida después
de haber colisionado con otra nave. Es un valor comprendido entre 0 y 100, siendo 100
el valor máximo.
• Ángulo de ladeo. Para dotar de un mayor dinamismo a la nave del jugador, esta se
ladea levemente al desplazarse lateralmente. El ángulo de ladeo indica el ángulo
máximo que puede llegar a alcanzar el ladeo de la nave. Cuando la nave deja de
moverse recupera lentamente su ángulo original.
Por su parte, las naves enemigas también presentan otros atributos a tener en cuenta:
• Cadencia de disparo. Indica cuántos disparos realiza la nave en cada ráfaga. Las
naves enemigas no disparan de manera aleatoria en el tiempo, sino que lo hacen por
ráfagas de un número determinado de disparos.
• Tiempo de recarga total. Es el tiempo que define cada cuánto tiempo se lanza una
ráfaga de disparos.
A medida que avanza el juego aparecen diferentes elementos que tratan de impedir que el
jugador complete su misión. Otros, por el contrario, proporcionan diferentes ventajas a la nave
del jugador.
Los elementos hostiles al jugador son las naves enemigas y sus disparos. Existen cuatro tipos
de naves enemigas en función de los valores que toman sus atributos. Estos valores han sido
asignados de manera que las naves presenten una serie de fortalezas y debilidades. Así pues,
un tipo concreto de nave puede ser rápida y poco resistente, mientras otra será más lenta pero
contará con un nivel de escudos mayor. Los nombres asignados a las naves están
relacionados con su forma o comportamiento. Son a su vez una manera sencilla de identificar
los diferentes tipos de naves enemigas dentro del universo ficticio del juego:
67
PROYECTO FIN DE CARRERA
• Doble dardo. Nave enemiga de mayor potencia de disparo. Cuenta con un armamento
de disparo doble, es lenta y muy resistente.
• Avanzar y girar. La nave avanza en línea recta en una determinada dirección y al cabo
de cierto tiempo gira un número arbitrario de grados cambiando la trayectoria seguida.
Después sigue avanzando en línea recta.
Las naves enemigas pueden aparecer desde cualquier borde del área de juego.
Los ítems, por su parte, son elementos que aparecen en el área de juego y pueden ser
activados por el jugador para lograr diferentes ventajas. Hay 3 tipos de ítems:
• Disparo doble. Al ser activado por el jugador modifica el armamento actual de la nave
por otro con un disparo doble de mayor daño. En lugar de lanzar un solo proyectil, se
pasa a disparar dos con trayectorias paralelas.
• Disparo triple. Al ser activado por el jugador modifica el armamento actual de la nave
por otro con un disparo triple. Este disparo triple consta de 3 proyectiles. Uno de ellos
es lanzado en línea recta de acuerdo a la dirección de visión de la nave del jugador.
Los otros dos son desviados un cierto ángulo respecto a la trayectoria del primer
disparo.
• Nivel de escudos extra. Aumenta el nivel de escudos de la nave del jugador en una
determinada cantidad. Mediante este aumento se puede llegar a superar el nivel
máximo de escudos.
68
ESPECIFICACIÓN DE REQUISITOS DEL SISTEMA
Otro elemento del entorno es el escenario de fondo que representa dónde tiene lugar la acción.
4.3.3.4 HUD
4.3.3.5 Cámara
4.3.3.6 Colisiones
• Disparos y naves. Los disparos de la nave del jugador sólo afectan a las naves
enemigas, y los de las naves enemigas a la nave del jugador. Cuando un disparo
colisiona con una nave, el disparo desaparece del área de juego y resta al nivel de
escudos de la nave alcanzada el daño que tenía asignado.
• Nave del jugador y naves enemigas. Sólo se consideran colisiones entre la nave del
jugador y las demás naves enemigas, por lo que si dos naves enemigas colisionan no
se ven afectadas de ninguna manera. Una colisión del primer tipo supone que la nave
del jugador y la nave enemiga sean proyectadas en una dirección previamente
calculada. La masa y el vector de velocidad de las naves son tenidos en cuenta para
ello. Después del impacto, ambas naves son invulnerables durante un corto periodo de
tiempo, con lo que no pueden colisionar con cualquier otro elemento del juego.
Además, durante un tiempo inferior al anterior, la dirección de las naves se bloquea,
por lo que estas se desplazan sin control obligatoriamente en la dirección resultante del
impacto sin que puedan siquiera disparar. Los impactos con las naves también reducen
el nivel de escudos.
• Nave del jugador e ítems. Cuando la nave del jugador colisiona con un ítem, este
desaparece y se activa automáticamente. Algunos ítems, como aquellos que cambian
69
PROYECTO FIN DE CARRERA
70
ESPECIFICACIÓN DEL DISEÑO
5.1 INTRODUCCIÓN
Este capítulo tiene como objetivo describir la labor de diseño llevada a cabo para desarrollar el
proyecto. Se muestran el diagrama de estados y el diagrama de clases que han sido creados
para dar respuesta a la especificación de requisitos del sistema.
El diagrama de estados de la figura 5.1 recoge los diferentes estados que atraviesa el juego.
Algunos de ellos, como Multiplayer u OnLineServices no han sido desarrollados y su presencia
en el diagrama es simplemente descriptiva. Cada elemento circular corresponde a un estado,
existiendo un estado inicial y otro final. Las flechas indican qué estados son accesibles desde
cada uno de los estados recogidos.
71
PROYECTO FIN DE CARRERA
• MainIntro. Estado inicial. Dibuja en la pantalla una presentación con los nombres de
los desarrolladores del videojuego y el título del mismo.
• MainMenu. Presenta el menú principal con las diferentes opciones que están
disponibles.
• OnePlayer. Presenta otro menú con las opciones correspondientes al modo individual.
• StoryIntroduction. Se accede tras escoger la opción New Game dentro del estado
anterior. Presenta al jugador una serie de imágenes combinadas con texto que narran
la introducción del argumento del juego.
72
ESPECIFICACIÓN DEL DISEÑO
73
PROYECTO FIN DE CARRERA
• Multiplayer. Muestra las opciones del modo multijugador. Estas opciones no han sido
implementadas en la versión actual del videojuego, por lo que desde este estado sólo
es posible volver al anterior.
• Quit. Estado final. Presenta una pantalla de confirmación para abandonar la aplicación.
Existe una constante de diseño que se repite en todas las clases y que proporciona una
estructura común:
• Método ini(). Una vez que se han especificado todos los parámetros que se van a
emplear, se invoca el método ini() de la clase. Este método inicializa el objeto
74
ESPECIFICACIÓN DEL DISEÑO
comprobando que se hayan asignado los parámetros mínimos necesarios, que sus
valores sean correctos y realizando otras operaciones adicionales.
• Método reini(). Dada que su utilización no es tan básica como en el caso del método
ini(), se omite en muchas de las clases desarrolladas. Se emplea en el caso de que un
objeto pueda experimentar varias inicializaciones a lo largo de su vida. Generalmente
se invoca después de haber llamado al método reend().
• Método update(). Actualiza la lógica del objeto. Este método se invoca en cada ciclo
de ejecución de la aplicación pasando como parámetro el tiempo transcurrido en
segundos respecto al ciclo anterior. Este tiempo es utilizado si la lógica del objeto
depende del tiempo transcurrido.
• Método reend(). Está directamente relacionado con el método reini(). Se usa cuando
un objeto puede tener varias finalizaciones.
• Método end(). Finaliza el objeto. Realiza unas operaciones similares a las que haría el
destructor de la clase. Como ocurre entre reini() y reend(), el método end() se invoca
después de haber inicializado con éxito el objeto. Libera la memoria reservada por el
objeto y lleva a cabo las operaciones necesarias para que la aplicación pueda seguir
funcionando correctamente una vez haya desaparecido.
Los estados están representados mediante la clase State. Es una clase abstracta de la que
heredan las demás clases que representan cada uno de los estados que puede tener el
videojuego. Son estas clases las que incluyen el código concreto para los métodos ini(), reini(),
update(), render(), reend() y end(). Para mantener una mayor claridad en el diagrama de
clases, sólo se han indicado estos métodos para la clase MainIntroState, pero todas las demás
siguen la misma estructura.
Todos los estados tienen una referencia a la máquina de estados en la que están incluidos, por
lo que en cualquier instante pueden solicitar el cambio a un nuevo estado.
75
PROYECTO FIN DE CARRERA
La clase Object3D representa cualquier elemento que pueda formar parte del mundo y por
tanto visualizarse en la pantalla. Como se aprecia en el diagrama, todos los objetos que
aparecen en el mundo heredan de la clase Object3D. Es una clase abstracta que incluye los
métodos necesarios para realizar las operaciones básicas de manipulación de objetos 3D:
trasladar, rotar y escalar. También presenta un referencia al objeto padre, siempre que se haya
especificado alguno. De esta manera, las transformaciones realizadas sobre un determinado
objeto Object3D pueden propagarse a sus hijos.
Mediante la clase GameObject3D se diferencian aquellos objetos que están ligados al área de
juego (naves, ítems, disparos…) de los que no intervienen en la acción propiamente dicha y
con los cuales el jugador no interactúa (elementos del menú, estelas de naves, cámaras…).
Los diferentes menús con los que se navega por las diferentes opciones de la aplicación son
generados a partir de una serie de clases. Estas pueden ser configuradas para añadir un
determinado número de opciones, así como los estados a los que dan lugar si son activadas
dichas opciones.
Actúa como un contenedor que agrupa todos los elementos que conforman el menú: un
conjunto de objetos de tipo SelectionBall y una imagen de fondo. También se encarga de
gestionar los eventos generados por el usuario a medida que pulsa los botones de la
videoconsola para pasar de una opción a otra.
76
ESPECIFICACIÓN DEL DISEÑO
La clase SelectionBall representa una opción determinada dentro del menú. Va acompañada
del nombre del siguiente estado que debe ejecutarse en caso de seleccionarse dicha opción.
La clase LightingBillboard añade al mundo un objeto que representa una luz mediante un
billboard. Tiene asignada una luz dinámica que ilumina a otros objetos del mundo. Dispone de
una gran variedad de parámetros para definir tanto el tamaño como la apariencia del billboard.
Permite visualizar en la pantalla un plano con una textura. Se emplea para mostrar los títulos
de las diferentes opciones del menú.
5.3.4 Comportamientos
Una de las decisiones de diseño más importantes ha sido la inclusión de los comportamientos.
Cada comportamiento representa un fragmento de lógica que puede ser aplicado en principio a
cualquier objeto de tipo Object3D que disponga de los parámetros necesarios.
Es la clase base para todos los demás comportamientos. El atributo priority indica la prioridad
del comportamiento y permite establecer relaciones de dependencia entre los
comportamientos. De esta manera, cuando un Object3D actualice sus comportamientos, los
que tengan un valor de prioridad más bajo se actualizarán antes que el resto de
comportamientos.
Cada comportamiento tiene un atributo target que referencia al objeto al que afecta. Como no
todos los comportamientos son aplicables a objetos de tipo Object3D, en función de la
naturaleza de este atributo target se presentan 3 clases abstractas derivadas de Behaviour:
77
PROYECTO FIN DE CARRERA
Gestiona el disparo de las naves enemigas. Se encarga de determinar cuándo debe disparar
una nave enemiga y controla el número de disparos que lanza.
Gira un objeto un número determinado de grados al cabo de cierto tiempo. El objeto no rota
sobre sí mismo, sino que modifica su dirección de desplazamiento a medida que gira, con lo
que describe una curva. Una vez ha girado el ángulo indicado, sigue avanzando en la nueva
dirección de movimiento.
Desplaza lateralmente un objeto cada cierto tiempo. La dirección del desplazamiento lateral se
calcula rotando el vector de dirección un determinado número de grados. El objeto se mueve
en la nueva dirección hasta cubrir una cierta distancia. Después vuelve a rotar el vector original
cambiando de sentido el giro del ángulo, con lo que vuelve al eje que seguía inicialmente. Este
proceso se repite de manera cíclica.
Sólo permite que el objeto se desplace dentro del área de juego establecida. Si en algún
momento intenta abandonar este área, el objeto se detiene. Se emplea para que la nave del
jugador limite su movimiento al área de juego.
78
ESPECIFICACIÓN DEL DISEÑO
Hace que un objeto persiga a otro cada cierto tiempo. Para ello se modifica el vector de
dirección del objeto perseguidor hasta que apunte hacia la posición que ocupa el objetivo. Este
proceso se repite cíclicamente.
Ladea un objeto a medida que se desplaza lateralmente. El ladeo es gradual, de manera que la
vertical del objeto rota en la dirección en la que se desplaza lateralmente hasta alcanzar un
ángulo máximo. Si el movimiento lateral desaparece, la vertical del objeto vuelve a tomar su
valor original. Se utiliza para lograr una reacción más dinámica de la nave del jugador.
Si la velocidad del objeto es mayor que un valor de referencia dado, se aplica una aceleración
negativa al movimiento del objeto hasta que su velocidad alcanza dicho valor. Se emplea para
que la nave del jugador no se detenga bruscamente cuando se deja de mover el mando
analógico. La nave se desplaza suavemente una corta distancia hasta que alcanza su
velocidad mínima.
5.3.5 Juego
Comprende las diferentes clases que proporcionan la funcionalidad básica para el modo arcade
y aventura.
La clase Game actualiza uno por uno todos los objetos del juego. Dispone de una lista de
objetos CollisionFaction que representa el mundo del juego. Se trata de una clase abstracta,
puesto que se considera que determinados modos de juego pueden necesitar una gestión
diferente, como ocurre con ArcadeGame y AdventureGame. Entre sus métodos cabe destacar
draw2D(), utilizado para dibujar el HUD en la pantalla después de haber dibujado todos los
elementos de la escena.
79
PROYECTO FIN DE CARRERA
El gestor de colisiones explora las diferentes facciones de objetos para comprobar si existen o
no colisiones entre ellos. Como tal, no incluye lógica alguna más que la correspondiente al
recorrido de las diferentes listas. Para cada par de objetos que puedan colisionar invoca al
método update() del CollisionManager que se le haya asignado.
ArcadeCollisionManager tiene como atributo una referencia al objeto ArcadeGame para señalar
el final del juego si como resultado de una colisión la nave del jugador es destruida.
La clase GameHUD es el HUD básico para los diferentes modos de juego que pueda tener la
aplicación. Está formado por una imagen que se superpone a la escena y una fuente para
poder escribir los datos correspondientes. El método draw() es el utilizado para dibujar todos
estos elementos en la pantalla.
80
ESPECIFICACIÓN DEL DISEÑO
ArcadeGame agrupa y actualiza todos los objetos necesarios para que el modo arcade
funcione de acuerdo a los requisitos: gestor de eventos del juego, escenario, HUD y gestor de
colisiones.
Clase factoría que permite crear objetos de diferentes tipos de naves enemigas invocando
cualquiera de sus métodos: generateEnemySpaceship(), generatePursuitEnemySpaceship(),
generateTurningEnemySpaceship() o generateLateralEnemySpaceship(). Cada uno de estos
incluye una serie de parámetros descriptivos para configurar las características básicas de las
naves sin tener que asignar dentro de lo posible valores numéricos.
Todas las clases que representan los distintos tipos de naves del juego hacen un uso
exhaustivo de los comportamientos. En su inicialización, cada uno de estos objetos añade los
comportamientos que lo distinguen de los demás.
Clase abstracta que contiene todos los atributos comunes tanto a las naves enemigas como a
la nave del jugador. Dispone de un gran número de parámetros que permiten configurar
diferentes tipos de naves.
Representa la nave que controla el jugador. Al inicializarse crea y añade los siguientes
comportamientos a su lista de comportamientos: TiltingBehaviour, FitToGameAreaBehaviour,
PlayerControllerdSpaceshipBehaviour y DeceletaringBehaviour. También dispone de un objeto
81
PROYECTO FIN DE CARRERA
de tipo de Observable, de forma que otros objetos puedan subscribirse a la nave del jugador y
recibir notificaciones de esta. Esto resulta necesario cuando la nave es destruida y otros
objetos que mantenían una referencia a ella no deben seguir utilizándola. Es el caso de las
naves o disparos que persiguen a la nave del jugador y del HUD que visualiza su nivel de
escudos y armamento.
Todas estas clases son diferentes tipos de naves enemigas. Se diferencian en los
comportamientos que incluyen al inicializarse. EnemySpaceship, de la que derivan las demás,
es una nave enemiga básica que dispone del comportamiento NormalFireBehaviour.
PursuitEnemySpaceship, TurningEnemySpaceship y LateralEnemySpaceship añaden además
respectivamente los comportamientos PursuitBehaviour, TurningBehaviour y
LateralTranslationBehaviour.
Se emplean para gestionar las estelas que generan las naves al desplazarse. Estas son
creadas mediante un sistema de partículas. La clase EnemySpaceshipTail se crea para añadir
la estela a las naves enemigas. La diferencia con la clase Tail se encuentra en que esta al
finalizarse destruye el sistema de partículas haciendo que la estela no pueda volver a ser
utilizadas. EnemySpaceshipTail controla el número de instancias de su tipo que han sido
creadas y no finaliza la estela hasta la última instancia.
Las naves creadas en la aplicación necesitan de un armamento para que su inicialización sea
correcta. Esta jerarquía de clases es responsable de crear los objetos de tipo de Shot y
añadirlos al mundo en la posición correcta respecto a la nave que dispara.
Es la clase base de la que heredan las demás clases de armamentos. Entre sus parámetros se
encuentran la velocidad y el daño de los disparos. Estos valores se asignan a los objetos Shot
en el momento de su creación. También dispone de una referencia a la nave que tiene
asignado este armamento. De esta se obtiene la posición del mundo en la que deben colocarse
inicialmente los disparos. Este proceso es dependiente de la geometría de cada nave concreta
y de dónde tenga físicamente situados esta los cañones. Por ello se realiza dentro del método
abstracto fire() en las clases hojas.
82
ESPECIFICACIÓN DEL DISEÑO
siempre la dirección de visión que tenía la nave en el momento del disparo. LockingCanon es el
equivalente para los armamentos que lanzan proyectiles que persiguen un objetivo.
Son las clases responsables de disparar los diferentes tipos de armamentos en las naves
enemigas. Al invocar el método fire() en cada una de ellas se crea un cierto número de
disparos del tipo correspondiente que se colocan en el mundo teniendo en cuenta la geometría
de la nave.
Son las clases responsables de disparar los diferentes tipos de armamentos en la nave del
jugador.
Representan los disparos que lanzan las naves. Son tratados como objetos independientes del
objeto Weapons que los crea. La clase PursuitShot además incluye un comportamiento
PursuitBehaviour para que el disparo persiga un determinado objetivo.
Además de los disparos y naves, el área de juego incluye otros dos tipos elementos: ítems y
explosiones.
Es la clase base para los demás ítems del juego. Todos los ítems incluidos afectan
exclusivamente a la nave del jugador, por lo que la clase cuenta con una referencia a un objeto
de tipo PlayerSpaceship. El método abstracto activate() es el encargado de aplicar los efectos
del ítem a la nave del jugador.
Son las clases de los ítems disponibles en el modo arcade. ExtraShieldsItem incrementa el
nivel de escudos de la nave del jugador, mientras que DualCanonItem y TripleCanonItem
cambian el armamento actual de la nave.
Es una clase factoría que crea objetos de tipo ExplosionBillboard. Consisten en una secuencia
de imágenes tratadas como un billboard animado, por lo que al ser reproducidas en el juego
83
PROYECTO FIN DE CARRERA
simulan el efecto visual producido por una explosión. Las explosiones se crean mediante el
método estático createExplosionAt(), que permite definir además la posición inicial y las
dimensiones de la explosión.
Es una clase factoría similar a ExplosionBillboard, pero empleada para simular el efecto visual
producido por un portal. Se utiliza en el modo aventura par aseñalar el punto del mapa por el
que el jugador puede abandonar el escenario.
Una vez el modo arcade ha comenzado, la acción se modifica mediante una serie de eventos
generados a medida que transcurre el tiempo. Cada evento puede ser de una naturaleza muy
variada, pero todos se conciben como un conjunto de operaciones que deben hacerse durante
un espacio de tiempo limitado. Estos eventos son gestionados mediante la jerarquía de clases
presentada en la figura 5.11.
Contiene todos los eventos que pueden afectar al juego y comprueba al actualizarse si algunos
de estos eventos deben ser disparados. Para ello se fija en el tiempo de disparo que cada
evento tiene asignado. También se encarga de dar el tratamiento adecuado a los diferentes
tipos de eventos. Para los ArcadeGameFireForgetEvent, dado que una vez disparados no
vuelven a ejecutarse, los finaliza. En el caso de los ArcadeGameContinuousEvent, sigue
actualizándolos una vez se han disparado hasta que el propio evento indique que puede ser
finalizado.
Es la clase base para los diferentes tipos de eventos del modo arcade. El atributo triggerTime
es la cantidad de segundos que tienen que pasar desde que el juego comienza para que el
evento pueda dispararse. También dispone de un identificador para diferenciar entre los
eventos que sólo se actualizan una vez y los eventos continuos.
El gestor de eventos maneja dos tipos de eventos. Los eventos que sólo se actualizan una vez,
ArcadeGameFireForgetEvent, y los que se actualizan indefinidamente hasta que se indique lo
contrario, ArcadeGameContinuousEvent.
Este evento es el responsable de que las naves enemigas y los ítems vayan apareciendo en el
área de juego a medida que transcurre el tiempo. Presenta una lista objetos de tipo Object3D
84
ESPECIFICACIÓN DEL DISEÑO
que inicializa en el momento en el que se dispara el evento. Es entonces cuando cada uno de
estos objetos se añade al mundo y a la escena.
Este evento se encarga de indicar a la clase que gestiona el juego, ArcadeGame, cuándo se ha
completado la misión en curso. Se trata de un evento continuo dado que para la misión
presentada en la versión actual del juego, la condición de victoria consiste en que a partir del
instante en que se dispara el evento no existan naves enemigas en el mundo.
Las transmisiones de radio que pueden producirse mientras transcurre la acción se llevan a
cabo mediante la funcionalidad proporcionada por esta clase. Almacena de manera ordenada
tanto el texto que debe mostrarse en pantalla como la imagen que debe acompañarlo. También
el tiempo durante el cual cada fragmento de transmisión debe visualizarse. Las transmisiones
se realizan sobre el HUD definido para el juego, por lo que el evento mantiene una referencia a
un objeto ArcadeGameHUD. Una vez se ha visualizado la transmisión completa el evento se
marca como finalizado.
MyEventReceiver es la clase que se pasa al motor cuando se inicializa para gestionar los
eventos que detecta tanto de la entrada como de los elementos del GUI que incorpora. En el
método OnEvent() se proporciona la respuesta correspondiente a cada evento posible. Si bien
es posible sustituir la clase MyEventReceiver por un gestor adecuado a cada estado del juego,
se ha optado por otra solución. MyEventReceiver registra en la clase EventController qué
eventos se han producido. Así, basta consultar este controlador de eventos dentro de cada
estado para saber si un determinado evento ha tenido lugar o no.
El método restore() debe ser invocado al finalizar cada ciclo de la aplicación para marcar todos
los eventos como no producidos.
85
PROYECTO FIN DE CARRERA
TalkingGuy se emplea para los personajes del mapa con los que el jugador puede interactuar y
que generan una conversación. El atributo message es el texto que se visualiza en pantalla
para representar la conversación.
5.3.13 Observer
También se ha implementado el conocido patrón observador para que cuando la nave del
jugador sea destruida, todos los objetos que la estuvieran referenciando sean notificados de
que esa referencia ha dejado de ser válida.
El objeto al que se suscriben los observadores tendrá un objeto de este tipo. Mediante el
método notifyObservers() notifica a todos sus suscriptores que ha ocurrido un determinado
evento. Los observadores, por su parte, también mantendrán una referencia a este objeto
86
ESPECIFICACIÓN DEL DISEÑO
Se vale de los elementos del GUI proporcionados por LTE GE para mostrar una ventana
centrada en la pantalla con el texto indicado. Se utiliza fundamentalmente para mostrar
mensajes al usuario.
Es la clase que se usa para mostrar la pantalla de carga mientras se inicia una misión del
juego. Está formada por una imagen de fondo y un texto que es modificado para indicar el
estado del proceso de carga. También hay que indicar un determinado periodo de tiempo, al
cabo del cual se completa la carga. Si entonces se invoca el método update(), se devuelve el
valor false. Si se hace durante la carga, devuelve true.
El tiempo interviene en la actualización de la mayor parte de los elementos del juego. La clase
TimeController se encarga de acceder al reloj interno de la PSP calcular el tiempo transcurrido
respecto al ciclo anterior. Este es devuelto cada vez que se invoca el método tick().
Incluye una serie de métodos estáticos que pueden ser utilizados por diferentes clases. Uno de
los más útiles es el método logError(), que permite escribir en un fichero de texto una cadena
de caracteres. Una de las técnicas más prácticas para depurar errores de ejecución consiste en
realizar sucesivas invocaciones a logError() para conocer el estado de la aplicación en distintos
puntos del código.
Aunque LTE GE incluye su propia clase para gestionar el sonido, se ha creado una clase
SoundController que proporciona algunas características adicionales, como el fundido de
87
PROYECTO FIN DE CARRERA
sonido. Para ello incluye la clase SoundFader, que o bien aumenta el volumen de un sonido
hasta alcanzar el nivel especificado, o lo decrementa hasta que sea nulo.
Reproduce una presentación formada por una secuencia de imágenes que se van mostrando
en la pantalla de la PSP. El paso de una imagen a otra se lleva a cabo mediante un fundido de
pantalla. Además, la presentación puede ir acompañada por un determinado archivo de sonido
que es eliminado al final de la misma.
Incluye todos los parámetros utilizados por el juego. Consta de un conjunto de atributos
estáticos que definen diferentes parámetros del juego, como el nivel de escudos de las naves
enemigas o la velocidad a la que se desplaza la cámara.
Incluye las rutas a todos los recursos empleados en la aplicación: imágenes, modelos y
sonidos.
Por tanto, resulta imposible añadir nuevas clases para establecer conexiones en modo ad-hoc
y el único modo disponible es el infraestructura. No obstante, la funcionalidad que las clases de
LTE GE ofrecen es también limitada. No se proporcionan métodos para crear sockets que
escuchen un puerto determinado de la PSP, por lo que no se pueden establecer conexiones
entre dos videoconsolas. Para que puedan comunicarse, se necesita un proceso servidor
externo que actúe de intermediario.
88
ESPECIFICACIÓN DEL DISEÑO
El modo multijugador diseñado permite que dos jugadores puedan participar cooperativamente
en el modo arcade. Cada jugador controla una nave y las acciones llevadas a cabo en una de
las videoconsolas se visualizan igualmente en la otra.
Existen distintas técnicas para llevar a la práctica esta idea. En este caso se analiza una de las
más sencillas y que tiene como requisito indispensable un tiempo de respuesta muy reducido
en el envío y recepción de paquetes. Esto se puede conseguir mediante una conexión ad-hoc o
si la comunicación entre las videoconsolas se realiza en una red local.
Uno de los jugadores actúa de servidor y marca en cada ciclo de juego cuál es el tiempo que
ha transcurrido. La otra PSP se comporta inicialmente como un cliente y asume como propio el
tiempo recibido desde el servidor. Además, cada jugador tiene que enviar al otro la dirección en
la que se mueve su nave y si ha disparado o no. De esta manera se logra la sincronización
entre ambas videoconsolas y las pantallas muestran en todo instante la misma acción.
89
PROYECTO FIN DE CARRERA
DummySpaceship
State
+ini() : bool
+end() : bool
MultiplayerServerState MultiplayerClientState
-arcadeGame : ArcadeGame -arcadeGame : ArcadeGame
Spaceship
DummySpaceshipBehaviour
+update() : bool
+ini() : bool
+end() : bool
PlayerControlledSpaceshipBehaviour
PlayerSpaceship
MultiplayerControlledSpaceshipBehaviour
MultiplayerSpaceship
+update() : bool
+ini() : bool +ini() : bool
+end() : bool +end() : bool
90
ESPECIFICACIÓN DEL DISEÑO
91
PROYECTO FIN DE CARRERA
SelectionBallMenu
Object3D -stateMachine : StateMachine
-nextOption() : void
-previousOption() : void
+update() : bool
+ini() : bool
+reini() : bool
+reend() : bool
+end() : bool
SelectionBall
-nextStateName : string
+ini() : bool
+reini() : bool
+reend() : bool
+end() : bool
1
LightingBillboard
1
+ini() : bool 1
+reini() : bool TexturedBox
+reend() : bool
+end() : bool
+update() : bool
+ini() : bool
+reini() : bool
+reend() : bool
+end() : bool
FlyCircleLightingBillboard LightingSelectionBall
1
+reini() : bool +ini() : bool
+reini() : bool
+reend() : bool
+end() : bool
92
ESPECIFICACIÓN DEL DISEÑO
93
PROYECTO FIN DE CARRERA
94
ESPECIFICACIÓN DEL DISEÑO
AdventureGame
+update() : bool
+ini() : bool
+reini() : bool
+reend() : bool
+end() : bool
Game
ArcadeGame
-arcadeGameEventController : ArcadeGameEventController
-gameOver : bool
-missionCompleted : bool
+update() : bool
+ini() : bool
+reini() : bool
+reend() : bool
+end() : bool
1 1
1 1
ArcadeGameBackground «factory»
EnemySpaceshipGenerator
-playerSpaceship : PlayerSpaceship
+update() : bool -world : vector<CollisionFaction>
+ini() : bool
+end() : bool +ini() : bool
+end() : bool
1 1
1 1
TerrainGenerator FlyingCamera
95
PROYECTO FIN DE CARRERA
Object3D GameObject3D
Spaceship
#weapons : Weapons
#reloadTime : float
#tiltingAngle : float
#shields : float
#mass : float
Tail #referenceTranslateSpeed : float
EnemySpaceshipTail #referenceTiltingSpeed : float
+ini() : bool #referenceTranslateAcceleration : float
1 #blockingDirectionTime : float
+ini() : bool +reini() : bool
1 +blockDirection() : void
+end() : bool +reend() : bool
+end() : bool +update() : bool
+ini() : bool
+reini() : bool
+reend() : bool
+end() : bool
PlayerSpaceship
EnemySpaceship
-observable : Observable
#fireRate : float
-minSpeed : float
#fullReloadTime : float
+blockDirection() : void
+blockDirection() : void
+ini() : bool
+ini() : bool
+end() : bool
PursuitEnemySpaceship
-object3DToLock : Object3D TurningEnemySpaceship LateralEnemySpaceship
-object3DToLockObservable : Observable -turningTime : float -lateralTranslationDistance : float
-deleteObserver : DeleteObserver -turningAngle : float -lateralTranslationTime : float
-lockingTime : float -turningSpeed : float -lateralTranslationAngle : float
-pursuitTolerance : float -loop : bool +ini() : bool
-pursuitSpeed : float +ini() : bool
+update() : bool
+ini() : bool
+end() : bool
96
ESPECIFICACIÓN DEL DISEÑO
97
PROYECTO FIN DE CARRERA
GameObject3D «factory»ExplosionBillboard
-world : vector<CollisionFaction>
+createExplosionAt() : bool
+update() : bool
+ini() : bool
+reini() : bool
+reend() : bool
+end() : bool
Item
-playerSpaceship : PlayerSpaceship
+activate() : bool
+ini() : bool «factory»PortalBillboard
+reini() : bool -world : vector<CollisionFaction>
+reend() : bool
+end() : bool +createPortalAt() : bool
+update() : bool
+ini() : bool
+reini() : bool
+reend() : bool
+end() : bool
Object3D
#iAm : string
-behaviours : list<Behaviour>
FlyingCamera +undoLastTranslate() : void SelectionBall
+resetLastTranslate() : void
+translate() : void
+rotate() : void
+scale() : void
+update() : bool
Tail +ini() : bool TexturedBox
+reini() : bool
+reend() : bool
+end() : bool
GameObject3D
Spaceship Shot
#deleteMe : bool
#eraseMe : bool
#world : vector<CollisionFaction>
+update() : bool
+ini() : bool «factory»
Item +reini() : bool ExplosionBillboard
+reend() : bool
+end() : bool
AdventureGuy «factory»PortalBillboard
98
ESPECIFICACIÓN DEL DISEÑO
ArcadeGameEventController
-gameTime : float
+update() : bool
+ini() : bool
+end() : bool
* 1 1
ArcadeGameEvent
-triggerTime : float
+update() : bool
+ini() : bool
+end() : bool
ArcadeGameFireForgetEvent ArcadeGameContinuousEvent
-finished : bool
+update() : bool +update() : bool
+ini() : bool +ini() : bool
+end() : bool +end() : bool
MyEventReceiver
-mapLTEGEToName : map<int, string>
+OnEvent() : bool
1 EventValue
EventController
#name : string
«utility» #value : float
EngineController 1 +restore() : void 1 * +restore() : void
+ini() : bool 1
+end() : bool
InputEventValue
GUIEventValue
-inc : float
-changed : bool
+restore() : void
+restore() : void
99
PROYECTO FIN DE CARRERA
TalkingGuy PlayerControlledGuy
-message : wchar_t
+update() : bool +update() : bool
+ini() : bool +ini() : bool
+end() : bool +end() : bool
Observable
Observer * 1
+registerObserver() : void
AdventureGuy +notify() : void +unregisterObserver() : void
+notifyObservers() : void
+update() : bool
+ini() : bool
+reini() : bool
+reend() : bool
+end() : bool
DeleteObserver
MessageWindow «utility»
SoundController StoryTeller «utility»
-musicVolume : float GameParameters
+update() : bool -fxVolume : float
+ini() : bool +update() : bool
+fadeIn() : void +ini() : bool
+end() : bool +fadeOut() : void +end() : bool
+playFX() : void
+playMusic() : void
TimeController +stop() : void
+pause() : void LoadingScreen «utility»
+update() : bool FilePaths
+tick() : unsigned int +ini() : bool
+ini() : bool
+end() : bool
+update() : bool
«utility» +end() : bool
1
GameUtils
1
+fromCharToWChar() : wchar_t
+printDebug() : void SoundFader
+logError() : void
+radiansToDegrees() : float
+insideOfGameArea() : bool +update() : bool
+ini() : bool
+end() : bool
100
CONSIDERACIONES SOBRE LA IMPLEMENTACIÓN
6. CONSIDERACIONES SOBRE LA
IMPLEMENTACIÓN
6.1 INTRODUCCIÓN
Existen múltiples técnicas y diseños para implementar un juego de este tipo. Cada alternativa
presenta sus propias ventajas e inconvenientes. A continuación se describe cómo se han
conformado en el juego los diferentes elementos tratados en la especificación del diseño.
(2) ACTUALIZAR
EL TIEMPO
(4) DIBUJAR
En cada nuevo ciclo del bucle se reinicia la escena limpiando de la pantalla todos los
elementos dibujados. Después se actualiza el tiempo que ha transcurrido respecto a al ciclo
anterior y dicha información se emplea para actualizar el estado que actualmente se esté
tratando. Haciendo la lógica del estado dependiente del tiempo se consigue que el
comportamiento real del juego sea el mismo independientemente de la velocidad del
procesador. Finalmente, se dibuja en pantalla la escena resultante.
101
PROYECTO FIN DE CARRERA
Los elementos del juego (naves, ítems, disparos…) deben situarse en el espacio 3D generado
por el motor gráfico. Toda la acción tiene lugar siempre sobre un plano, de manera que el
movimiento del jugador y su interacción con el mundo quedan restringidos a dos coordenadas.
En este caso, la nave del jugador y los demás elementos del juego se sitúan sobre el plano XZ
(teniendo en cuenta la disposición de los ejes realizada por LTE GE). El área de juego es
rectangular y está definida por una determinada anchura y altura. Su centro se encuentra
inicialmente ligeramente desplazado respecto al vector que indica el objetivo de la cámara. No
obstante, el centro del área de juego se mueve con la velocidad de la cámara en línea recta en
el eje Z. Dado que el área de juego modifica su posición en el mundo, la ubicación de todos los
demás elementos del juego se establece de acuerdo a sus coordenadas en cada ciclo del
juego.
Para conseguir una perspectiva cenital la cámara se instala en el centro del área, pero con
valor positivo para la coordenada Y, de manera que se simula un efecto de zoom. Además, se
desplaza en el eje Z negativo para que la sensación de profundidad sea mayor.
Más allá del área de juego se establece una zona denominada umbral en la que los diferentes
elementos del juego se van creando. Dado que la cámara sólo abarca el ára de juego, la zona
umbral queda fuera de la percepción del jugador. Si no se utilizara esta zona, los objetos que
se deben presentar al jugador aparecerían repentinamente en el área de juego, perdiéndose la
sensación de estar volando a través del escenario. Una vez que un elemento volatil del mundo
abandona la zona umbral, es destruido.
102
CONSIDERACIONES SOBRE LA IMPLEMENTACIÓN
La nave controlada por el jugador puede moverse en cualquiera de las direcciones indicadas
en la figura 6.3, aunque nunca podrá abandonar el área de juego y verá interrumpido su
desplazamiento en el momento que intente atravesarla. Para lograr un recreación más realista
del movimiento, se ha aplicado una deceleración al vector de velocidades del objeto en el
momento en el que el jugador deja de moverse en alguna dirección. De esta manera, la nave
disminuye gradualmente su velocidad hasta detenerse. Otro detalle encaminado en la misma
línea es el efecto de ladeo que experimenta a medida que se desplaza lateralmente. La nave
rota ligeramente sobre el eje Z con lo que emula el movimiento de un avión en el aire.
La nave del jugador se desplaza siempre con una velocidad mínima en el eje Z positivo. Esta
velocidad viene dada por la velocidad mínima con la que la cámara se mueve por el escenario.
Por tanto, la nave del jugador nunca puede quedar fuera de la vista de la cámara.
103
PROYECTO FIN DE CARRERA
6.3.3 Escenario
El escenario está recreado mediante un terreno irregular generado con ayuda de LTE GE y un
mapa de alturas. Este mapa consiste en una textura con diferentes colores dentro de una
escala de grises. El color blanco representa la altura máxima del terreno, mientras que el negro
equivale a un plano. Los colores intermedios crean diferentes desniveles.
Dado que crear un único terreno irregular lo suficientemente grande para cada misión supone
una carga de procesamiento excesiva para el motor gráfico, se ha optado por usar dos terreno
que se encadenan uno detrás de otro. Inicialmente la cámara abarca el primer terreno y no se
necesita el segundo terreno que permanece oculto. Sin embargo, a medida que se desplaza
por el escenario y se acerca al límite del terreno hay que mostrar un segundo terreno para
garantizar la continuidad del escenario. Después, cuando el primer terreno abandone el campo
de visión de la cámara, se oculta. Este proceso se repite de manera cíclica, con lo que el
jugador tiene la sensación de estar explorando un escenario completo.
Utilizar sólo un mapa de niveles para generar el terreno puede afectar negativamente a la
inmersión del jugador en la acción que se desarrolla. Podría percatarse fácilmente de que
realmente se está repitiendo el mismo terreno una y otra vez. Para mitigar este problema se
emplean dos mapas de niveles preparados para que el relieve entre ambos sea continuo.
104
CONSIDERACIONES SOBRE LA IMPLEMENTACIÓN
Los eventos hacen referencia a todos aquellos sucesos que acontecen en el transcurso del
juego y lo modifican. Se disparan en algún instante en el tiempo y su efecto depende
totalmente del tipo de evento, pudiendo ir desde la simple creación de un objeto hasta la
visualización de una transmisión de radio entre varios personajes. En el proyecto se han
definido dos tipos básicos de eventos:
• Eventos continuos. Son eventos que tienen efecto durante un periodo de tiempo
indefinido.
Como los diferentes eventos que tienen lugar se crean al comienzo del juego, su número
puede llegar a ser notoriamente elevado. Para facilitar su manejo, el gestor de eventos los
ordena en el tiempo al inicializarse de manera que si un determinado evento no puede
dispararse todavía, no seguirá comprobando los restantes, ya que son posteriores.
105
PROYECTO FIN DE CARRERA
Cada estado requiere una gestión diferente dependiendo de su cometido. Si bien los estados
correspondientes a los menús no encierran una gran complejidad, no ocurre lo mismo con el
estado encargado de la ejecución del juego.
Los diferentes objetos del mundo pueden colisionar entre si dando lugar a efectos
dependientes de su naturaleza. Así pues, si un disparo alienígena colisiona con una nave
aliada, disminuirá su nivel de escudos. Pero si la nave aliada colisiona con una nave enemiga,
además será proyectada en una dirección resultante del impacto.
El primer paso para gestionar las colisiones consiste en detectarlas. Para ello se ha seguido
una técnica conocida como bounding-box, que básicamente encierra cada modelo 3D en un
cubo lo más ajustado posible a su geometría. Después, las colisiones se calculan en función de
la posición de dichos cubos, lo cual simplifica sustancialmente los cálculos.
Debido al gran número de elementos que pueden estar presentes en el área de juego en un
momento determinado (disparos, naves, ítems…), la gestión de las colisiones entre estos
necesita ser tratada con especial cuidado para que el rendimiento del juego no se vea afectado
negativamente.
La solución por la que se ha optado consiste en crear facciones de objetos. Todos los objetos
pertenecientes a una determinada facción se consideran amigos, por lo que no es necesario
comprobar si colisionan entre ellos. Además, es posible indicar para una determinada facción
cuáles son las facciones con las que se deben comprobar las colisiones. Así por ejemplo, dado
106
CONSIDERACIONES SOBRE LA IMPLEMENTACIÓN
que no existe interacción alguna entre los disparos de las naves aliadas y los de las enemigas,
no se especificará que sus facciones detecten colisiones entre ellas. También hace posible que
la comprobación sea unidireccional. Es decir, sólo se tendrá en cuenta que, por ejemplo, una
nave impacta con un disparo, pero no que un disparo impacta con una nave. De esta manera,
se consigue evitar una importante carga de trabajo frente a una solución basada en la fuerza
bruta (gestionar todo con todo).
Las facciones establecidas y las relaciones entre ellas son las recogidas en la tabla 6.1.
Disparos alienígenas
perseguidores.
Naves alienígenas.
Ítems.
Disparos alienígenas
perseguidores.
Naves alienígenas. -
Disparos alienígenas. -
Disparos alienígenas -
perseguidores.
Ítems. -
Sin colisión. -
6.4.1 Escenario
107
PROYECTO FIN DE CARRERA
Debido a diversos problemas durante la compilación del mapa desarrollado, las sombras no
son proyectadas correctamente sobre algunas superficies del escenario, que permanecían
completamente oscuras. Para solucionarlo ha sido necesario iluminar dinámicamente el mapa,
por lo que el movimiento del jugador por el escenario no resulta tan fluido como se esperaba.
El flujo de ejecución del modo aventura es un subconjunto del comentado en el modo arcade,
por lo que sólo se muestra el diagrama correspondiente.
ACTUALIZAR EL
MUNDO
ACTUALIZAR LAS
COLISIONES
También se lleva a cabo una gestión de colisiones mediante facciones para poder determinar
cuándo el jugador llega a un punto de salida. Al contrario que en el modo arcade, esta
comprobación no se realiza mediante la técnica de boundig-box, sino calculando la distancia
entre las posiciones que ocupan el jugador y el portal.
Las facciones establecidas y las relaciones entre ellas son las recogidas en la tabla 6.2.
Jugador. Portales.
Portales. -
Soldados. -
108
PLAN DE PRUEBAS
7. PLAN DE PRUEBAS
7.1 INTRODUCCIÓN
Durante la realización del proyecto se han efectuado numerosas pruebas para asegurar el nivel
de calidad del código y tratar de minimizar en la medida de lo posible los fallos.
7.2 OBJETIVOS
Los objetivos perseguidos por el plan de pruebas son:
• Segunda fase. Consta de sucesivas pruebas de unidad y del sistema para comprobar
el correcto funcionamiento de los módulos desarrollados. Tras implementar uno de los
elementos del videojuego se somete a una serie de pruebas de unidad para garantizar
la inexistencia de fallos. Después, a medida que se van implementando nuevos
módulos, se aplican las pruebas de integración correspondientes.
109
PROYECTO FIN DE CARRERA
Estas 3 fases se desarrollan secuencialmente, de manera que hasta que no finalice el plan
de pruebas de la primera fase no se procede con la siguiente.
• Primera fase. Termina cuando las pruebas sobre los aspectos de LTE GE
imprescindibles para el desarrollo de la aplicación tienen éxito.
• Segunda fase. Inicialmente se consideró que terminaría cuando todos los módulos
probados individualmente y posteriormente integrados en el sistema no tuvieran errores
de ejecución. Después, en base a los resultados obtenidos y a su relación con la
primera fase, se considera que la fase finaliza cuando las pruebas de unidad tienen
éxito y las del sistema permiten jugar de principio a fin por los menos una vez la misión
incluida en el juego.
7.5 RESULTADOS
Los resultados de la primera fase cumplen los requisitos mínimos del videojuego, por lo que se
acepta el motor LTE GE como el conjunto de librerías a utilizar para el desarrollo de la
aplicación.
110
PLAN DE PRUEBAS
111
PROYECTO FIN DE CARRERA
Aunque la mayor parte de los resultados mostrados en la tabla 7.2 no son negativos, todos
ellos son obtenidos a partir de pruebas de unidad. Al integrar los diferentes módulos y
comenzar las pruebas del sistema los resultados son variables. Aparecen fallos de ejecución al
cargar recursos externos como texturas, modelos o sonidos. También al liberar la memoria
reservada para estos.
A pesar de que ciertas ejecuciones fallan, la mayoría de ellas permiten jugar completamente la
primera misión del juego. Sin embargo, si se intenta volver a jugar después de su finalización,
la aplicación se bloquea. Finalmente se decide continuar a pesar de los errores siempre que se
pueda mostrar la funcionalidad de la aplicación por lo menos una vez.
112
PLAN DE PRUEBAS
y disparos.
Carga del mapa creado con Negativo. Modo aventura. La aplicación se bloquea
Q3Radiant. al cargar el mapa. Se vuelve a crear el
mapa realizando pruebas de manera
incremental. Finalmente se consigue una
versión estable.
Algunas de las pruebas recogidas en la tabla 7.3 fueron realizadas por el mismo usuario. No
todas las observaciones terminaron por convertirse en modificaciones reales del juego. Las que
fueron obtenidas a partir de resultados positivos se evaluaron y consultaron con otros usuarios
para comprobar si se trataba de una apreciación exclusivamente personal.
113
PROYECTO FIN DE CARRERA
Usuario 5. Negativo. Modo arcade. El daño recibido por lo impactos con otras
naves es bajo. Unido al largo tiempo de invulnerabilidad
hace que la misión pueda completarse recibiendo
impactos continuamente.
Usuario 6. Positivo. -
Usuario 7. Positivo. -
Usuario 8. Positivo. -
114
MANUAL DE USUARIO
8. MANUAL DE USUARIO
8.1 INTRODUCCIÓN
Este manual describe la instalación y uso del videojuego Air Warriors.
• Multiplayer. Lleva al menú del modo multijugador. En la versión actual de Air Warriors
no existe ninguna opción multijugador disponible.
115
PROYECTO FIN DE CARRERA
Las opciones que no están disponibles aparecen ensombrecidas. Al pulsar el botón (X) sobre
ellas se muestra un mensaje informativo al respecto.
116
MANUAL DE USUARIO
• New Game. Comienza una nueva partida y pasa a mostrar la introducción de la historia
del juego.
Las opciones Ad-Hoc e Infrastructure requieren tener activado el dispositivo WI-FI de la PSP.
• Ad-Hoc. Comienza una nueva partida multijugador con otro jugador estableciendo una
conexión directa entre las videoconsolas. No está disponible en la versión actual de Air
Warriors.
117
PROYECTO FIN DE CARRERA
La interacción con los elementos de la ventana se lleva a cabo mediante el cursor. Se mueve
con el mando analógico, mientras que el botón (X) tiene el mismo efecto que si se pulsara el
botón izquierdo de un ratón.
118
MANUAL DE USUARIO
Se pueden redefinir los controles por defecto para que se adapten a las preferencias de cada
usuario. Si bien se muestra una lista de controles considerable, en la versión actual de Air
Warriors sólo se emplea la acción Normal Fire. El movimiento de la nave del jugador se
controla con el mando analógico.
• Accept. Guarda los cambios y vuelve al menú anterior. Es necesario que todos los
controles tengan un botón válido asignado.
119
PROYECTO FIN DE CARRERA
Las opciones de Ranking y Downloads requieren tener el dispositivo WI-FI y una conexión a un
punto de acceso con Internet.
• Ranking. Descarga del servidor de servicios en línea una lista con las puntuaciones
conseguidas por los jugadores en los diferentes mapas del modo multijugador. No está
disponible en la versión actual de Air Warriors.
8.5.1 Historia
Air Warriors cuenta con una compleja trama que combina un escenario apocalíptico con
conspiraciones políticas y militares, así como con la llegada de una enigmática raza alienígena.
A continuación se incluye la introducción del modo individual que plantea toda una serie de
nuevos interrogantes al jugador:
120
MANUAL DE USUARIO
En el año 2047 las peores pesadillas de la humanidad se han hecho realidad y han llevado
al planeta a la mayor crisis internacional conocida hasta el momento. Los recursos naturales
se agotan rápidamente y el cambio climático hace estragos en los países más pobres.
Fruto de su egoísmo, las principales potencias de la Tierra hicieron caso omiso de las
advertencias de la comunidad científica, y ahora que el deshielo de los polos se ha
completado, los políticos se afanan en discutir quiénes han sido los responsables de esta
situación.
Ningún gobierno se ve capaz de controlar la situación y por si fuera poco, la recién creada
Unión de Países Asiáticos (UPA) pone sus ojos sobre Oriente Medio como la única salida a
sus graves problemas de superpoblación y escasez de recursos.
Países como Japón o Corea del Sur intentan mantenerse al margen de la UPA, pero
cualquier signo de resistencia es considerado una amenaza y pronto son invadidos sin que
el resto de países del mundo pueda hacer algo más que preocuparse por sus propios
problemas.
Un falso conflicto militar con Irán creado por los servicios de inteligencia de la UPA es
aprovechado para iniciar la invasión de Oriente Medio y llegar hasta las fronteras de Irak,
ahora protectorado del gobierno americano. El avance asiático parece no tener fin y los
Estados Unidos recurren a la OTAN en busca de apoyo diplomático.
Sin embargo, el miedo a iniciar una 3ª Guerra Mundial provoca interminables negociaciones
en los despachos y al terminar el año, la UPA no sólo domina Oriente Medio, sino también
el 80% del continente africano, que paradójicamente atesora ahora más de la mitad de los
recursos naturales disponibles en el planeta.
La balanza cae del lado asiático cuando las débiles defensas sudamericanas caen en Marzo
del 2049, abriendo las puertas a una invasión por tierra, mar y aire de los Estados Unidos.
Cuando el final de la 3ª Guerra Mundial parecía próximo, comienzan a llegar noticias sobre
la aparición de enormes cubos flotantes sobre los principales lugares sagrados del mundo
121
PROYECTO FIN DE CARRERA
(La Meca, Jerusalén, Stonehenge, las pirámides de Egipto, el monte Fuji...). La atención de
la UPA se centra en estos misteriosos objetos alienígenas de los que surgen miles de naves
hostiles que arrasan cualquier forma de vida.
A pesar de que las fuerzas asiáticas parecen ser capaces de frenar las primeras oleadas,
pronto sucumben ante la superioridad numérica de su enemigo y el horror se propaga por
todo el planeta. Ningún país logra evitar el conflicto alienígena y el exterminio de la raza
humana pasa a convertirse en cuestión de minutos es una realidad. Los gobiernos
desaparecen y el orden es sustituido por el caos descontrolado.
5 años después…
Sólo algunas bases militares ocultas en montañas o bajo tierra han sobrevivido al ataque. Al
no poder comunicarse, cada núcleo de resistencia cree que es el último vestigio de la
humanidad y comienza a organizarse para analizar la situación en el exterior tras 5 años de
silencio.
El soldado Michael McBride es un piloto del escuadrón de naves W-01 de la base militar de
White Rock a punto de descubrir un mundo totalmente nuevo.
8.5.2 Personajes
La historia de Air Warriors evoluciona de la mano de diversos personajes con sus propias
características e intereses. Aquí se presentan sólo algunos de ellos:
8.5.3 Naves
122
MANUAL DE USUARIO
inútiles ante las naves enemigas. Tras 5 años de intenso trabajo por parte de los ingenieros de
White Rock, se creó el W-01. La primera nave de combate del ejército americano. Todavía se
trata de un prototipo, pero se ha convertido en la principal esperanza para los refugiados de
White Rock.
Las naves alienígenas se caracterizan especialmente por su forma de dardo, de ahí que hayan
pasado a ser conocidas comúnmente como dardos:
• Dardo. El dardo es la nave básica del ejército invasor. Rápida y maniobrable, pero con
un nivel de escudos bajo. Para paliar esta desventaja suelen atacar en grupos
numerosos.
• Doble dardo. Es una nave más resistente que el dardo básico, aunque también más
lenta. Lleva incorporados dos cañones con una potencia de disparo superior al dardo
básico.
123
PROYECTO FIN DE CARRERA
• Sembrador de muerte. Se trata de una nave con un elevado poder destructivo. Si bien
su nivel es escudos es bastante reducido, a medida que avanza siembra el campo de
batalla con unos artefactos explosivos capaces de perseguir al jugador.
8.5.4 Ítems
Son elementos del juego que aparecen en forma de cajas con un cierto identificativo. Están al
alcance del jugador por un tiempo limitado, por lo que no debe dejarlos pasar si pueden serle
de utilidad.
Cuando el jugador entra en contacto con estas cajas, se activa alguna de las ventajas descritas
a continuación:
• Disparo doble. Cambia el armamento actual de la nave del jugador por otro con un
disparo doble. El nuevo armamento es más lento que el disparo individual y tiene una
124
MANUAL DE USUARIO
menor cadencia, pero realiza más daño. Resulta especialmente útil para hacer frente al
elevado nivel de escudos de los dobles dardos. Además, en determinadas ocasiones
puede destruir varios objetivos con una sola ráfaga.
• Disparo triple. Cambia el armamento actual de la nave del jugador por un disparo
triple. El nuevo armamento es tan rápido como el disparo individual y abarca un ángulo
de fuego mayor, pero tiene un nivel de daño inferior. Cada ráfaga de disparos tiene
más posibilidades de alcanzar algún objetivo.
125
PROYECTO FIN DE CARRERA
Tras escoger la opción New Game se presenta la introducción de la historia del juego. Se
suceden una serie de imágenes que narran los hechos más importantes acontecidos en la
trama. Las imágenes avanzan secuencialmente transcurrido un tiempo arbitrario, aunque el
propio usuario puede pasar de una a otra manualmente pulsando el botón (X). La presentación
puede ser omitida en cualquier momento pulsando el botón (START).
126
MANUAL DE USUARIO
Se comienza a cargar la primera misión del juego. Mientras tanto se visualiza el título de la
misión actual junto con una breve descripción de la misma. Cuando el texto sobre el estado de
la carga cambie a Done, al pulsar el botón (X) da comienzo la misión.
127
PROYECTO FIN DE CARRERA
1. Disparos. Los disparos del jugador son de color rojo, mientras que los de las naves
enemigas son de color azul, como su estela. Cada impacto recibido de los disparos
enemigos reduce el nivel de escudos de la nave del jugador.
Utiliza su propio sistema de control que no puede ser redefinido en las opciones del juego. La
cámara adopta una vista en primera persona desde los ojos de McBride, el protagonista del
juego. Para girar la cabeza y observar los elementos que rodean al jugador se emplea el
mando analógico, mientras que el desplazamiento se consigue pulsando los botones de
dirección (▲, ▼, ►, ◄). Para subir por las escaleras es necesario mirar ligeramente hacia
arriba.
128
MANUAL DE USUARIO
1. Portal. Representa un punto de salida del mapa actual. Cuando el jugador entra en él,
abandona el escenario y vuelve al menú del modo individual.
129
PROYECTO FIN DE CARRERA
Al interactuar con un elemento del escenario se muestra una ventana con un mensaje que
describe el resultado de la acción. En el caso del General, se visualiza la conversación que
mantiene con el jugador.
• Tras finalizar la misión del modo arcade se debería volver a la pantalla del menú de
juego individual. Esto no siempre ocurre así, pero la PSP puede bloquearse en ese
momento.
• Tras finalizar cualquier de los modos de juego no se puede volver a iniciar ninguno de
estos, siendo necesario cerrar la aplicación y volver a iniciarla.
130
CONCLUSIONES
9.CONCLUSIONES
El proyecto fin de carrera como su nombre claramente indica es el último proyecto de una
carrera universitaria. Un proyecto que hemos asumido como el punto y final para una aventura
académica que comenzó hace ya 5 años y que marcará en gran medida nuestro camino en el
mundo laboral. ¿Por qué un videojuego para la plataforma PSP? Cada uno de nosotros tiene
sus propias motivaciones, pero ante todo subyace el deseo por trabajar en aquello con lo que
disfrutamos y qué mejor manera de hacerlo que asumiendo el reto que entraña una tecnología
relativamente nueva.
El motor gráfico escogido (LTE GE) demuestra que actualmente es posible disponer de un
conjunto de librerías 3D no comerciales casi tan elaboradas y estables como las que hay
disponibles en un PC. Esto unido a las diferentes aplicaciones disponibles para la depuración
del código reafirma la excelente labor realizada por la comunidad de usuarios que pone todas
estas herramientas a disposición de aquellos interesados en desarrollar contenido
personalizado.
Aunque el diseño y posterior implementación del videojuego se han visto afectados por algunas
limitaciones inesperadas del motor gráfico, se ha conseguido completar con éxito el objetivo
planteado inicialmente: desarrollar un videojuego funcional para la plataforma PSP. La
arquitectura basada en una máquina de estados ha resultado ser una decisión de diseño
fundamental para estructurar el flujo de ejecución. Igualmente se ha planteado la base de un
sistema basado en comportamientos para los diferentes nodos del grafo de escena. Al aislar
los complejos comportamientos lógicos en unidades asignables más pequeñas se ha
conseguido un diseño más claro y flexible.
Finalmente este proyecto nos ha permitido asumir otros roles además de los ligados al
desarrollo. También hemos sido responsables de su planificación y organización. Sin duda, la
experiencia adquirida durante estos 3 meses será de inestimable ayuda en el futuro.
131
GLOSARIO
10. GLOSARIO
CLUT Colour Look-Up Table. Dispositivo que convierte en colores físicos los
números lógicos de colores almacenados en cada píxel de la memoria de
vídeo. Así pueden ser visualizados en la pantalla de la PSP.
Custom Firmware modificado ajeno a Sony que permite utilizar toda la funcionalidad
Firmware de un firmware oficial evitando sus restricciones.
DMA Direct Memory Access. Tecnología que permite que un dispositivo hardware
pueda acceder directamente a la memoria del sistema independientemente
de la CPU.
DRAM Dynamic Random Access Memory. Tipo de memoria RAM que almacena
cada bit en un capacitador dentro de un circuito integrado.
Downgrade Proceso consistente en sustituir una versión de firmware de la PSP por otra
más atrasada.
133
PROYECTO FIN DE CARRERA
Exploit Código diseñado para aprovechar algún fallo, error o vulnerabilidad del
sistema y ganar control sobre la PSP.
GNU GNU’s Not Unix. Sistema operativo compuesto exclusivamente por software
libre. Su nombre viene dado porque su diseño se parece a Unix, aunque
difiere de este en que es software libre y además no contiene código de Unix.
GUI Graphical User Interface. Tipo de interfaz de usuario que permite interactuar
con un computador mediante un entorno gráfico (iconos y etiquetas de texto).
Homebrew Aplicaciones desarrolladas sin usar el SDK oficial por los usuarios de la PSP.
LTE GE LTE Game Engine. Nombre del conjunto de librerías que conforman el motor
para el desarrollo de videojuegos creado por LTE Studios.
134
GLOSARIO
PFX Playstation Fixed eXecutable. Archivo ELF con un formato especial que lo
ubica en una posición de memoria predeterminada. El núcleo de la PSP
intentará cargarlo en la dirección especificada. Si no lo consigue, el proceso
de carga fallará.
UMD Universal Media Disc. Tipo de disco óptico desarrollado por Sony para la
PSP. Puede almacenar hasta 1.7 GB.
USB Universal Serial Bus. Bus serie estándar para la comunicación entre
dispositivos.
VFPU Vector Floating-point Unit. Componente hardware diseñado para operar con
vectores y matrices.
135
PROYECTO FIN DE CARRERA
VRAM Video Random Access Memory. Tipo de memoria DRAM utilizada para
almacenar el mapa de bits (frame buffer) que posteriormente se dibuja en la
pantalla.
136
BIBLIOGRAFÍA
11. BIBLIOGRAFÍA
[1] BARREDO, A. CASTILLO, C. (2006). Gestión y planificación de proyectos.
Universidad de Deusto.
137
AGRADECIMIENTOS
12. AGRADECIMIENTOS
Para terminar la documentación de este proyecto nos gustaría agradecer la ayuda recibida a
nivel personal y académico de diferentes personas.
139