Corte tipo Fruit Ninja

Started by Looper, June 25, 2013, 01:27:07 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Looper

Holaaa Aun soy nuevo por acá y en el bennugd pero ojalá me puedan ayudar un poco. Estoy intentando hacer una función con la que se pueda cortar algo en pantalla pero esta sólo se "corta" o "elimina al enemigo" si es un corte como el que se les hace a las frutas en el Fruit Ninja, es decir que si lo toco (touch o click) no pase nada, pero si lo corto o razguño entonces elimine al enemigo. ¿Alguna idea? Tengo pensado una vez maquetado pasarlo a android, por lo que si hay una función que me facilite de entrada esto, sería mejor conocera de ya.

Muchas gracias a todos  :D

Erkosone

Hola Looper, pues es bastante simple, si "mouse.left" guardar la posición del mouse en startXCut y startYCut..   cuando no "mouse.left" guardar la posición del mouse de nuevo en otras variables como endXCut y endYCut.


Con estos 4 datos tienes lo que se llama "box", vamos, una caja, entonces simplemente tienes que comprobar si un objeto está dentro de esa caja, si lo está por ejemplo "si está completamente dentro" pues lo matas..


Como comprobar si un proceso está dentro de la caja? así:


imagina que tienes una sandía o una manzana como gráfico, es una rendoda, vale, es el caso mas simple XD.. haces esto por ejemplo:


Si las 4 variables que definen los 2 vertices del BOX son globales los procesos las conocerán sin mayeo problema, solo has de hacer esto en los procesos "frutas()":
- calcular el ancho y alto del gráfico del gráfico de la fruta, osea, el ancho y alto del mapa del proceso.
- obviando que el punto de control CERO está en el centro del gráfico de la fruta.. haces:
- si: startXCut < ( X - ancho/2 )
- y si: startYCut < ( Y - alto/2 )
- y si: endXCut > ( X + ancho/2 )
- y si: endYCut > ( Y + alto/2 )
- Entonces "la fruta está completamente dentro del BOX".




Obviando que, cada proceso fruta() ya de inicio conocen su ancho y alto y pueden almacenar este dato en 2 variables privadas.. el proceso de detección por boxOverlap es bastante rápido ;)

Looper

Lo intentaré así y les cuento si no.  Gracias!! :D

Drumpi

Bueno, ese método tiene algunos problemas, por ejemplo, no tiene en cuenta que el "centro" del gráfico (el punto de control 0) no esté en el centro del gráfico, la velocidad de la cuchilla o del objeto cortado.
Como algoritmo rápido y sencillo es la mejor opción, sin duda, pero yo probaría a usar collision con type mouse, porque si los elementos no son huecos (no tienen zonas transparentes en medio del gráfico) es fácil ver el punto donde empieza a ser cortado (collision+mouse.left) y dónde termina, ya sea por cruzar al enemigo o soltar el botón antes de tiempo (y decidir si ha habido corte completo o no, y hacer una aproximación al corte).

Ahora, hacer el corte en sí ya es harina de otro costal :D
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Arcontus

La solución de Erlosone es un muy buen punto de partida y me parece muy elegante y original :)
Cierto es que no tiene en cuenta la posición del punto de rotación de la imagen (que por defecto es el centro) ni espejos, rotaciones y demás, pero es un comienzo. :)
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com