Este sistema es ideal para los juegos del tipo survival horror o para simular la línea de visión al estilo comandos (en este último caso, hay que ponderar muy bien la cantidad de enemigos y la calidad del hitTest para no lentificar el programa).
Muevan el personaje con W y S, con + y - modifican la cantidad de muestras y con arriba y abajo la calidad del hitTest. Tengan en cuenta que sólo calcula la luz al mover el mouse, para no desperdiciar recursos.
Básicamente, por cada muestra creamos un rayo, verificamos hasta dónde puede ser extendido, almacenamos esas coordenadas y dibujamos un área delimitada por estos puntos.
Nada difícil, pero puede servir para lograr resultados interesantes. Tanto la calidad como la performance se pueden modificar sin dificultad.
Bajar el .fla
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por Carloz el 25 de Julio de 2007
Por HernanRivas el 25 de Julio de 2007
Por Freddie el 27 de Julio de 2007
Por HernanRivas el 27 de Julio de 2007
Lo que hacemos es algo similar al raytracing. El mismo concepto que se aplica en los programas de diseño 3D para crear sombras y reflejos.
Básicamente el raytracing hace lo siguiente. Crea una serie de rayos y los extiende hasta dónde sea posible (es decir, hasta que intercepten una pared, un personaje o cualquier objeto sólido). En ese momento, dependiendo para qué lo estemos utilizando, los refleja o genera un punto luminoso.
Pero, en ésta aplicación, hacemos algo más simple.
Tomamos como centro un MC (con una pequeña modificación a la función, ésto dejaría de ser necesario, pero es práctico para actualizar la posición del haz en caso de que el MC se mueva). Entonces, por cada muestra, lanzamos un rayo y vemos hasta dónde llega.
Cómo? Bien, primero dividimos el ángulo de la linterna por el número de muestras, determinando cuánto debe variar el ángulo para cada rayo.
Para cada rayo, calculamos cuan lejos puede llegar sin que colisione con la pared. Para eso calculamos el punto inicial, luego avanzamos un poco en la dirección deseada y verificamos colisión, avanzamos, verificamos, etc... Cuánto avanzamos está determinado por la variable px, que determina la calidad del hitTest, mientras que la variable muestras, determina el número de rayos que lanzamos.
Ahora bien. Cada vez que uno de los rayos da positivo para el hitTest o cuando se extendió hasta la distancia máxima, almacenamos esa posición, es decir cuan lejos puede ir.
Después, usamos lineTo y beginFill, para generar el haz lumínico. Partimos desde el origen de la luz, hacemos una línea hacia el primer punto, luego al segundo, al tercero, etc. Hasta que llegamos al último, donde hacemos un lineTo al punto inicial. En ese momento, la función terminó y ya tenemos el borde del haz de luz.
Como dije al principio, éste método es análogo al usado por programas como 3D Max o Maya para generar los efectos lumínicos. No se usa actualmente en videojuegos debido a que es muy difícil hacerlo en tiempo real simplemente por el tiempo que demora en generarse la iluminación.
Qué se usa en los videojuegos? Bien, básicamente se generan los rayos a partir de los polígonos que forman el escenario. Ésto tiene ciertas limitaciones como la calidad o la incapacidad para generar efectos sumamente complejos, como reflejos de reflejos de reflejos, aunque, por otro lado, es mucho (muchísimo más rápido). Actualmente, se está trabajando para mejorar ésto, especialmente gracias a los chips de varios núcleos.
Pero volviendo al tema, aclaro que éste método no es el mejor en todos los casos. Es decir, si definiéramos los objetos dando las coordenadas de los puntos que los forman, podríamos calcular exactamente los bordes de la linterna. Claro que ésto requiere más matemática y no permitiría que dibujemos el área de juego y nos olvidemos del problema.
Por HernanRivas el 27 de Julio de 2007
Por Yo el 27 de Agosto de 2008
Por Yo de nuevo el 27 de Agosto de 2008