Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: zorge en Febrero 02, 2015, 12:26:44 PM

Título: abarcar todo el sprite
Publicado por: zorge en Febrero 02, 2015, 12:26:44 PM
tengo un codigo para si pincho con el mouse en mi obj_pelota este se mueve a donde muevo yo el mouse mientras tenga pulsado el click izq del mouse y cuando lo suelto cae pero seolo lo coge si pincho en el centro si pincho en un borde del obj_pelota no lo coge como podria hacer para que pinche en donde pince del obj_pelota lo coja??
Título: Re:abarcar todo el sprite
Publicado por: arcangelcaos en Febrero 02, 2015, 01:37:12 PM
Revisate en las opciones del objeto, precise collision, o algo asi. Mira haber que tienes puesto. Quizas se lo tengas marcado, y por lo tanto solo lo coje cuando tocas el centro, o si lo marcas, entra dentro haber que mascara le tienes puesta, porque puede ser redonda, cuadrada, precisa, etccc.
Título: Re:abarcar todo el sprite
Publicado por: zorge en Febrero 02, 2015, 01:50:38 PM
nada he probado con todas las mascaras con todas las opciones y nada XD
Título: Re:abarcar todo el sprite
Publicado por: arcangelcaos en Febrero 02, 2015, 01:52:32 PM
Que evento tienes para coger la pelota?? pon el código y donde lo usas, please
Título: Re:abarcar todo el sprite
Publicado por: penumbra en Febrero 02, 2015, 09:42:28 PM
es cuestión de definir una máscara más grande que el sprite y usar el evento MOUSE LEFT del objeto pelota
Título: Re:abarcar todo el sprite
Publicado por: zorge en Febrero 03, 2015, 02:22:39 AM
penumbra pero eso no haria que cambiase la forma actual de colision que tengo??con el suelo con otros objetos etc???
Título: Re:abarcar todo el sprite
Publicado por: penumbra en Febrero 03, 2015, 02:38:42 AM
Cita de: zorge en Febrero 03, 2015, 02:22:39 AM
penumbra pero eso no haria que cambiase la forma actual de colision que tengo??con el suelo con otros objetos etc???
Tienes razón. No sé por qué pensé que el objeto que arrastras no tenía interacción con otros objetos. Lo que sucede es que los eventos MOUSE LEFT/RIGH o MOUSE LEFT/RIGHT PRESSED sólo responden si haces click dentro del sprite. Si haces clcik un pixel fuera de los límites del sprite (o de su máscara), los eventos nunca se lanzan y no pasa nada.

Una solución es usar la función collision_circle() en la posición del puntero del raton. Si collision circle detecta colisión con la pelota, ésta se arrastra. La función permite ajustar el radio de colisión, por lo que es posible arrastrar la pelota aun si se hace click fuera del sprite de la pelota.

Otra solución es preguntar a qué distancia está el puntero del ratón del objeto pelota, y si está dentro de una distancia dada, al hacer click, que se pueda arrastrar la pelota. De esta manera no importaría el sprite/máscara del objeto, sólo la distancia que hay del puntero a la paelota
Título: Re:abarcar todo el sprite
Publicado por: zorge en Febrero 03, 2015, 02:55:44 AM
muchas gracias voy a probar con el collision circle a ver que tal se me da XD luego os cuento
Título: Re:abarcar todo el sprite
Publicado por: penumbra en Febrero 03, 2015, 03:03:54 AM
Bien, pero usa eventos mouse global, porque si no puede pasar lo mismo, que no se lance el evento si no se está dentro del sprite.
Título: Re:abarcar todo el sprite
Publicado por: zorge en Febrero 03, 2015, 03:12:07 AM
penumbra y como lo tendria que poner en el evento global left?porque lo he puesto ahi y no pasa nada sigue igual
Título: Re:abarcar todo el sprite
Publicado por: penumbra en Febrero 03, 2015, 07:00:51 AM
indica qué código estás usando.
Título: Re:abarcar todo el sprite
Publicado por: zorge en Febrero 03, 2015, 11:18:04 PM
es que tengo un pifostio de código que flipas  XD soy bastante malo programando pero bueno lo muestro y así me decís los 743 mil fallos que pueda tener jajaja que verguenza,se que tendré mil cosas mal porque voy tomando ayuda de uno de otro y mezclando eso unido a mi falta de experiencia pues hace el código que mostrare ahora.
          evento create :

agarre = false
tiempo = 0   // variable para conteo de tiempo
boom = 10    // variable para cuenta atras antes de explosion
image_speed = 0.7


linea = view_wview[0]/2;
if (x < linea){
image_xscale = -1 ;
hspeed = -4
}else {
image_xscale = 1
hspeed = 4
}
evento step
tiempo ++ // inicial el tiempo
if place_free(x,y+1){           // si no hay nada debajo nuestra en un pixel la gravedad es 1.2
gravity = 1.2
image_speed = 0
}else {gravity = 0}          // si hay algo la gravedad es 0

gravity_direction = 270        // direccion de la gravedad es de 270

if vspeed >= 18 {vspeed = 18} // si la velocidad de caida es igual o mayor a 18 se queda en 18
if tiempo = 30 {            // si pasa un segundo se resta uno de la cuenta atras de la bomba
        boom --                 // y se reinicia el tiempo
        tiempo = 0
        }
       
if boom <= 0 {instance_destroy()}   // si la cuenta atras llega a cer se destruye
  if agarre = true {
  x = mouse_x
  y = mouse_y
  }
 
  ///Motor

d = point_distance(x,y,mouse_x,mouse_y);

//Agarrar
if( mouse_check_button_pressed(mb_left) and d <= 16 )
{
    agarre = true;
    gravity = 0;
    //speed = 0;
    //xr = mouse_x - x;
    //yr = mouse_y - y;
    mouse_xprevious = mouse_x;
    mouse_yprevious = mouse_y;
}

//Arrastrar
if( agarre )
{
    hspeed = mouse_x - mouse_xprevious;
    vspeed = mouse_y - mouse_yprevious;
    //x = mouse_x - xr;
    //y = mouse_y - yr;
    //direction = point_direction( xprevious,yprevious, x,y );
}

///Lanzar
if( agarre and (mouse_check_button_released(mb_left) or d > 16) )
{
    agarre = false;
    gravity = 0.2;
    //speed = point_distance( xprevious,yprevious, x,y );
}

//Previo
mouse_xprevious = mouse_x;
mouse_yprevious = mouse_y;
evento left pressed
arrastre = true
evento left release
arrastre = false
Título: Re:abarcar todo el sprite
Publicado por: zorge en Febrero 04, 2015, 04:42:28 AM
creo que ahí esta todo lo necesario no??he de decir que clamud me ayudo en este codigo :)
Título: Re:abarcar todo el sprite
Publicado por: penumbra en Febrero 04, 2015, 06:48:46 AM
Parece que sí, pero no veo que estés usando collision_circle en ningún lado.

¿Has probado a modificar esto?
[gml]if( mouse_check_button_pressed(mb_left) and d <= 16 )[/gml]

Por ejemplo, en lugar de 16, poner 50 (o un valor mayor). A mi me parece que con eso ya podrías arrastrar el objeto aunque no pinches exactamente dentro de su sprite.
Título: Re:abarcar todo el sprite
Publicado por: zorge en Febrero 04, 2015, 08:00:43 AM
si tambien lo probe y nada :( creo que llegue a poner hasta 100...........lo que hace es que cuando picho fuera del sprite se para pero no me deja ni cogerlo ni arrastrarlo a no ser que pinche en el centro
Título: Re:abarcar todo el sprite
Publicado por: penumbra en Febrero 04, 2015, 08:19:30 AM
¿No puedes colocar el proyecto para verlo más a fondo? aunque sea una versión con sprites simples/alternativos
Título: Re:abarcar todo el sprite
Publicado por: zorge en Febrero 04, 2015, 04:16:23 PM
hola penumbra aqui te dejo un archivo del proyecto si quieres el original para revisarlo mejor o verlo dimelo ok aqui se ve el fallo que digo no es posible agarrarlo bien solo si lo coges desde el medio si lo coges desde otro lado se para gracias de antemano a todos los que me intentais ayudar se agradece mucho.
Título: Re:abarcar todo el sprite
Publicado por: penumbra en Febrero 04, 2015, 09:47:09 PM
Este es el causante del error

[gml]///Lanzar
if( agarre and (mouse_check_button_released(mb_left) or d > 16) )[/gml]
Esta condición no está bien formulada, hace que en cada paso (incluso en el paso donde se acaba de presionar el botón del mouse), si la distancia es mayor a 16, se suelte la bomba, por eso no es posible arrastrarla si el puntero está a más de 16 pixeles del origen. Puedes borrar la última parte de la condición o o cambiar de 16 a un número mayor.
Título: Re:abarcar todo el sprite
Publicado por: zorge en Febrero 04, 2015, 10:28:45 PM
muchisimas gracias penumbra efectivamente era eso aunque desgraciadamente sigue teniendo comportamientos raros como cuando lo cojo y presiono contra el suelo desaparece el obj de golpe y bueno cuando lo probe en android  no suelta bien no se porque :( igualmente muchisimas gracias por tu ayuda eres todo un maestro