Como ya he dicho en otro post, no respondo a mensajes privados sobre temas que se han posteado. El sitio para preguntar y contestar creo que es este en beneficio de todos nosotros.
Bien, ahora explico el código:
Código :
import flash.geom.*;
Mx=new Matrix(); My= new Matrix(); Rx=new Matrix(); teclado=new Object();
Definir las matrices que se necesitarán y el objeto teclado para el listener.
Código :
CT = new ColorTransform(0,0,0,1,0,255,255,0);
CT2 = new ColorTransform(0,0,0,1,255,255,255,0);
Definimos también dos transformaciones de color.
CT tranforma sin usar el color rojo (0,225,255) y
CT2 transforma a blanco (255,255,255) no usamos las transparencias aunque en algunos casos se pueden usar. Podríamos haber usado cualquier color como "filtro". En el ejemplo se usa el rojo.
Código :
this.attachMovie("pista","pista",1); this.attachMovie("coche","coche",2);Cargamos la
pista y el
coche que tenemos en la biblioteca. Sus colores no son importantes, pueden ser los que queramos, incluso el color que usemos de filtro.
Código :
test=new flash.display.BitmapData(pista._width,pista._height,false);
Creamos un bitMap del tamaño de la pista que trabajando por debajo de lo visible en escenario (ya que no lo hemos asociado a ningun MC) hará el
test de contacto. Usamos false porque no usamos transparencias.
Código :
teclado.onKeyDown = function(){Creamos la función de mando, en este caso usamos la pulsación de teclado. Será llamada desde el listener cada vez que se produzca ese evento.
Código :
a=Key.getCode(); b=3*((a==Key.UP)-1*(a==Key.DOWN));
Rx.rotate(-.1*( a==Key.LEFT)+.1*( a==Key.RIGHT));
Tomamos el valor de la tecla pulsada de entre las teclas flecha y mediante condicionales de operación decidimos el giro. El giro esta en .1 radianes por pulsación y la velocidad de avance en 3.
Este otro código seria equivalente, aunque menos comprensible y ademas deja que otras teclas hagan cosas no deseadas.
a = Key.getCode(); b = -3*(a-39)*(a!=37); Rx.rotate(.1*(a-3
*(a!=40));El equivalente exacto sería:
a = Key.getCode(); a>36 && a<41 ? b = -3*(a-39)*(a!=37); Rx.rotate(.1*(a-3
*(a!=40)) : null;Código :
Mx.translate(Rx.a*b,Rx.b*b); CRx = Rx.clone(); CRx.concat(Mx);
coche.vista.transform.matrix = CRx;
También decidimos la translación sabiendo que los valores de seno y coseno del giro ( la orientación del coche) esta almacenada en la matriz de rotación
Rx dentro de los valores de la matriz a y b:
Rx.a y
Rx.b. Los multiplicamos por la decisión que habíamos almacenado en la variable
b anterior al testear el UP o DOWN.
Posteriormente recreamos la Matriz
CRx clonando los valores de rotación, le concatenamos el movimiento de translación
Mx calculado y la matriz de tranformación así compuesta se la aplicamos al MC.
El chequeo del teclado y la asignación del movimiento terminan aquí, puede ser cualquier otro sistema. El test de contacto se efectua en las siguientes líneas.
Código :
test.draw(pista,My,CT,"normal"); test.draw(coche,My,CT2,"difference");
"Dibujamos" la pista en el BitMap
test con la Transformación de color
CT (sin rojo) y le Añadimos restando el dibujo de
coche cuyo color transformamos con
CT2. Si hay algún punto de contacto esa será la salida : un dibujo conteniendo rojos. Si no hay contacto el
test no contendrá nada rojo.
Código :
test.getColorBoundsRect(0xffffff,0xff0000,true).isEmpty() ?
Este condicional mira si existe algúna zona (rectángulo) donde exista color rojo en el bitmap
test. Si no hay es decir si es un rectangulo vacio(
is empty) entonces no hay contacto. Si el rectángulo tiene dimensiones
es que hay color rojo en el bitmap e indica contacto entre pista y coche. Esta es la salida del test.
Código :
pista.texto = "" : pista.texto = "IMPACTO";
}
Una forma como otra cualquiera de usar la salida del test.
Código :
Key.addListener(teclado);
Y listo.