Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: mamaffia en Junio 24, 2015, 02:25:26 AM

Título: device_mouse con bucle for
Publicado por: mamaffia en Junio 24, 2015, 02:25:26 AM
Hola amigos, tengo un problema, usando las funciones device_mouse con bucle for para multitouch me pasa que en dos objetos distintos no me permite moverlos por separado, osea los objetos se mueven con el dedo en Android, solo me permite mover el objeto 2 si el primero está seleccionado, estoy haciendo algo mal? desde ya muchas gracias. A continuacion el código usado en el evento step de cada objeto


for i=0; i<4; i+=1
if mover==1
{
x=mouse_device_x(i)
y=mouse_device_y(i)
}
else
{
soltar=1
}

Título: Re:device_mouse con bucle for
Publicado por: Iros en Junio 24, 2015, 04:58:37 AM
No se mucho sobre esa función pero tendrías que revisar el código, como lo pusiste no está entrando en todo en el bucle for, tendría que ser así:

[gml]
for (i=0; i<4; i+=1) {
    if (mover==1) {
       x=mouse_device_x(i)
       y=mouse_device_y(i)
    } else {
       soltar=1
    }
}
[/gml]
Título: Re:device_mouse con bucle for
Publicado por: Clamud en Junio 24, 2015, 03:36:15 PM
Se ve que ese código mueve los dos objetos a la misma posición, y siempre a la posición del cuarto punto táctil. Si los dos usan el mismo código no pueden moverse de forma independiente, sin embargo, falta ver cómo se asignan las variables "mover" y "soltar". ¿Cómo quieres que se muevan los objetos?, para tener una idea de qué código te puede servir.
Título: Re:device_mouse con bucle for
Publicado por: arcangelcaos en Junio 24, 2015, 04:51:27 PM
Una cosa, ahora que voy a empezar yo un proyecto que requiere multitouch.
mouse_device_x(i)
mouse_device_y(i)

Con eso se controla que touch, es no??, el 1, el 2, o el 3, etcc. Verdad?

Entonces lo que deberías de hacer es por un lado cuando se toque ese objeto asignarle el valor del touch que toque a una variable de ese objeto.
Y luego  x = mouse_device_x(lavariable), y lo mismo con la y, asi ese objeto seguirá a ese touch en concreto no???? O estoy confundido??
Título: Re:device_mouse con bucle for
Publicado por: mamaffia en Junio 24, 2015, 05:40:56 PM
Hola amigos, gracias por la ayuda...

Iros: Yo no suelo usar tampoco demasiado el bucle for aunque para algunos casos es indispensable, voy a revisar lo que me dices a ver si tal vez está mal implementado de la forma que lo hice.

Clamud: Esa es exactamente la sensación que me da al probar el juego en el movil, como que quedan guardadas las posiciones en algún número de device, tal vez el 4, cuando toco los dos botones a la vez funcionan perfecto pero de a uno hace cualquier cosa. Lo que quiero hacer es que al tocar con el dedo mover sea verdadero y al matener el dedo sobre el objeto se mueva con el dedo, o sea, arrastrarlo, y al levantar el dedo mover es falso, por lo tanto el objeto queda ahí, en mi mensaje al querer explicar lo que quería hacer nombre una variable "soltar" pero ni siquiera sería necesario tener otra variable más que "mover" de forma local en cada uno de los objetos.

Arcangelcaos: Como veras no soy el más experto en este tema, los chicos que me están ayudando saben más que yo pero por prueba y error te puedo decir que no funciona así, fue lo primero que intenté pero luego entendí, que me corrijan los amigos si me equivoco, pero "device" se refiere a la cantidad de dedos que están tocando la patalla, es decir, si asignamos a una acción el device (1), no pasará al menos que el device 0 esté en uso, si yo pongo a los dos botones, device 0 y device 1 en ese orden el segundo botón no funcionará si se toca primero.
Título: Re:device_mouse con bucle for
Publicado por: arcangelcaos en Junio 24, 2015, 05:58:28 PM
Ya, yo tampoco soy un experto, es más, ni siquiera lo he tocado, estoy hablando desde las suposiciones. Pero pienso lo sienguiente.

CREATE  del objeto
NTouch = 99   (es para que asi no sea ninguno, porque si pongo el 0, es el primer dedo)

EVENT MOUSE PRESSED
if device_mouse_check_button_pressed(0, mb_left) {NTouch = 0}
if device_mouse_check_button_pressed(1, mb_left) {NTouch = 1}
if device_mouse_check_button_pressed(2, mb_left) {NTouch = 2}
if device_mouse_check_button_pressed(3, mb_left) {NTouch = 3}

EVENT MOUSE REALESED
NTouch = 99

STEP
if NTouch < 99
{x = device_mouse_x(NTouch); y =device_mouse_y(NTouch)}


Que coste que no lo he probado, es todo de cabeza y según pienso.

Asi, en el momento de tocar te detecta el touch que es, lo que ya no se si, cuando tu levantas un dedo, los demás touch se reasignan automáticamente, me explico, tenemos el 0,1 y 2, osease 3 dedos. Si yo levanto el touch 0, los otros siguen oprimidos, se cambian automáticamente al 0 y 1, o seguirán en el 1 y 2 hasta tanto no levantes??. Hay esta el problema.

Prueba ese código haber que me dices.
Título: Re:device_mouse con bucle for
Publicado por: mamaffia en Junio 24, 2015, 09:53:09 PM
seguí todo al pie de la letra con una gran ilusión pero lamentablemente ahora hace lo contrario, tengo que soltar un objeto para poder interactuar con el otro, voy a tratar de hacer algunas pruebas más y sino lamentablemente tendré que desistir de la idea, si a alguien se le ocurre algo se lo voy a agradecer. Arcangel mil gracias igualmente por la ayuda, sigo buscando...
Título: Re:device_mouse con bucle for
Publicado por: penumbra en Junio 24, 2015, 10:43:37 PM
Lo que yo puedo ver en cuanto a fallas es esto (quizás me equivoque):

1) La que mencionó Iros: para garantizar que todo eso se ejecute como bucle, debe estar dentro de corchetes/llaves. Como está originalmente, creo que sólo ejecutaría la primer línea (o quizás ninguna) y luego se saldría del ciclo.

2. Si los objetos son independientes en cuanto a movimiento, es decir, que al objeto A no le afecta para nada el movimiento o no movimiento del objeto B y viceversa, entonces el código también falla porque debería haber una bandera de movimiento por cada dispositivo, porque no puede ser que una SOLA variable mover controle el movimiento de dos objetos independientes. Tendría que haber una variable moverA para un objeto y moverB para el otro. Todo esto que menciono es en el caso de que los objetos sean independientes en cuanto a su movimiento, si se deben mover al mismo tiempo, entonces una sola variable MOVER basta.

3. No es necesario usar un par de variables  mover/soltar, porque una sola variable (POR DISPOSITIVO) usada como bandera puede hacer la misma función. Es decir, que si mover moverA es true, se permite mover el objeto, y si la misma variable moverA es false, ya no se permitirá mover el objeto.

4. La principal falla del código pienso que es que se está tratando a todos los posibles "mouses" como uno solo. El código sólo revisa que mover sea 1, y si esto pasa, ya no pregunta nada más y de inmediato (para los 4 casos, o dedos o "mouses") mueve a la misma posición a los objetos. Sin preguntar cuál de esos cuatro dedos tenía que controlar qué cosa

5a) Otro error relacionado con el punto 4 es el siguiente. Si se está usando un ciclo for para revisar distintos dedos, esto quiere decir que el código se está corriendo desde un objeto controlador, pero si se está corriendo desde un objeto controlador, entonces no es correcto decir
x=mouse_device_x(i)

¿Por qué? Porque si en realidad se quiere controlar dos objetos distintos, es necesario DISCERNIR cual de esos dos objetos se quiere controlar, entonces esa x no debería ser x sino objetoA.x u objeto B.x.

Si se quiere usar un ciclo for, dentro del ciclo for se tendrían que hacer preguntas que no se están haciendo (al menos es como lo veo).

1 "¿i es igual a 0?". Si i es igual a 0, estamos hablando del primer dedo, entonces ya estamos DISCRIMINANDO los demás dispositivos, y entonces sólo cuando i sea cero se puede mover el objeto relacionado con el primer dedo

2. "¿i es igual a 1?". Si i es igual a 1, entonces ya podemos preguntar, "¿el botón del dispositivo 1 está siendo presionado?" Ojo que esto nunca se pregunta, lo cuál no tiene lógica, ya que para mover algo con el dedo, hay que preguntar si ese dedo/dispositivo está siendo presionado y sólo se debe mover cierto objeto relacionado con ESTE dedo

Como lo veo, no es estrictamente necesario usar un ciclo for desde un controlador, porque el chequeo se puede hacer dentro de cada objeto que se quiera mover. El objetoA puede revisar el dispositivo 0, el objeto B el 1, etc, etc. Con esto seguramente se ahorrarían ifs dentro del bucle  for, pero igual se puede hacer con un bucle for, pero entonces dentro del bucle for hay que ser más específicos y preguntar a qué dedo nos estamos refiriendo (preguntar en qué iteración se está, ya que la variable del ciclo es la que se usa para referirse a determinado dispositivo/dedo)
Título: Re:device_mouse con bucle for
Publicado por: mamaffia en Junio 24, 2015, 11:05:40 PM
Penumbra, gracias por el trabajo que te tomaste para explicar cada punto, debo analizar detenidamente todos los detalles que me das, lo que sí quería decir es que no usé un controlador, solo puse el código en cada uno de los dos objetos, en principio parecía que funcionaba, como dije, mientras los dos dedos estén apoyados, cada uno en un objeto, la cosa va excelente, ahora bien, cuando quiero mover un solo objeto (algunas veces) el objeto solo desaparece y aparece en otra parte, es decir, apoyo el dedo y aparece en otro lado, levanto el dedo y vuelve al lugar donde estaba cuando lo toqué, es extraño.

Lo que marcabas de la variable "Mover" y de "X=mouse_device...", etc.. es porque siempre desde que hice el código se trató de variables locales, cada una en su objeto, me pareció que sería más práctico ya que en este proyecto nunca serían más de 2 objetos.
Título: Re:device_mouse con bucle for
Publicado por: penumbra en Junio 24, 2015, 11:17:58 PM
Leyendo el post ya me estaban entrando sospechas, pero con lo último que escribes, veo que sí estás usando el mismo código por objeto. No es necesario que cada objeto revise 0,1,2,3 dispositivos, de hecho, no es bueno hacer esto, porque entonces pasan los problemas ya planteados, todos los dispositivos afectan a todos los objetos, y "se hecha a perder" el movimiento individual.

Con que un solo objeto revise un dispositivo (único) debería funcionar. El bucle sólo es necesario si un objeto debe responder a más de un dedo o si un objeto controlador necesita revisar distintos dispositivos al mismo tiempo, y en ese caso se tiene que preguntar el valor de i dentro del bucle o no se sabrá qué dispositivo se está manejando. Hasta donde alcanzo a entender, no necesitas el bucle y puedes referirte directamente al dispositivo 0 o 1 según el objeto en el que estés.
Título: Re:device_mouse con bucle for
Publicado por: arcangelcaos en Junio 24, 2015, 11:53:37 PM
Hola mira, había unas cuantas cosas mal.
Te adjunto un ejemplo. Con el touch 1 mueves el primero, con el 2 el segundo y asi.
Pero esta incompleto, solo faltaría añadir un control, si fuera necesario claro, para determinar que objeto se mueve con que mouse.
Tengo que irme ahora, y no tengo mas tiempo, esto a sido algo rápido,
Título: Re:device_mouse con bucle for
Publicado por: mamaffia en Junio 24, 2015, 11:58:52 PM
Penumbra, cambié el código y haciendo que cada objeto compruebe un único device pasa algo que ya me temía, objeto 0 comprueba device 0 y objeto 1 comprueba device 1, al tocarlos, sólo si el objeto 0 se está moviendo se podrá mover el objeto 1, es decir, si no está en uso el device 0 nunca se ocupa el 1, puedo mover los dos juntos o el objeto 0 solo.
Título: Re:device_mouse con bucle for
Publicado por: mamaffia en Junio 25, 2015, 12:08:43 AM
Arcangel, gracias por el ejemplo, es el mismo problema que contaba hace unos minutos, los objetos que pones para mover, si no muevo el rojo no puedo mover el azul, y si no muevo el rojo y el azul no puedo mover el verde, o sea, el device 1 no funciona sin el 0; ni el 2 sin el 1 y así sucesivamente...
Título: Re:device_mouse con bucle for
Publicado por: penumbra en Junio 25, 2015, 04:36:33 AM
Bueno, al final lo he logrado y he dado con el motivo del error. No uso android así que pedí prestado un móvil (básico) para hacer pruebas  :-[ y apenas es la segunda vez que compilo algo en android.

El multitouch tiene un "truco" o más bien hay que hacer una consideración que se me escapaba. Sin esta consideración se produce el error de que no hay movimiento independiente en el segundo objeto (sólo se mueve al mover el primero).

En un rato subo el código, voy a cenar,  pero sí funciona, dejo constancia para que no digan que no se puede.
https://www.dropbox.com/s/nyjde6ygv5an3y6/multitouch_android.avi?dl=0
Título: Re:device_mouse con bucle for
Publicado por: mamaffia en Junio 25, 2015, 06:23:14 AM
Guau, eso sí es una gran noticia si es cierto, no puedo confiar en eso hasta que no vea dicho código, en ese caso sí te lo vamos a agradecer infinitamente..
Título: Re:device_mouse con bucle for
Publicado por: serviciosadistancia en Junio 25, 2015, 09:29:33 PM
Compañero Penumbra, yo tambien quedo a la espera del codigo  ;) :)
Título: Re:device_mouse con bucle for
Publicado por: mamaffia en Junio 26, 2015, 09:33:22 PM
Hubo algún problema con el código?
Título: Re:device_mouse con bucle for
Publicado por: serviciosadistancia en Junio 28, 2015, 05:03:23 AM
El flaco dijo que sabía y no tiene ni la menor idea jaja, todo bien igual, pero el video si que fue como sobrando...
Título: Re:device_mouse con bucle for
Publicado por: penumbra en Junio 28, 2015, 06:01:10 AM
Jajaja. qué poca fé. Uno se ausenta un par de días y pasa de ser "compañero" a ser el que no tiene ni idea...  :D

Para aquellos usuarios de poca o mucha fé  ;):
http://www.inventati.org/estupidezartificial/web/papers/multitouch.html