[XNA] Simulación de un semáforo de tráfico

En este sencillo ejemplo se puede ver un tema interesante, y a mi parecer poco “documentado”, y es a acceder a las distintas partes de un Modelo 3D desde XNA. La lógica del semáforo no es complicada, y ha sido pensada para que sea fácil añadir muchos semáforos en un mundo 3D.

La clase más importante, de cara a la lógica, es Semaforo, que es la que contiene toda la información relativa al estado actual “y futuro” de cada uno de los semáforos. Entremos en un poco más de detalle:


Campos, métodos y propiedades más importantes

  • ID: Relaciona el semáforo con el modelo 3D. En este caso lo he diseñado con 3DMax 2010.
  • Tempo: Contiene una lista de tempos del semáforo. Describe los estados (colores) y el tiempo que debe permanecer cada uno de ellos. Nota: El concepto tempo me lo acabo de inventar…
  • ultimoUpdate: Se utiliza en el método Update, para comprobar si ha transcurrido el tiempo necesario para pasar al siguiente estado del semáforo (lo que significaría un “cambio de color”).
  • currentIndex: Utilizado sólo para acceder de manera indexada a la lista de tempos

  •  Current: indica el tempo actual (lo que viene a ser el color, una vez renderizado).

El método AddTempo (sobrecargado), permite añadir tempos a la clase. Me resulta práctica esta sobrecarga, en la que le pasamos todos los tempos directamente.

public void AddTempo(TempoSemaforo[] _tempo)
{
     foreach (TempoSemaforo tempoActual in _tempo)
          Tempo.Add(tempoActual);
}

En este código podemos ver como se usaría este método, por ejemplo desde la clase Game:

TempoSemaforo[] temposSemaforo1 = { new TempoSemaforo(TempoSemaforo.Estado.Verde, TIEMPOVERDE), new TempoSemaforo(TempoSemaforo.Estado.Ambar, TIEMPOAMBAR),
                                                             new TempoSemaforo(TempoSemaforo.Estado.Rojo, TIEMPOROJO) };

TempoSemaforo[] temposSemaforo2 = { new TempoSemaforo(TempoSemaforo.Estado.Rojo, TIEMPOROJO), new TempoSemaforo(TempoSemaforo.Estado.Verde, TIEMPOVERDE),
                                                             new TempoSemaforo(TempoSemaforo.Estado.Ambar, TIEMPOAMBAR) };

this.grupoSemaforos[0].AddTempo(temposSemaforo1);
this.grupoSemaforos[1].AddTempo(temposSemaforo2);

Lo que estamos haciendo aquí es definir los distintos estados que tendrá el semáforo, y el tiempo que durará cada uno de ellos. Cuando el semáforo llega al último estado, vuelve a comenzar en un bucle “Infinito”. Esto lo he dejado así para darle un poco de flexibilidad, ya que hay un montón de tipos de semáforos distintos aunque no lo parezca…

Como tema importante, queda destacar que en el método draw deberemos ejecutar este código por cada uno de los semáforos de la lista:

if (mesh.Name.Contains(semaforo.ID))
{
     effect.DiffuseColor = black;

     if (mesh.Name == semaforo.ID + “verd”&& semaforo.Current.estadoSemaforo == TempoSemaforo.Estado.Verde)
     {
          // Verde
          effect.DiffuseColor = new Vector3(0, 1, 0);
     }

     if (mesh.Name == semaforo.ID + “ambar” && semaforo.Current.estadoSemaforo == TempoSemaforo.Estado.Ambar)
     {
          // Verde
          effect.DiffuseColor = new Vector3(1, 0.5f, 0);
     }

     if (mesh.Name == semaforo.ID + “roig” && semaforo.Current.estadoSemaforo == TempoSemaforo.Estado.Rojo)
     {
          // Rojo
         effect.DiffuseColor = new Vector3(1, 0, 0);
     }
}

Resultado final

[View:http://www.youtube.com/watch?v=kJbf-4p-iuk:550:0]

El código se puede descargar en este enlace.

2 comentarios en “[XNA] Simulación de un semáforo de tráfico”

  1. Interesante aporte si señor, lo probaré esta tarde en casa.
    Como novato en esto del 3D en XNA, me pica la curiosidad lo del acceso a las distintas partes de un modelo y lo que se puede sacar de ahí.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *