sábado, 16 de junio de 2012

Como crear un menú con gráficos acelerados en 2 dimensiones


Unos de los problemas que se presentan al programar juegos en 2 dimensiones es que el menú no tiende a ser muy sutil a los cambios y el tiempo que se dedica a este es muy alto siendo solo una presentación con poca complejidad de funcionamiento de las opciones del juego.

Entender un menú es parte fundamental para poder simplificarlo y hacerlo fácil de modificar y es por eso que dividiremos el menú en las siguiente partes: botones, eventos, animación y estética.

Comencemos con la elaboración del menú!

Nota: Este ejemplo y concepto se basa en la utilización de SDL, pero el concepto es manejable en otros métodos de gráficos 2D y lenguajes tanto Top-Down como POO.

1: hacemos un bosquejo de como se verá el menú:

Es un bosquejo, por lo que no lleva detalles de estética y tampoco planeamiento de efectos visuales, por lo que es solo una plantilla base para tenerlo definido, donde luego los detalles se agregan a los códigos correspondientes.

2: identificamos las partes que componen nuestro menú:

  • Titulo
  • Botón
  • Marcador

3: Determinamos si nuestros componentes tienen más componentes dentro:

En el Botón: texto, evento o función y un marcador según la posición del ratón o uso de las teclas.
En el Marcador: Posición de apunte y textura.

4: Determinamos si manejaremos diferentes tamaños de resolución de pantalla y ajustamos la ubicación mediante un algoritmo de posicionamiento intrínseco en el comportamiento del menú.

5: Empezamos la codificación!

Para codificar tendremos lo siguiente:

Si es en un lenguaje POO (C#, C++,python,etc) podremos usar objetos, por lo que es más sencillo crear los componentes, en caso de que sea un lenguaje Top-Down (C, PASCAL,etc), entonces el mecanismo es diferente

En base a un POO como python, se hace de la siguiente manera:

Codificación de Botón

class Boton:

    Texto = ""
    FuncionLlama = None
    #Separacion del boton con los demas objetos.
    Posx = 0
    Posy = 0

    PosxResolucion = 0
    PosyResolucion = 0


    def __init__(self,texto,funcion,posx,posy):
        self.Posx = posx
        self.Posy = posy
        self.FuncionLlama = funcion
        self.Texto = texto

    def EjecucionEvento(self):
        #Aqui usando el nombre que envio puede llamar la funcion deseada.
        #El nombre de la funcion se pasa sin comillas.
        #Ejemplo (boton = new Boton('hi',Render,15,15))
        #Render sin comillas es el nombre de la función a ejecutar
        self.FuncionLlama()
        #Al agregar () a la variable la ejecutamos

    def NuevaUbicacion(self,x,y):
        self.Posx = x
        self.Posy = y

    def AjusteUbicacionResolucion(self):
        #Ajusto la ubicacion del menu con el tamaño de resolucion.
        #Las coordenadas de Posx y Posy solo son la separación entre Botones.
        print "Aqui se busca ajustar las coordenadas"

    def Render(self):
        #Aqui va el algoritmo de renderizado
        print "Mi algoritmo renderiza"

Se añaden las características deseadas y se ajusta el algoritmo.

Codificación de Marcador


class Marcador:

    Textura = None
    Posx = 0
    Posy = 0
    PosxResolucion = 0
    PosyResolucion = 0
 
    def __init__(self,x,y):
        self.Posx = x
        self.Posy = y

    def NuevaUbicacion(self,x,y):
        self.Posx = x
        self.Posy = y

    def AjusteUbicacionResolucion(self):
        #Ajusto la ubicacion del menu con el tamaño de resolucion.
        #Las coordenadas de Posx y Posy solo son la separación entre Botones.
        print "Aqui se busca ajustar las coordenadas"

    def CambioPosPuntero():
        #El puntero se mueve a la opcion de click
        print "Aqui se ubica el puntero."

    def Render(self):
        #Aqui va el algoritmo de renderizado
        print "Mi algoritmo renderiza"


Se añaden las características deseadas y se ajusta el algoritmo.

Codificación de Titulo?

La clase titulo no es necesaria, por lo que se puede trabajar con una imagen o tipos de letras y lo manejamos directamente sin necesidad de crear un objeto, a menos de que exista dicha necesidad.

Podemos construir el menú!

Con esto tenemos todos los elementos de nuestro menú y lo que nos falta es adicionarlo en una clase que llamaremos menú o simplemente usaremos esto es un esquema Top-Down. Esto es decisión del programador.

En base quedan algunos algoritmos no mostrados como: detección de resolución, ubicación de elementos en base a la resolución, etc, pero como es un esquema de trabajo para simplificar el menú eso concierne a el programador.

Para lenguajes Top-Down, el esquema no varía, sino que en vez de clases trabajamos con funciones y la forma de instanciar el menú es algo más tediosa y necesita más lineas, pero al fin y al cabo es un menú rápido, sencillo y fácil de modificar.