jueves, 17 de enero de 2008

CONCEPTOS BÁSICOS

Un videojuego consiste en un entorno informático que reproduce sobre una pantalla un juego cuyas reglas han sido previamente programadas. Desde su aparición, a principios de los de la década de 1970 en California, los videojuegos han alcanzado una gran relevancia cultural y económica. Su influencia trasciende el ámbito estricto de las industrias del entretenimiento, de la informática y de la electrónica de consumo, a las cuales, están relacionadas entre si. El entretenimiento informático implica aspectos relacionados con los hábitos culturales en sentido amplio

Empezaremos esta sección con el elemento mas básico que todos conocemos a través del cual visualizamos los videojuegos, el monitor, éste se conecta al computador a través de una tarjeta de video. Esta tarjeta es un circuito integrado que nos permite transformar las señales digitales con las que trabaja Este proceso es realizado a través de un conversor analógico-digital que toma la información que se encuentra en la memoria de video y luego la lleva al monitor. El conversor con el que realizamos esta acción se conoce como RAMDAC.

La superficie de la pantalla de un monitor es fluorescente y está compuesta por líneas horizontales. El hardware del monitor actualiza de arriba hacia abajo cada una de estas líneas. Para dibujar una imagen completa el monitor lo hace a una cierta velocidad, a esto se le conoce como frecuencia de refrescado y se mide en Hz. Los valores frecuentes son de 60/70 Hz.

El tiempo que existe entre dos refrescos de pantalla se conoce como vertical retrace, y corresponde al momento en que el haz de electrones del monitor regresa a la parte superior de la pantalla.

El concepto más básico usado en la programación gráfica es el de Pixel, significa Picture Element, es decir, un elemento de una imagen que corresponde a la unidad mínima que esta puede contener. La imagen que está formada por un arreglo ordenado de pixeles en forma de grilla o cuadricula, se conoce con el nombre de Bitmap. Un bitmap posee dimensiones: ancho y alto (que se miden en número de pixeles) y además tiene asociado un formato, que puede ser alguno de los ya conocidos: bmp, png, jpg, gif, etc.

Una imagen tiene otras características, aparte de sus dimensiones, una de estas es la profundidad de color. Esto corresponde al número de bits necesarios para poder representar un color, es conocido por las siglas BPP (Bits Per Pixel).

El número de bits que podemos utilizar es de 1, 8, 16, 24 o 32. Con este dato podemos saber cual será el número máximo de colores que puede representar una imagen en pantalla. El color se representa en pantalla utilizando el Modelo RGB (Red, Green, Blue), es decir, para formar un color necesitamos conocer la intensidad de estos colores primarios.

La resolución nos permite conocer cuanto detalle existe en una imagen, esto quiere decir que a mayor resolución obtendremos mayor calidad. La resolución no solo se aplica a una imagen, sino que también a la pantalla o monitor. Existen algunas resoluciones estándar: 320x200, 320x240, 640x480, 800x600, 1024x768, 1152x864, 1280x720, etc. El Modo de video es la unión de la resolución con la profundidad de color y se denota como AnchoxAltoxBpp.

La Video RAM, básicamente es la memoria o buffer que se encuentra en la tarjeta de video. Toda tarjeta de video tiene como mínimo una memoria, un microprocesador, una caché y un bus de datos, que normalmente es AGP.

En la Video RAM se almacenan los datos que serán mostrados posteriormente en la pantalla, estos datos pueden ser texturas, vértices, etc.

-Técnicas 2D

Sprites

Un sprite es cualquier objeto que aparece en nuestro videojuego. Normalmente tiene asociado algunos atributos, siendo los más básicos una imagen y una posición. Los sprites pueden ser estáticos o dinámicos. Al hablar de sprite estático, nos referimos a un objeto que no cambiará su posición durante el videojuego, por ejemplo la imagen de una llama, piedra, etc. En cambio un sprite dinámico, es aquel que tendrá algún tipo de movimiento, el cual puede ser realizado por el usuario o por el computador, por ejemplo el sprite de un jugador o de los enemigos.

Animación de Sprites

Esto es bastante simple, aquí aparece el concepto de frame o cuadro, que corresponde a una de las imágenes que forman la animación completa de un sprite. El número de frames dibujados en un periodo de tiempo se conoce como frame rate (tasa de frames), siendo un aspecto muy importante en la animación, ya que de esto depende la calidad de animación que obtendremos. Si cada uno de los frames se muestra muy rápido o muy lento, la ilusión del movimiento se perderá y el usuario verá cada uno de los frames como una imagen separada. La totalidad de los frames que forman un personaje, suele almacenarse en un solo archivo de imagen, a esto se le llama sprite sheet, es decir, una imagen donde tenemos secuencias de frames para las diferentes acciones que puede realizar un personaje en un videojuego.

Transparencias

Transparencias: Color Keys

Cuando mostramos una imagen en pantalla, esta siempre se verá como un cuadrado o rectángulo, pero sabemos que dentro tiene la representación de un objeto, personaje, enemigo, ítem, etc. Al dibujar esta imagen queremos ver solo la forma que representa, para esto debemos elegir algún color transparente, pintar con ese color las zonas que no queremos que aparezcan y luego dibujar la imagen ignorando dicho color.

Transparencias: Máscara

Existe otro método para ignorar un color en una imagen, el uso de una máscara que se antepone al bitmap original, es decir, debemos tener otro bitmap que indica cuales son los pixeles transparentes.

Transformaciones

Translation

Esta es la transformación más simple, corresponde a cambiar la posición del sprite para luego dibujarla en otro lugar de la pantalla, dando el efecto de movimiento, sin duda lo más usado en cualquier videojuego. Y se resume en asignar una nueva posición a las coordenadas (x, y) del sprite.

Rotation

Consiste en girar el sprite un número determinado de grados. Se usa para mostrar objetos vistos desde otro ángulo.

Scaling

Consiste en escalar una imagen, es decir, cambiar su tamaño (normalmente de forma proporcional), ya sea un aumento o una disminución. Se puede usar para dar un efecto de profundidad.

Flipping

Básicamente existen dos tipos, Vertical Flip que corresponde al efecto que se produce cuando se refleja un objeto en el agua y Horizontal Flip que corresponde al reflejo de un objeto en un espejo.

Alpha blending

Alpha blending o mezclado alpha es una técnica para crear transparencias en una imagen con respecto al fondo. Para lograr esto se agrega un cuarto canal a un color, llamado canal alpha. Ahora los colores de una imagen se representarán como RGBA. Cada valor alfa de un pixel representa su grado de opacidad, donde un valor cero indica un 100% de transparencia, y a medida que aumentamos su valor se irá haciendo más opaco. El rango va desde 0 a 255.

Screen Buffer

El screen buffer es un área de la memoria de video, donde podemos dibujar algo que se mostrará en la pantalla. Si queremos mostrar un pixel, debemos tener un puntero a la dirección de memoria de video y calcular la posición donde queremos dibujar el pixel y luego en esa posición copiar el byte o los bytes que representan el color.

Surface

Básicamente es una zona de memoria que puede estar en la RAM o Video RAM y es usada para almacenar un bitmap.

Blitting

El blitting es una operación para transferir un bloque de bytes (surface) de un sector de la memoria a otra es una forma de renderizar (dibujar) sprites con o sin transparencias sobre un fondo. Esta técnica puede ser acelerada por hardware, lo cual ayuda a incrementar bastante el rendimiento, de hecho esta operación es una de las más críticas en cualquier videojuego.

Double Buffering

Para entender esta técnica, antes que todo debemos saber que el monitor ya sea CRT (Tubo de rayos catódicos) o LCD (Pantalla de cristal líquido), no dibuja la imagen en la pantalla instantáneamente, sino que lo hace pixel a pixel, partiendo desde la esquina superior izquierda hasta la esquina inferior derecha. Esto se realiza a una velocidad bastante rápida que el ojo humano no percibe, y a este tiempo, como vimos al principio, se le conoce como frecuencia de refrescado.

Dirty Rectangles

Esta técnica es una forma de optimizar la anterior. Con Double Buffering su funcionamiento es bastante simple. Copiaremos a la Video RAM solo las áreas de la pantalla que han cambiado, por lo tanto, cada vez que algún sprite cambie su posición, copiaremos a la memoria de video el área de un rectángulo que rodee al sprite y la colocaremos justo en las mismas coordenadas en la Video RAM.

Clipping

Consiste en definir una área de recorte para la pantalla, es decir, todo lo que se dibuje fuera de esta área será ignorado y no se mostrará en pantalla.

Sincronización en los videojuegos

Lo ideal en cualquier videojuego, es que todos los objetos se muevan a la misma velocidad, independiente de la velocidad del computador donde se ejecute.

Sincronización por Framerate

El primer método, consiste en sincronizar el framerate, también conocido como FPS o Frames per Second (Frames por segundo). Al hablar de FPS, nos referimos a la frecuencia con que se ejecuta el ciclo principal de un videojuego en un segundo. A mayor cantidad de FPS obtendremos una mayor fluidez en las animaciones.

Sincronización por Tiempo

El segundo método consiste en sincronizar en base al tiempo. En este método no importa el framerate que posea el videojuego, pero aun así los objetos se moverán a la misma velocidad en todas las máquinas.