¡A hardcodear!

Publicado el Viernes 2 julio 2010 en DirectX por Thund

Basta de presentaciones, resúmenes e instalaciones varias, vamos a lo que nos gusta que es picar código y ver punticos de colores moviéndose en la pantalla. Tenía pensado en este post enseñar cómo se hace un Modern Warfare 2 pero luego me dije, si eso para esta gente estará chupao, mejor explico cosas más difíciles e interesantes como mostrar una ventana en Windows… Tranquilidad, no es eso realmente lo que voy a hacer, hay millones de tutoriales en la Red para aprender a usar la API de Windows o la MFC para manejo de recursos de intefaz de usuario. Voy a exponer cómo he organizado el proyecto que servirá de base para el resto de ejemplos en este blog.

Estado inicial y Objetivos

Lo primero que he hecho ha sido crear un proyecto Win32 de tipo Windows Application, sin ATL ni MFC (como ya sabéis, la versión Express de VS no las incorpora, ni falta que nos hace). Automáticamente tendremos un fichero .CPP (entre otros) con una serie de definiciones y 5 funciones globales:

  • _tWinMain
  • MyRegisterClass
  • InitInstance
  • WndProc
  • About

Todas ellas están relacionadas con lo mismo, la inicialización y control de la ventana principal, que incluye la ventana-hija típica "Acerca de…" ("About…"). El objetivo es que al final tengamos una función de entrada WinMain que contenga la llamada a la inicialización del sistema y una sentencia return. Además, no debe quedar ninguna definión o constante global.

Transformación

Como a la gente de C++ nos gusta la POO más que a Pedobear la niña de Lazy Town, la idea es aislar el código que será común para todos los futuros tutoriales, encapsulándolo en una clase, de forma que queden mucho más limpios y nos podamos concentrar únicamente en el tema a tratar. Lo único que he hecho ha sido copypastear las funciones a otro archivo y cargarme aquello que no necesitamos, concretamente todo lo relativo a la ventana-hija y el menú superior (File y About). Por tanto, he eliminado lo siguiente:

  • La función About
  • La invocación al cuadro de diálogo de la ventana About, en WndProc
  • Los aceleradores del menú, en _tWinMain
  • Recursos usados por la ventana About, en el archivo .RC

El código ha sido trasladado a una clase que llamaremos EGWindowsHelper y que encapsulará toda la funcionalidad relacionada con el S. O.. En la siguiente tabla pueden verse las conversiones y algunos métodos adicionales que nos serán útiles:

Ámbito global Clase EGWindowsHelper Comentario
_tWinMain Initialize Se mantiene la función global por ser el punto de entrada a la aplicación, pero se mueve su contenido.
MyRegisterClass RegisterWindowClass  
InitInstance InitInstance  
WndProc WndProc Noten los noobs de C++ que es necesario declararla como static ya que no es lo mismo un método estático, que es tratado como una función global encerrada en el ámbito de clase, que un método no estático, que sería considerado un miembro de clase. La referencia al método se realiza de forma distinta y la estructura WNDCLASSEX (en RegisterWindowClass) sólo acepta una referencia a función no-miembro.
  SetFunctionCalledByWndProc Establece la función llamada por la función de callback del bucle de mensajes de Windows cada vez que llega un mensaje a la aplicación.
  GetWindowClassIdentifier Obtiene el identificador de clase de la ventana principal.
  GetWindowHandler Obtiene el manejador de la ventana principal.

 

Modo de uso

He añadido un constructor que acepta los mismos parámetros que la función _tWinMain, de forma que tan sólo hay que pasar tales valores cuando se instancie la clase EGWindowsHelper, y ya tenemos ventana y aplicación funcionando. El .CPP principal queda así de sencillo:

#include "stdafx.h"
#include "EndlessGameEnvironment.h"

using namespace EndlessGame;

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    EGWindowsHelper* windowsHelper = new EGWindowsHelper(hInstance, hPrevInstance, lpCmdLine, nCmdShow);

    return 0;
}

 

Descargas

¡Y eso es todo! Podéis descargarlo desde aquí:

EndlessGameEnvironment.zip (23 Kb)
 

Etiquetas: ,

Empecemos por el principio…

Publicado el Martes 29 junio 2010 en DirectX por Thund

Puede que tengáis las mismas ganas de hincarle el diente a DirectX 11 que yo, pero antes de meternos en harina vamos a necesitar un entorno sobre el que trabajar. Sé que sois todos muy listos pero nunca viene mal tener recogidos en un sitio los pasos a seguir para instalar todo aquello que necesitamos, así evitamos perder el tiempo buscando la próxima vez. Dado que vamos a trabajar con DX11, presupondré que estáis leyendo esto desde un Windows 7.

Microsoft Visual Studio 2010

La razón por la que elijo esta versión responde únicamente a su novedad, por ir acostumbrándome al nuevo IDE. En éste momento alguien saltará diciendo: "¡Pero gañán, si es prácticamente igual!". Totalmente de acuerdo, salvo los colorines no se han roto demasiado la cabeza. Que sí, que internamente lo han reconstruido usando WPF (Windows Presentation Foundation) y MEF (Managed Extensibility Framework) pero, tristemente, en lo único que lo he notado ha sido en lo borroso que se ven las letras del editor de texto… es un problema conocido y que aún no tiene solución oficial (aunque Microsoft lo tenga como fixed, es una trola que sólo se tragan los bizcos), WPF renderiza mal las letras pequeñas, y si eres de los que usa fondo negro, como yo, tanto peor. Más o menos uno se acostumbra (a base de ganar dioptrías), lo he dejado en la fuente por defecto, Consolas, aunque a le he aumentado el tamaño a 11. El resto de la interfaz, según opiniones varias, es como VS2008 + Resharper, si bien los creadores del plug-in se defienden del plagio como pueden. De cualquier modo, a los programadores de C++ eso nos la trae floja. Tanto nos la suda que voy a pasar de enumerar las nuevas virtudes de VS, primero, porque no es la temática ni del blog ni del post y, segundo, porque salvando alguna leve mejora del IntelliSense (muy leeeve muy leeve….), han mejorado bastante poco el apoyo al desarrollo de C++ nativo; sinceramente, el subrayado rojo molesta más que ayuda. Tanto que anunciaban que iban a poner el soporte a C++ a la altura del de C# o VB.Net… falacias. Al menos espero que hayan afinado, aún más, la optimización de rendimiento del compilador (que ahora es MSBuild). Es digno de mención que VS2010 viene ya con soporte para el nuevo estándar de C++0x (curioso, cuando aún no ha sido publicado). Sí, en conclusión, elijo VS2010 por ser más guay.

Vamos a dejar las pataletas a un lado y pongámonos a instalar la versión Express, que como ya sabéis es gratuita. A cambio, como es costumbre, recortan una serie de características: en el caso de VC++ Express, lo distribuyen sin las librerías MFC ni ATL, que no vamos a usar para nada, y capan alguna capacidad relacionada con la compilación para 64 bits, que tampoco necesitamos. No obstante, si alguien se quiere bajar comprar la versión Full puede estar tranquilo de que cualquier código de éste blog le va a funcionar igual que en la versión reducida.

Paso a paso para torpes:

Bajar Microsoft Visual Studio 2010 Express

En la lista desplegable (alias combo), selecciona English. Yo lo prefiero en inglés y los tutoriales estarán basados en tal idioma.

Esto bajará un instalador online llamado vc_web.exe, de 3'2 Mb. También puedes elegir la opción de abajo del todo, que es una imagen ISO que contiene todas las versiones Express de los lenguajes soportados por VS; el archivo se llama VS2010Express1.ISO, ocupa 694 Mb y a mí me tardó 15 minutos en bajarse, a 800 Kb/s. Luego sólo tendrás que montarlo con Daemon, por ejemplo, y seleccionar VC++.

Cuando ejecutes el instalador online, desmarca todos los checkboxes que encuentres y pulsa Install.

La instalación requerirá 954 Mb de disco duro y necesitará descargar unos 75 Mb. En aproximadamente 5 minutos debería terminar.

Comprueba que se ha instalado todo correctamente.

Al tiempo te saltará una ventana pidiendo que registres el producto. Puedes pasar de ella si no te molesta o puedes registrarlo, que no cuesta nada. Si quieres registrarlo (desconozco ahora mismo qué ventaja aporta ni me he preocupado en investigarlo), pulsa "Obtain a registration key online", lo que te llevará a una web de Microsoft con un formulario. Por cierto, si no ves la ventana de aviso, puedes acceder a ella usando el menú "Help"–>"Register Product". Pon lo que te de la gana en los campos del formulario, incluso puedes inventarte el email ya que te dan el código en la misma web y, a parte, envían una copia al correo. Venga va, que sé que más de uno es vago de cojones, aquí tenéis mi clave:

6VPJ7-H3CXH-HBTPT-X4T74-3YVY7

Microsoft DirectX 11 SDK

Eje central del blog, es la última versión de las librerías que nos permiten utilizar el HAL (Hardware Abstraction Layer) de Windows para comunicarnos con los drivers y manejar así ciertos dispositivos hardware. No voy a ponerme aquí a explicar en detalle qué es DirectX, para eso ya hay muchos sitios. En su lugar, haré un breve resumen de la nueva estructura de la versión 11 con respecto a la 9 pues considero que hay mucha más gente interesada en portar su código desde la versión 9.0c que desde la 10.1.

  • Direct3D: Se mantiene la rama principal para el control de los dispositivos gráficos que, desde Vista, se realiza sobre WDDM 1.1 (Windows Display Driver Model), nueva arquitectura de los drivers para tarjetas gráficas, en teoría más robusta, más rápida y que provee nuevas funcionalidades como la posibilidad de compartir superficies (texturas) entre threads, virtualización de memoria de video (paginación en la RAM del sistema) o encolar tareas de la GPU. A nivel de interfaces de la librería, nos encontramos con que ya no hay más llamadas a la instancia del dispositivo para cambiar estados de la fixed pipeline, que ha sido totalmente desechada y traducida a shaders 2.0 que tendremos que programar. Otra novedad significativa es la separación de las tareas cuya evolución se intuye mucho más lenta que el resto, como es la enumeración de dispositivos gráficos y el manejo de swap chains, en una nueva rama de interfaces llamada DXGI (DirectX Graphics Infrastructure). Ni que decir tiene que los nombres de las funciones de ayuda, las interfaces, las estructuras y demás han cambiado; algunos son irreconocibles mientras que otros simplemente han reemplazado los prefijos D3DX- e IDirect3D- por D3D11- (funciones), ID3D11- (interfaces) y D3D11_- (estructuras y enumerados). Hay muchas cosas más (shaders 5.0, Geometry Shader, desaparición de las Device Caps, etc.) pero ya iremos descubriendo las sorpresas que Microsoft ha preparado conforme vaya publicando entradas en el blog, que si no os empacháis.
  • DXGI: Como ya he mencionado, este nuevo grupo de interfaces encapsulan algunas de las tareas que antes formaban parte de IDirect3DDevice9 y que se estima que van a cambiar a un ritmo mucho más lento que el resto de características de Direct3D. Por ejemplo, a la hora de obtener el identificador de un dispositivo gráfico ya no usaremos el método IDirect3DDevice9::GetAdapterIdentifier, sino IDXGIDevice::GetAdapter; de igual modo, no usaremos el método IDirect3DDevice9::GetAdapterCount junto con el anterior para obtener la lista de dispositivos, directamente podremos llamar a IDXGIDevice::EnumAdapters. La administración de swap chains también ha sido delegada en DXGI y existen un gran surtido de métodos e interfaces para llevarla a cabo con mayor facilidad.
  • Direct2D: Vino con Windows 7, y lo hizo para quedarse. Podemos ir diciendo adiós con la manita a DirectDraw junto a la GDI y GDI+ (siguen existiendo, pero no tendrás que usarlos más). Como su nombre indica, engloba toda la funcionalidad relacionada con el dibujo bidimensional y es el responsable de todos los píxeles que ves cuando usas Windows 7 (para que funcione con Vista hay que instalar actualizaciones). Unifica las APIs antes mencionadas y ofrece un conjunto de interfaces cuya usabilidad es notablemente superior. Es realmente sencillo dibujar una figura mediante el uso de Brushes (interfaces derivadas de ID2D1Brush), que determinan la metodología de coloración y otros aspectos visuales como, por ejemplo, si se usará un degradado lineal de color negro a amarillo para rellenar una superficie; Geometries (interfaces derivadas de ID2D1Geometry), que definen la forma del polígono a representar, como un rectángulo o una elipse; Bitmaps (interfaz ID2D1Bitmap)… no, no pongo los puntos suspensivos a modo de elipsis, los pongo a modo de suspiro debido a que llegados a este punto se acabó la simplicidad. No diré que sea mucho más engorroso que usando DirectDraw, pero tener que recurrir a otro framework, WIC (Windows Imaging Component) para más señas, para cargar la imagen y luego traspasarla al sistema de Direct2D me parece cuanto menos insuficiente, no porque sea malo separar responsabilidades (la idea tras de WIC no es mala ni mucho menos), sino porque podrían haberse currado algún wrapper o función de ayuda para tal efecto, ya que estamos; aun así, no os agobiéis, existe un ejemplo bastante claro en el archivo de ayuda del SDK (busca "How to Load a Bitmap from a File", comillas incluidas). Por cierto, vaya coñazo es Microsoft con tanto puto acrónimo. Por último, acabando con éste apartado, se puede dibujar texto con Direct2D, aunque las posibilidades que ofrece son bastante reducidas respecto a DirectWrite.
  • DirectX Media: Es un grupo de APIs que facilitan las labores relacionadas con contenidos multimedia. Está compuesta por DirectAnimation, para animación web (aviso que la información de esta es jodidamente escasa); DirectShow, para manejo de video y streaming, de la cual ya disponíamos en DirectX 8, aunque Microsoft lo separó del SDK de DirectX y mareó un poco al personal situándolo en varias librerías, hasta hoy; DirectTransform, otra API orientada al desarrollo web que nos surte de funciones para crear "animaciones" mediante transiciones entre frames (imágenes estáticas), añadiendo ciertos efectos; existe alguna más pero creo que carece de interés. La tendencia respecto a DirectShow ha sido, claramente, trasladarlo a un contexto de funcionalidad de sistema operativo, separándolo del tronco principal dedicado al desarrollo de videojuegos. Lamento decir que, aunque la plataforma DirectX Media siga vigente, será pronto sustituida por la MF (Media Foundation), aparecida junto a Windows 7. Dado que eso es otro mundo, inmenso e incierto como todos los que abre Microsoft cuando sus chicos se aburren y hay pasta de sobra, no voy a meter más la cabeza en él.
  • DirectInput: Seguimos disponiendo de éste conjunto de interfaces, que nos permiten consultar el estado de ciertos periféricos, como el teclado, el ratón, gamepads, joysticks… o enviarles señales (force feedback) a, por ejemplo, un gamepad con vibración. No ha evolucionado nada desde DirectX 8, así que poco se puede añadir. Sí cabe mencionar la postura de Microsoft respecto a su uso pues, dado que hace años que no dan soporte para esta API, aconsejan valerse del bucle de mensajes de Windows para manejar las entradas de los dispositivos, haciendo hincapié, además, en que utilicemos la librería XInput (introducida en DirectX 9) en el caso de que queramos usar mandos de XBox. Lo que les costará mantener y mejorar DirectInput, que son un par de estructuras unas pocas funciones… algo tendrán planeado.
  • DirectPlay: Creo que ésta es la rama que más desconozco de DirectX, será porque soy un manta con las telecomunicaciones y eso ha hecho que me interese bastante poco. Todavía disponemos de ella para llevar a cabo comunicaciones de red entre distintos PCs. Al igual que ocurrió con DirectInput, Microsoft le dio la patada hace mucho, por lo que se aconseja usar Winsock en su lugar. Leyendo las opiniones que circulan por Internet, parece ser que no era mucho más sencillo implementar el sistema de red con DirectPlay que con Winsock a pelo, así que yo no le dedicaría mucho a esta API.
  • DirectSound: Fue actualizada por última vez en la versión 8 y hoy día sigue estando disponible. Actúa como capa de bajo nivel entre nuestro software y el hardware de sonido, facilitando la reproducción de archivos de audio. Desgraciadamente (para algunos), Windows Vista acometió una serie de reformas en el apartado del control de audio con el fin de unificar las interfaces y capacidades del hardware de los distintos proveedores, dando lugar a la UAA (Universal Audio Architecture), reemplazando parcialmente el WDM (Windows Driver Model). De esta forma, se rompía la conexión directa de DirectSound con los drivers, necesitando ahora emulación por software; si bien el impacto de rendimiento es imperceptible, algunas características del subconjunto DirectSound3D quedaron anuladas. Los proveedores de controladores suministraron entonces ciertas herramientas para interceptar las llamadas a esta API y "reactivar" la funcionalidad perdida. En definitiva, en vista de la nueva plataforma XAudio por la que está apostando Microsoft, podemos dar a DirectSound por muerta, no malgastéis vuestro tiempo.
  • DirectMusic: Sobra un poco hablar de esta rama ya que, como algunos sabréis, funciona sobre el ya fallecido DirectSound. Al igual que esta última, sigue existiendo en DirectX 11, facilitando un poco la labor de orquestar la reproducción de audio pregrabado y la ejecución de piezas musicales mediante un sintetizador (véanse los casi desaparecidos MIDIs). En este momento desconozco si existe un reemplazo inmediato, puede que XAudio provea de alguna funcionalidad parecida.
  • XAudio2: Aparece con motivo de los esfuerzos de Microsoft por unificar las plataformas de Windows con XBox, en este caso, en el ámbito del sonido. No, el 2 no es una errata, he decidido hablar de la segunda versión de la API puesto que la primera estaba dedicada a manejar el audio de la consola, únicamente, mientras que XAudio2 es "multiplataforma" entre PC, bajo Windows XP o superior, y XBox 360. Sustituye, como dije anteriormente, a DirectSound y forma parte de (o es usado por) la plataforma XACT3 (Cross-platform Audio Creation Tool), un conjunto de APIs de alto nivel y herramientas (aplicaciones) para la generación de contenidos de audio. Esta librería utiliza lo que denomina como voices (eso, voces) para trabajar con sonidos pregrabados, ofreciendo funciones para su manipulación y permitiendo crear grafos de remezclas para obtener salidas de audio nuevas. Existe un complemento llamado X3DAudio (como hubo un DirectSound3D) para aplicación de efectos de posicionamiento tridimensional (variación del volumen de cada altavoz de un sistema estéreo, 5.1, 7.1, etc. en función de unas coordenadas [X, Y, Z]), efecto Doppler y eco. Como pasará bastante tiempo antes de que le meta mano a esta API en el blog, os pongo un artículo de Gamasutra muy revelador, por si os interesa.
  • DirectCompute: La arquitectura de DirectX ha dado un paso significativo hacia delante (acompañada, como suele ser habitual, por la del hardware), abriendo definitivamente la puerta a la computación de propósito general usando la VRAM y la GPU de nuetras tarjetas gráficas. Hasta ahora, podíamos delegar en la GPU una serie de trabajos concretos, como modificar el color de un píxel (vía Pixel Shaders, también conocidos como Fragment Shaders), generar un polígono (mediante Geometry Shaders, incorporados en DirectX 10) o desplazar un vértice (valiéndonos de los Vertex Shaders), pero, como ya digo, con limitaciones propias de la función para la que fueron concebidos. Y llamo limitación a tener que renderizar un vértice para que se disparen los shaders que necesites. Con DirectCompute, explicándolo burdamente, reservas un espacio de memoria visible desde el contexto de los shaders, creas una serie de threads y los "activas", de manera que tu shader realiza las operaciones que hayas programado con HLSL o ensamblador y guarda los resultados en los espacios que reservaste. Ya explicaré esto en más detalle llegado el momento, porque tiene tela… Parece ser que la trayectoria de la computación se ha desviado un poco, desechando la idea de la expansión de las CPUs multinúcleo y abrazando el dogma del proceso en paralelo entre CPU y GPU; según AMD, mientras las CPUs actuales alcanzan velocidades de 108'8 GigaFLOPS (Floating-point Operations Per Second), las GPUs están superando los 1.36 TeraFLOPS (11 veces superior), así que está clara la tendencia.
  • DirectWrite: Ésta sección de DirectX nos provee de un abanico de funcionalidades para el dibujo de texto en pantalla. Llegó a la par que Direct2D y con el mismo propósito de establecerse por encima de todas las librerías del sistema dedicadas al manejo de texto. Nos despedimos pues del uso del GDI y de la interfaz ID3DXFont de Direct3D. Ahora la respuesta a la gran pregunta ( [FreakMode] tranquilos, trataré de responder con algo más que un par de cifras [/FreakMode] ): si Direct2D ya pinta letras, ¿para qué carajo queremos DirectWrite? Sencillo y complejo a la vez. Sencillo porque, básicamente, cuando trabajan juntos, Direct2D se dedica a dibujar y DirectWrite le indica qué dibujar, amén de otros "servicios" que ofrece, como el acceso a las fuentes (entiéndase tipografías) del sistema operativo y sus características. La explicación compleja, según Microsoft, justifica la decisión de escindir DirectWrite por motivos de facilidad de adopción por parte de las aplicaciones ya existentes que hacen uso del GDI para representar sus textos; es más sencillo lidiar sólo con la parte de proceso de textos que sustituir todo el sistema gráfico 2D que, posiblemente, no se necesite o no se pueda cambiar. Esto implica que, según he entendido (no he hecho experimentos aún, todo llegará), es posible dibujar las letras como mejor te guste, usando Render Targets (interfaces que derivan de ID2D1RenderTarget) o implementando la interfaz IDWriteTextRenderer para traducir lo que llegue a sus métodos de callback a instrucciones del GDI, por ejemplo.

Joder, y yo que pensaba no alargarme mucho… Bueno, lo siguiente es rapidito, vamos a instalar el SDK de DirectX 11 (que incluye además el 9c, el 9Ex y el 10.1) y vamos a dejarlo listo para trabajar.

Paso a paso para torpes:

Bajar SDK de DirectX 11 de Junio de 2010

Pulsa en Download, que te llevará a una página de confirmación. Allí pulsa Start Download.

Se descargará un archivo de 571'7 Mb llamado DXSDK_Jun10.exe. A mí me tardó 10 minutos, a 800 Kb/s.

Ejecuta el instalador. Requerirá 1251 Mb de espacio en disco.

Desmarca la casilla de participación si quieres y cambia el estado de aquellos elementos de la lista que estén marcados como no disponibles (sólo debería haber uno así), o sea, instálalo todo.

Después de unos 4 minutos aproximadamente debería haber terminado.

Pero la cosa no acaba aquí. Si vas al VS 2010 para comprobar que el instalador haya añadido las correspondientes rutas del SDK a la lista de directorios de VC++, te darás cuenta de que NO EXISTE tal lista. Bueno, realmente sí que existe, pero comprobarás que la han movido. En efecto, ahora no hay una lista a nivel de usuario para todos los proyectos, sino que cada proyecto tiene su propia lista por defecto, en forma de propiedad. Si quieres hacer esta comprobación no tienes más que crear un proyecto Win32 cualquiera e irte a las propiedades del mismo, deberían estar las siguientes entradas en la página de VC++ Directories:

  • Include Directories: C:\Program Files\Microsoft DirectX SDK (June 2010)\Include
  • Library Directories: C:\Program Files\Microsoft DirectX SDK (June 2010)\Lib\x86

Si no estuvieran, inclúyelas cada vez que crees un proyecto. O mejor aún, ve al menú View –> Property Manager; se abrirá en la barra lateral un árbol de hojas de propiedades. Abre la que se llama "Microsoft.Cpp.Win32.User" y modifica todo aquello que necesites que esté por defecto en cada nuevo proyecto.

Pues esto es todo, iba a meter un mini-proyecto Win32 para dejar lista la parte de código que no tiene que ver con DirectX directamente y olvidarnos ya de la infraestructura, pero como me ha salido tan largo este post, lo dejaré para el siguiente. Espero ser más escueto en próximas publicaciones y que toda esta información sea útil para más de un frikazo tecnológico.

PD: He puesto todos los enlaces a páginas en inglés dado que odio las traducciones automáticas, que suelen a inducir a errores, y porque las fuentes en inglés suelen tener contenidos más amplios y más fiables. Espero que no sea un gran impedimento para nadie.

Etiquetas: , , ,

Dead Space

Publicado el Lunes 21 junio 2010 en Videojuegos por Thund

Como el protagonista de la obra a tratar, surco el vacío sideral esperando encontrar respuesta más allá de la robusta carrocería de mi blog; me aproximo a todos vosotros sin saber qué encontraré, sin tan siquiera tener un atisbo de certeza de que existirán personas al otro lado. Espero tener más suerte que Isaac y que éste primer post de aproximación me depare algo más que silencio, oscuridad y muerte. De forma similar empieza Dead Space, un videojuego de horror futurista que he tenido el placer de probar en mi PC. Desde el inicio encarnamos a Isaac, un ingeniero de sistemas espaciales, el cual forma parte de una reducida compañía de mantenimiento formada por un par de guardias, un jefe de seguridad y una especialista informática. Juntos se aproximan a una nave minera de enormes dimensiones llamada USG Ishimura, que quedó incomunicada por motivos desconocidos y cuya reparación pretenden acometer. Debido a unos problemas con la navegabilidad, acaban empotrándose en el puerto de la nave anfitriona, viéndose en la necesidad de buscar la forma de salir de allí, que no es otra que entrando… Craso error. A partir de ese momento ya podéis olvidaros de comer / beber / respirar / pestañear / tocaros mientras jugáis. Aquellos a los que os gustase Doom 3 ó Clive Baker's Jericho estáis de enhorabuena, porque éste es una mezcla de ambos, sin ser ningún calco, por supuesto. Estad preparados para horas de penumbra, incertidumbre y sangre. Intentaré resumir los detalles…

La sensación

Tensión. A medida que visites los distintos lugares de la Ishimura te darás cuenta de que nunca estás a salvo, ni siquiera en las típicas "áreas de descanso" donde te equipas y guardas la partida. Las bestias alienígenas no te darán cuartel, te sentirás acechado en todo momento. La mayor parte de los escenarios transcurren con poca o ninguna luz, con focos que parpadean o que se mueven continuamente, dando lugar a sombras sospechosas. A menudo las paredes de metal de los incontables pasillos de la nave están adornadas con manchas de sangre, trozos de cadáveres o una sustancia alienígena viscosa que os harán la visita aún más confortable… Pero como toda obra de terror que se precie, lo que os estremecerá no será lo que veáis, sino lo que vuestra mente esté esperando ver y, en éste sentido, he de darles mi enhorabuena a los de EA Redwood Shores por el sonido del que han dotado al juego. Muchas veces no se le da demasiada importancia a los efectos sonoros, tanto los activos (digamos, el sonido del arma o del menú) como los pasivos (los de ambiente), sólo nos acordamos de ellos cuando son insoportables o cuando, como en éste caso, son geniales. Si juegas a Dead Space ten preparado un buen equipo 5.1 como mínimo. Me impresionó verme a mí mismo darme la vuelta, físicamente, sobresaltado por un puto ruido metálico (como si "algo" le hubiera dado una patada a un tornillo) que me había parecido oir tras de mí. Toda esta envoltura de tensión hará que, por cada corredor que tengáis que atravesar, se enfrenten en vuestro interior las ganas salir pitando para terminar cuanto antes contra el agarrotamiento del miedo a encontraros de frente con un puñado de bestias asesinas con ganas de descuartizaros. Otro punto a favor es que, salvo contadas y "cantadas" ocasiones, nunca sabes por dónde te van a venir los bichos. Hay respiraderos por toda la nave, siempre estás rodeado. No se trata de esperar sustos repentinos enfrente de ti como si fuera el tren de la bruja, el sobresalto te lo puedes llevar al ver de repente el extremo de una zarpa detrás de ti. Por supuesto, para destrozarte los nervios, los sustos van acompañados de un estruendo de cuerdas chirriantes que, a medida que el juego avanza, son cada vez menos escandalosas (un detalle a agradecer); lo lamentable es que tales fanfarrias son la parte más destacable de la banda sonora del juego…

La mecánica

Para evitar que la actividad se base únicamente en correr y mearse encima, los de EA nos proveen de una serie de armas y habilidades que nos permiten abrirnos paso entre las hordas de necromorfos y los obstáculos físicos de los escenarios. Las armas más bien son herramientas de trabajo, salvo un rifle de impulsos (mi preferido junto a la cortadora de plasma) y pueden ser mejoradas a lo largo de la aventura en puntos específicos (recomiendo dar prioridad al daño); además, cada una tiene 2 formas de uso, destacando el bestial torbellino de balas del rifle. Respecto a las habilidades, disponemos de la telequinesis, con la que podremos desplazar objetos enormes; más de una vez lo usaréis para acercar items inalcanzables. La otra capacidad especial del traje de Isaac se trata del éstasis (que no éxtasis, no os emocionéis), que nos permite envolver criaturas o mecanismos en un campo de fuerza temporal (o eso creo, en ningún momento lo explican), casi deteniéndolos. Realmente, la existencia de ambas es meramente testimonial o accesoria, no sólo porque los rompecabezas que las requieren sean de solución obvia, sino porque en muchas ocaciones siquiera serán imprescindibles. Quizá han sido algo desaprovechadas… Para manejar todo esto nos tenemos que valer de unos controles y una interfaz de usuario muy bien acotados. En lugar de inundar la pantalla de indicadores que distrairían la atención de la escena, a lo único que tenemos que estar pendientes es a la espalda del prota, donde veremos 2 barras, la de vida y la de energía (para el éstasis). Me parece muy acertado, es una forma de aprovechar el espacio ocupado por el cuerpo de Isaac (la cámara está situada en tercera persona, próxima al objetivo), lo cual es muy criticado por algunos debido a la pérdida de visibilidad y la eventual confusión en el manejo de la perspectiva (hay veces incluso que no sabremos qué vida nos queda, porque la espalda del personaje queda fuera del plano…). Existen varios elementos de interfaz visual más, estos menos integrados con la escena, camuflados como hologramas táctiles, y entre ellos se encuentra un menú de inventario al más puro estilo de Resident Evil, bastante sencillo.

Los controles son pocos (si no contamos los de los menús), y esto se ha conseguido gracias al uso del botón derecho del ratón (por defecto) como conmutador entre 2 estados principales: apuntando con el arma o no. Dependiendo del estado, los mismos controles tendrán un efecto u otro, se desactivarán o activarán. El ejemplo más obvio es el ataque: si atacas sin apuntar, el resultado será una soberana ostia al bicho de turno (adoro la sensación de contundencia que le han dado); si apuntas, obviamente, fríes al bicho de turno. En definitiva es sencillo. Los movimientos del personaje están bastante logrados (faltaría más con los pocos que son) y van acompañados de efectos de sonido que transmiten lo duro que es moverse con el traje de protección. Lo más engorroso llega cuando necesitas girarte 180º, te faltará alfombrilla y, en cuanto pulses el botón de apuntar, hay muchas posibilidades de que la cámara se centre donde no esperabas. No hay posibilidad de saltar o esquivar pero, en cambio (y Dios sabrá por qué), ¡podemos pisar! Curiosamente su única utilidad es abrir las cajas sueltas del suelo o, como mucho, destrozar cadáveres, que no diré que no tenga su encanto… Tomad nota de ciertas animaciones puntuales (normalmente cuando un bicho te muerde), es bello patear fetos alienígenas…

Hablemos de la chicha del juego, los denominados necromorfos. Desde luego no es la parte más currada, el diseño no es muy original, la mayoría del tiempo matarás a los mismos tipos, y no tengo claro si su parecido con los zergs (raza alienígena parasitaria que asimila otros seres vivos, que en éste caso pasarían por terrans plagados) le aporta nostalgia o le resta acojone… Debo decir que su dosificación me parece acertada, o sea, no estás continuamente matando enemigos sino que aparecen de cuando en cuando, de lo contrario nos cansaríamos y les perderíamos el "respeto" demasiado rápido, a parte de que no daría tiempo a que nuestra mente se volviera levemente paranoica, como mencionaba anteriormente. Me encantó un tipo de alien en especial, que en inglés llaman swarmer, y que no mide más de un palmo de altura; tened cuidado porque van en grupo y son muy porculeros. Finalmente mencionar que en contadas ocaciones tendremos que acabar con algún que otro bicho mucho más grande que nosotros y que no tendremos ambos pies sobre el suelo…

Lo innovador

Como plato fuerte en la jugabilidad y la ambientación, Dead Space nos ofrece la posibilidad de dar un paseo por el vacío, en gravedad cero. En determinadas cámaras de la nave, se nos informará de que estamos entrando en una zona de gravedad cero por la que, dando un pequeño impulso con nuestras piernas, podremos flotar hasta que topemos con la pared opuesta. Éste efecto ha sido aprovechado para aumentar la dificultad de tareas que en principio serían sencillas, como mover objetos o sobrevivir al ataque de necromorfos, que se desplazarán dando saltos al igual que nosotros. En ocasiones agravan la situación añadiendo el vacío, obligando a terminar el trabajo antes de quedarnos sin aire. Es recalcable que, al contrario que en la mayoría de los videojuegos o el cine de ciencia ficción, casi han respetado la realidad en cuanto al sonido en el vacío se refiere: si no hay aire, no debe oirse nada. Digo "casi" porque sí que se oye algo, aunque muy bajo y grave; apuesto a que eran conscientes y decidieron hacerlo así por lo mismo que en las películas "usan perros para aparentar caballos"… Cuando rondéis por una de estas zonas prestad atención a un efecto que casi pasa desapercibido: la sangre flotando.

La inmersión

No puede decirse que Dead Space, el videojuego en sí, tenga una trama brillante. Más bien es mediocre, algo típica, con demasiados cabos sueltos y mal explicados. Uno no llega a empatizar con los personajes, de los que no conoce nada, ni a tener un verdadero interés por la trama hasta que no ha recorrido el 80%. Las misiones son repetitivas, Isaac es el chico de los recados al que marean unos y otros, la línea argumental es totalmente recta y, como ya digo, no se oferece nada interesante hasta más allá de la mitad del juego. Se comprende que los escenarios no pueden variar mucho puesto que la historia sucede en el interior de la misma nave; de hecho, hacen un esfuerzo con la zona de cultivos hidropónicos, que alegra un poco la vista. La historia podría haber sido mucho mejor hilada y salpicada de más acción. Sin embargo, de alguna manera, acabas introduciéndote en ese mundo claustrofóbico. No te importa tanto a dónde te llevan tus pasos como el hecho de andar. Como ya dije, la ambientación es impresionante, aunque estés sufriendo una taquicardia no querrás separarte de la pantalla; y no será por las ansias de conocer el final, sino por no querer que esa sensación de angustia artificial se acabe. Antes resalté que me refería a Dead Space como "el videojuego en sí", y quería dejarlo claro porque hay mucho más ahí fuera. El videojuego es sólo una ventana artística a su mundo, sus creadores han elaborado una vasta cantidad de relatos, comics, webs, otro videojuego (Dead Space: Extraction para Wii), incluso una película de animación (precuela), todo ello para dar cuerpo a la historia de la USG Ishimura… una vez que te empapas de todo eso empiezas a mirar a los guionistas con otros ojos. Pocos juegos son rodeados de tanto trabajo suplementario; sin duda, por lo que he podido ver, Dead Space ha tenido una campaña publicitaria en Internet muy elaborada (márketing viral incluido). Actualmente están trabajando en la secuela, que piensan lanzar en 2011 y que supuestamente mantiene a Isaac como protagonista (y a todas luces puede esperarse que sea el causante de la siguiente plaga…).

El sabor de boca

En resumidas cuentas, un juego muy absorbente, de una calidad gráfica y sonora que no ha sido empañada por sus pretensiones, provisto de una mecánica sencilla y un trasfondo resultón. Cuando lo acabas no quedas indiferente, pero tampoco sientes que has vivido una gran experiencia. Podéis encontrar más "información" en los siguientes enlaces…

Dead Space (web oficial)

Dead Space: Downfall (película de estilo anime)

Otras opiniones

Etiquetas: ,

Nacimiento de la criatura…

Publicado el Miércoles 16 junio 2010 en Sin categoría por Thund

Bueno, hoy a las 0:05 horas del 16 de junio de 2010, ha nacido un nuevo blog y, con él, mi inicio en la vida “pública” en Internet. Lo sé, como todos los recién nacidos, es jodidamente feo. Ya me crearé mi propio estilo cuando tenga más tiempo, de momento me pueden más las ansias de verlo online que de agradar a la vista de quienes no me están leyendo.

Creo que lo adecuado en el primer post es una presentación, pero ligerita, que esto no es el Facebook: servidor es un autoproclamado desarrollador de videojuegos que nunca llegó a terminar, especializado en el lenguaje de programación C++ (como los machos) y conocedor en cierta profundidad del SDK de DirectX 9.0c de Microsoft. Lo malo es que DirectX 9 salió allá por el 2004, y los que nos dedicamos a esto ya sabemos que te renuevas o mueres, la industria no se detiene. C++, como lenguaje supremo que es, por muchas revisiones del estándar que le saquen (aún estamos esperando ese famoso C++ 0x que ya va siendo 1x…) no quedará nunca obsoleto mientras exista la POO, así que quedan muchos años aún para preocuparse por él. Sin embargo, la API de DirectX ha sufrido ya 2 importantes mutaciones: DirectX 10 y, ahora con Windows 7, DirectX 11.  Así pues, dándome cuenta por fin del apabullante tamaño que está tomando el abismo de la migración, he decidido renovar mis conocimientos y adaptar todo aquello que he aprendido a la nuevas librerías, nuevas metodologías y nuevas capacidades del hardware. Me supone un gran sacrificio, pero es ley de vida.

La cuestión ahora es, ¿por qué hacer un blog sobre eso en vez de estudiar e investigar por mi cuenta? Pues por 3 razones: la primera es que me va a venir muy bien para tener un registro de todo lo que aprendo, y para que se me quede incluso mejor en la cabeza al forzarme a explicarlo en lugar de simplemente “creer que lo he entendido”. La segunda razón resulta de la falta de información que existe acerca de DirectX 11 en la actualidad en Internet (y en imprenta), ya sea por su novedad o por intereses de ciertos señores; creo que será de gran utilidad todo aquello que pueda aportar, teniendo en cuenta, además, el hándicap del idioma, pues todos sabemos que publicaciones relacionadas con DirectX o creación de videojuegos en español… pocas o ninguna. El blog estará en castellano, aunque no descarto en un futuro tener, además, una versión traducida al inglés para ciertos posts. Y me queda mencionar la tercera razón: soy persona de estar siempre metida en algún proyecto, no puedo estar quieto viendo pasar las nubes. Sin embargo, debido a que siempre emprendo mis viajes en solitario, acabo quemándome y aburriéndome (estoy seguro de que más de uno entendéis esa sensación…), nunca llego a acabar nada, y es como si todo lo andado hubiera sido tiempo perdido, sin ningún resultado demostrable, sin la sensación de autorrealización que uno, en teoría, buscaba. Tanto trabajo para acabar sin reconocimiento exterior ni interior, resulta muy frustrante. Por ello, tomé la determinación de buscar un proyecto de índole opuesta, un proyecto sin final… de ahí surge principalmente la idea. Un blog me permitirá dar valor a cada metro que avance y, aunque siga abriendo camino en solitario, puede que me acompañen algunos bloggers interesados en los mismos temas que yo, con los que quizá colaborar en un futuro en alguna obra con pies y cabeza.

Pero alto, el contenido del blog no se ceñirá exclusivamente a un puñado de tutoriales para hacerte pajas con tu compilador, también pienso rellenarlo con aquello que es la razón de ser de que dedique tiempo de mi vida a aprender tales frikadas, que son, obviamente, los videojuegos. Entre tanto I+D pienso relajarme probando las obras de arte (las que lo sean) que el gran elenco de compañías desarrolladoras de todo el mundo nos ofrece hoy día, con el propósito (o no) de hacer un breve análisis y plasmar aquí mi opinión para quien le interese. También iré colgando algunos enlaces a páginas webs, resúmenes de noticias rescatadas en otras partes relacionadas con videojuegos o su desarrollo y alguna chorrada más que se me ocurrirá.

Ahora que voy releyendo lo anterior puedo confirmar mis sospechas, ¡qué mal escribo, joder! Espero ir mejorando con el tiempo e ir tomando conciencia del espacio, la amenidad (o “fumabilidad”) del contenido, su legibilidad, su distribución e incluso el tono, que quisiera mantener coloquial mientras los tecnicismos me lo permitan. En cuanto a la frecuencia de publicación no tengo ni idea de cuál será, no mayor de 2 semanas… además, quién sabe si ésta idea me dura un mes, 2 días o 10 años… Lo que sí sé es que por hoy no escribiré ningún artículo, si bien ya tengo pensado el primero: una crítica a Dead Space. Porque criticar es sencillo, normalmente gratis y no requiere mucho esfuerzo… así me iré curtiendo un poco mientras escribo algo más “serio”.

En fin, creo que ya está bien de tanta milonga, mi nick es Thund (como el protagonista del primer videojuego que empecé a hacer con 14 años usando Div2… un delirante intento de copia barata de The Story of Thor de Mega Drive), y estoy a vuestra disposición desde mi espacio para cualquier cosa relacionada con videojuegos, C++ y DirectX.

Bienvenidos a todos.

Thund.

« Página anterior