Comunidad de diseño web y desarrollo en internet online

juego de paltaforma(teoria)

Citar            
MensajeEscrito el 30 Dic 2006 05:40 am
Hola que tal, pues estaba de oseoso en mi compu y ya que tengo muchas vacacioens se em ocurrio hacer un juego en flash, ya he hecho algunos pero ahora me gustaria hacer uno de plataformas como mario bros o algo asi, pero quisiera saber aunque sea solo teoricamente cmo hacer que el un bjeto que mueva reaccione con cualquier otro objeto, es decir que si brinco en una plataforma se detenga y deje de caer, esto ya lo he hecho con si mas no recuerod con la funcion hitTest pero el problema es que hay que programar cada objeto con el que que quiero que "reaccione", la idea seria aplicar esto a cada objeto de una forma mas facil.

otro ejemplo sobre lo que quiero decir seria un laberinto en 2d, si muevo un objeto este no puede avanzar si hay una pared, solo por donde no hay pared, entonces la unica manera que se me ocurre de hacerlo es hacer que cada cuadro de la pared sea un objeto y con la funcion HitTest, progrmando cada "cuadro", pero seir amuy complicado programar el objeto que se mueve para cada cuadro, entocnes de que otra manera hacerlo

Espero haberme explicado bien sino con gusto les traduszo ^^
saludos

Por albries

34 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 30 Dic 2006 05:52 am

Por Koeth

655 de clabLevel

1 tutorial

 

El DeFectuoso

firefox
Citar            
MensajeEscrito el 30 Dic 2006 01:54 pm
Mmm... para lo del salto podría ayudarte la función hitTest aplicada de la siguiente manera:
La mayoría de las veces usamos:

Código :

if(this.hitTest(terreno_mc)){...
Que nos lo capta de la siguiente manera:

(lo que está en verde son las plataformas que toma ActionScript)
Pero si usamos algo como:

Código :

if(this.hitTest(terreno_mc._x,terreno_mc._y,true)){...
O parecido (tendrás que ajustarlo), el objeto reacciona de la siguiente manera:

Así tendrás tus plataformas perfectamente definidas ^^
Saludos!

Por nestorrente

1010 de clabLevel

10 tutoriales

 

Vigo

firefox
Citar            
MensajeEscrito el 31 Dic 2006 02:08 am
Este es otro de mis ejemplos de códigos en flash 8.
Trata de la detección real de la colisión entre objetos. La función hitTest() toma el rectángulo completo de un MC como area de detección. Eso produce que si por ejemplo queremos "chocar" dos círculos nos devuelva "true" cuando todavia no se han tocado realmente, sobre todo si se juntan en la diagonal. en resumen, no podemos con hitTest() detectar correctamente colisiones entre formas curvas o complejas.
En el caso de un laberinto, el laberinto seria la pista y el coche......Teseo perdido en el laberinto :)

El ejemplo tiene:
Nada en el escenario.
3 Mcs:
Uno llamado desde la bibliteca para vinculación con el nombre pista. Es la zona verde. He puesto dentro además un campo de texto dinámico con la variable texto para indicar la detección de la colisión. Desde ese punto, y en lugar del texto, tomaremos la salida para llamar a las funciones que queramos ejecutar al detectar la colisión.
Otro MC con vinculación coche que contiene a otro MC vista. vista es el nombre de la instancia del MC contenido en coche y donde está el dibujo del coche propiamente.
Dicho de otro modo: dibujo el coche y lo convierto en movieclip, (centro del MC en el centro del coche). Cojo un MC vacio, al que llamo coche en vinculación de biblioteca, y le arrastro dentro el MC con el dibujo y le pongo a este MC como nombre de instancia vista. Este MC también centrado.

Detecta a nivel de pixel. Usa el sistema de Matrices (clase Matrix) para el movimiento. Usa solo un bitmap de test por lo que es realmente rápido y, con los cámbios adecuados, puede detectar multicolisiones de varios objetos. Pero eso es motivo de otro ejemplo más avanzado.
No uso un enterFrame para no saturar el post. Empleo para el control la teclas de dirección. No es la mejor manera, pero para el ejemplo vale.
Y solamente este código en el raiz:

Código :

import flash.geom.*;
Mx=new Matrix(); My= new Matrix(); Rx=new Matrix(); teclado=new Object();
CT  = new ColorTransform(0,0,0,1,0,255,255,0);
CT2 = new ColorTransform(0,0,0,1,255,255,255,0);
this.attachMovie("pista","pista",1); this.attachMovie("coche","coche",2);
test=new flash.display.BitmapData(pista._width,pista._height,false);
teclado.onKeyDown = function(){
 a=Key.getCode(); b=3*((a==Key.UP)-1*(a==Key.DOWN));
 Rx.rotate(-.1*( a==Key.LEFT)+.1*( a==Key.RIGHT));
 Mx.translate(Rx.a*b,Rx.b*b); CRx = Rx.clone(); CRx.concat(Mx);
 coche.vista.transform.matrix = CRx;
 test.draw(pista,My,CT,"normal"); test.draw(coche,My,CT2,"difference");
 test.getColorBoundsRect(0xffffff,0xff0000,true).isEmpty() ? 
 pista.texto = "" : pista.texto = "IMPACTO";
}
Key.addListener(teclado);
1,3Kb
PINCHAR EN LA IMAGEN Y USAR LAS FLECHAS

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

msie
Citar            
MensajeEscrito el 31 Dic 2006 04:48 am
muchas gracias es justo lo que necesitaba

feliz año

Por albries

34 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 31 Dic 2006 04:14 pm
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-38)*(a!=40));
El equivalente exacto sería:
a = Key.getCode(); a>36 && a<41 ? b = -3*(a-39)*(a!=37); Rx.rotate(.1*(a-38)*(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.

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

msie

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.