Motores gráficos de videojuegos y Framework LibGDX

Motores gráficos de videojuegos

 

Los motores de videojuegos facilitan de manera considerable todo el proceso de creación de un videojuego, por lo cual cuando quieres diseñar un videojuego bastante complejo es difícil crear todo de manualmente y para facilitar la tarea puedes utilizar motores ya existentes como de desarrolladores de grandes videojuegos que ha compartido públicamente sus motores para los usuarios  interesados en el desarrollo de videojuegos  y así poder saber cómo se elaboran o crear su propio motor 3D como en muchas empresas y no tener que programar todo por ti mismo. Un videojuego varia notablemente dependiendo del motor que este reutilizando o este adaptado.

Así que puedes utilizar infinitas herramientas muy fáciles de encontrar como los motores gráficos con todo el material necesario para empezar el diseño y programación de un videojuego de manera gratuita y sin limitaciones. En los motores de videojuegos te proporcionan material muy completo y útil  como un motor de renderizado para los gráficos 2D y 3D, motor físico o detector de colisiones, sonidos, scripting, animación, inteligencia artificial, redes, streaming, administración de memoria además de un escenario gráfico.

A continuación definiremos este material proporcionado por los motores para comprender mejor su utilidad y necesidad en un videojuego.

– Las colisiones se producen cuando un objeto se sobrepone a otro. Para producir este efecto utilizamos la simplificación, de este modo envolvemos el objeto en un rectángulo por ejemplo y cuando se toque el rectángulo se producirá la colisión.

– El 2D y 3D dependiendo del número de dimensiones puede ser:

-El 2D que es bidimensional, es decir como una foto. Que se puede medir su altura y anchura pero no su profundidad, por lo cual se proyecta de manera plana.

-El 3D es tridimensionalidad, es la forma en que percibimos nuestra realidad. Por lo cual algo es tridimensional cuando tiene tres dimensiones, y se puede medir su longitud, anchura y profundidad.

– Las físicas es un tipo de programación donde se usan las leyes de la física para programar algunos archivos del juego, normalmente se usa en gráficos 3D. Esto se hace para que los objetos de los juegos tengan características similares a la realidad.

-El renderizado: Es el proceso de generar una imagen 3D o de animación 3D a partir de un modelo, se utiliza principalmente en la producción de imágenes 3D para videojuegos, diseño computacional, efectos especiales del cine, etc.

-Los sistemas de partículas: Son efectos visuales de los videojuegos para animar los objetos y simular su comportamiento como por ejemplo en el fuego con el comportamiento del humo, la lluvia, la sangre, las explosiones, etc.

– La inteligencia artificial: Es la técnica que se utiliza en los videojuegos para producir la ilusión de inteligencia en los personajes que controla el juego. Pueden pensar, evaluar y actuar de distintas formas según la situación.

Para mas información sobre: Motores gráficos

Existen varios motores gráficos bastante conocidos por su gran eficacia y potencia para juegos lanzado al público, los más populares son Unity 5, Unreal Engine 4 y Cryengine. Se diferencian porque cada uno tiene sus áreas más fuertes y dependiendo de qué tipo de videojuego deseas desarrollar te decantas por uno además de ver cual se ajusta más a tu presupuesto ya que cada uno tiene sus derechos de licencia.

Aquí puedes ver información sobre: los mejores motores gráficos de videojuegos

Vamos a hablar de los motores de juego Unity 5 y Unreal Engine 4.

Unity 5

Unity 5 es un motor de juego de la empresa Unity que ofrece una extensa gama de características y bastante fácil de entender su interfaz. Está disponible para Microsoft Windows, OS X y Linux.

Y se puede trasladar fácilmente para crear juegos para Windows, OS X, Linux, Xbox 360, PlayStation 3, Playstation Vita, Wii, Wii U, iPad, iPhone, Android y Windows Phone por lo cual está diseñado más enfocado para el desarrollo de juegos para móviles.

Unity 5 incluye importantes mejoras sobre sus antiguos motores Unity, a nivel de iluminación, texturas, modelados e incluso sonido además es compatible con las principales aplicaciones 3D y se puede utilizar para el desarrollo de juegos en 2D. Pero esta versión nueva también incluye todas las características de Engine y puede ser descargada sin coste alguno por cualquier persona que lo desee. Si deseas comercializar tu proyecto tiene sus derechos de licencia como por ejemplo pagar la versión Pro.

Mas información sobre: Unity 5

Unreal Engine 4

Unreal Engine 4 es un nuevo motor de juego de la empresa Epic Games y sucesor del Unreal Development Kit que ofrece unas capacidades gráficas asombrosas como capacidades avanzadas de iluminación dinámica y un nuevo sistema de partículas que puede manejar hasta un millón de partículas en una escena a la vez. Pero también en esta versión han hecho unos cambios bastantes notables en el motor haciendo más fácil su usabilidad y sea más atractivo especialmente a los nuevos desarrolladores de juegos. Además será gratuito pero con un porcentaje de beneficios dependiendo de tus ingresos si desearas comercializar tú proyecto.

 


 

 

Framework LibGDX

Para facilitarnos la creación de aplicaciones el Framework ofrece herramientas y utilidades, como  de una plantilla que es como el esqueleto que definirá el funcionamiento de la aplicación, esto nos permite manejar la aplicación si necesidad de escribir mucho código. Estas plantillas se adaptan a diferentes necesidades pero en caso de no cumplirlas siempre podremos crear una subclase de la clase que proporciona la plantilla y añadir nuestras modificaciones al gusto. Y así ahorrar tiempo y trabajo al programar una aplicación o entender otras aplicaciones con el mismo Framework gracias a las plantillas.

En el caso de los videojuegos tenemos el Framework libGDX que proporciona una API unificada que funciona en las plataformas de Windows, Linux, Mac OS, Android, BlackBerry, IOS, HTML/WebGL). Este framework se compone de varios módulos que proporcionan servicios para cada paso de una estructura típica de juegos.

Aquí podrás encontrar información sobre: Framework LibGDX

-Entrada: Proporciona un modelo de entrada unificado y controlador para todas las plataformas.  Soporta teclado, pantalla táctil y ratón entre otros. También ofrece medios para registrar los procesadores de entrada basados en eventos.

-Gráficos: Permite comunicarse con la GPU y ofrece la posibilidad de obtener instancias de OpenGL, es decir especificaciones de estándar API que nos sirve para gráficos 2D y 3D. También nos proporciona métodos para generar Pixmaps y texturas. Dependiendo del hardware que usemos, algunas opciones pueden no estar disponibles.

-Archivo: Este módulo proporciona un acceso a los archivos independientemente de la plataforma que usemos. Esto nos facilita leer y escribir archivos, pero teniendo en cuenta alguna limitaciones que posee debido a la seguridad de la plataforma. Lo más común en este módulo es cargar los archivos de texturas, sonidos, etc.

Los archivos además están relacionados con los assets.

Los assets son como herramientas que se añaden a un videojuego, hay varios tipos que la gran mayoría de los motores usan como por ejemplo modelos 3D, texturas, materiales, efectos de sonido, etc. Que se pueden descargar por cualquier usuario.

-Audio: Nos permite crear y reproducir audio de una forma muy simple, también tendremos acceso directo al hardware de sonido para configurarlo. Soporta los formatos WAV, MP3 y OGG. Las instancias de sonido se cargan en la memoria y las podremos reproducir en cualquier momento, lo que es perfecto para los juegos cuando usan un efecto de sonido varias veces como por ejemplo los disparos.

Aquí podemos ver de forma gráfica la estructura de un framework:

 

lib

Para más información sobre libGDX la documentación de la pagina oficial: libGDX

 

 

 

 

 

 

 

 

 

ItemDecoration e ItemAnimator

Los componentes ItemDecoration e ItemAnimator surgen por el componente RecyclerView que es un nuevo widget de Android 5.0 con una versión más avanzada y flexible del ListView y GridView y así evitar el uso frecuente del findViewById y reutilizar recursos.  El RecyclerView permite mostrar muchos datos juntos por lo que es muy eficaz para cuando navegamos por los datos en la aplicación con el scroll, por lo cual mantiene un número limitado de vistas en la pantalla.

El API de RecyclerView está compuesto de componentes internos, el Adapter, ViewHolder, LayoutManager, ItemDecoration e ItemAnimator.

La clase Adapter es la encargada de crear las Views que sean necesarias para cada elemento del RecyclerView donde se le puede aplicar el patrón de diseño ViewHolder, el LayoutManager es el encargado del aspecto visual es decir se encarga del layout de todas las vistas que contenga el RecyclerView y define como deseas  mostrar los elementos en la pantalla por ejemplo tipo listado LinearLayoutManager de forma horizontal o vertical, tabla tradicional GridLayoutManager o tabla apilada o celdas no alineadas StaggeredGridLayoutManager como también se puede crear un LayoutManager propio y así ver como se accederá a los elementos que se muestran en la pantalla de una manera muy flexible.

El componente ItemAnimator es el encargado de las animaciones de los elementos que sean eliminados, añadidos, movidos o modificados en el RecyclerView.

Por defecto el RecyclerView utiliza el DefaultItemAnimator que es una implementación que contiene animaciones básicas como por ejemplo las acciones de eliminar, añadir, mover o modificar los elementos en un RecyclerView, se le asigna al RecyclerView con el método setItemAnimator() además de cuando se realice cada acción sobre los datos se llamara a su método de notificación correspondiente para que pueda actualizarse como debe y ejecute la animación correspondiente. Por lo cual cuando se añade un elementos se utiliza notifyItemInserted() y la posición donde estará el nuevo elemento, cuando se actualize un datos se utiliza notifyItemChanged(), cuando se elimina un dato utilizamos notifyItemRemoved() y cuando se mueve de sitio se utiliza notifyItemMoved().

También se pueden utilizar subclases de ItemAnimator para hacer animaciones personalizadas para las acciones de los elementos del ViewHolder. Pero con los métodos dispatchAnimationFinished(ViewHolder) para cuando finalice la animación de un ViewHolder y con animateAppearance(), animateChange(), animatePersistence(),animateDisappearance() y otros más métodos.

Para más información sobre estos métodos del ItemAnimator: RecyclerView.ItemAnimator.html

 

El componente ItemDecoration es el encargado de cambiar visualmente cada elemento y personalizar el aspecto de un RecyclerView además de la distribución de los elementos en la pantalla sin modificar los parámetros del layout con separadores o divisores en una lista añadiendo relieves, límites de grupos, etc… y se le asigna al RecyclerView con el método setItemDecoration().

También se puede crear un ItemDecoration personalizado creando una clase que debe extender de la clase RecyclerView.ItemDecoration además de implementar sus propios métodos getItemOffsets() que es el encargado de añadir los límites de los elementos de la lista y onDraw() o onDrawOver() que se encarga de diseñar o pintar el elemento para personalizarlo.

Con ItemDecoration los elementos se visualizan en el orden que se añaden, antes las vistas de elementos (item views) en onDraw() y después los elementos (items) en onDrawOver() en el RecycleView.

Para más información sobre el ItemDecoration:  RecyclerView.ItemDecoration.html

 


Fuentes utilizadas:

androcode.es

www.sgoliver.net

Git

Sistema de control de versiones

Los sistemas de control de versiones son programas que se utilizan para controlar los cambios de los archivos de código de las aplicaciones en desarrollo, y así saber en que estado esta, es decir en que versión esta el proyecto. Ademas de saber los cambios que se han hecho y en que apartado como también de las personas que lo han modificado, etc.

En la actualidad se debe incluir un control de versiones para la administración en un proyecto de desarrollo, para poder agilizar  el trabajo hecho en grupo y poder tener un seguimiento de los cambios de cada uno de los archivos del proyecto aunque también es necesario y de gran ayuda para un trabajo desarrollado por una sola persona.

Sus características son poder comparar el código de un archivo y así poder ver las diferencias entre versiones, como también restaurar versiones antiguas, además de juntar cambios entre diferentes versiones y trabajar con distintas ramas en el desarrollo de un proyecto y su producción.

Ahora que sabemos lo que es un sistema de control de versiones sabemos lo que es el Git, ya que es exactamente eso.

También está el Github que es un servicio para almacenamiento de repositorios gestionados por Git, por lo que Git nos sirve para controlar el estado de un proyecto en desarrollo a largo tiempo.

Otra característica de Git es que es un tipo de sistema de control de versiones distribuido.

Pero existen varios tipos de sistemas de control de versiones, como los sistemas distribuidos y centralizados.

Sistemas centralizados

El sistema centralizado es el único lugar donde está todo el código del proyecto de manera completa donde hay un servidor que mantiene el repositorio es decir en un único directorio. Por lo tanto los desarrolladores que quieran trabajar con el código de esa versión hacen una copia local para modificarlo y cuando terminan y esta listo y en funcionamiento guardan la nueva versión en ese único directorio. CVS utiliza este sistema por ejemplo.

Sistemas distribuidos

El sistema distribuido cada uno de los integrantes del equipo mantiene una copia local del repositorio completo con todas las versiones y todo su historial y no central. Al disponer de un repositorio local, se puede enviar cambios al sistema de control de versiones en local es decir hacer commit , sin necesidad de estar conectado a Internet o cualquier otra red. En cualquier momento y en cualquier sitio donde esté puedo hacer un commit.  Además puedes compartirlo con otros desarrolladores y sincronizar los repositorios y así si un desarrollador ha modificado determinados apartados y otro desarrollador no, los repositorios modificados se convierten en la versión más actualizada. Por lo tanto tener un repositorio completo facilita ser autónomo y poder trabajar en cualquier momento. Por ejemplo Git es un sistema de control de versiones distribuido.

Para mas información ver en Sistemas distribuidos.

En los sistemas distribuidos se utilizan las ramas o branching que son utilizadas cuando inicializamos o clonamos un repositorio obteniendo siempre una rama principal llamada por defecto master. Por ejemplo si queremos añadir a un proyecto una nueva funcionalidad con Git, debemos crear una nueva rama con su respectivo nombre descriptivo en el cual iremos añadiendo los cambios y después cambiaremos a esta rama.

Aquí puedes encontrar mas información sobre lo que es una rama en Git.

La historia de Git es que es un software de control de versiones diseñado por Linus Torvalds, el mismo que del kernel Linux en el año 2005, para mejorar la eficacia y la confidencialidad del mantenimiento de versiones de aplicaciones cuando tienen muchos archivos de código fuente y siendo una alternativa de BitKeeper, un control de versiones privativo que usaba en ese entonces para el kernel creando así Git de software libre y siendo multiplataforma, por lo que puedes usarlo y crear repositorios locales en todos los sistemas operativos más comunes, Windows, Linux o Mac.

Para mas información sobre la Historia de Git aquí.

El Git tiene unos comandos básicos como:

Commit: que es para agregar un comentario sobre las modificaciones que has hecho en el fichero y así poder enviar los cambios al repositorio.

Add: mueve al índice los cambios que hemos hecho.

Status: muestra el estado de la rama actual como los cambios que hay sin commitear.

Checkout: recupera un archivo desde la rama o la revisión actual

Log: muestra el log del commit, opcionalmente de la ruta especifica

Pull: descarga y guarda los cambios realizados desde un repositorio remoto

Push: guarda los cambios en un repositorio remoto

Branch: lista las ramas locales