Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Alemar5 en Octubre 10, 2020, 09:21:34 PM

Título: Obtener de coordenadas de posición (Abierto a mas respuestas)
Publicado por: Alemar5 en Octubre 10, 2020, 09:21:34 PM
Hola amigos, qué tal todo? :D

Hoy vengo con una pregunta nueva, hace tiempo encontré un código para crear un textbox al acercarte a un personaje y presionar la tecla X, esto es posible gracias a un círculo de colisión con los objetos npc, el cual en ocasiones puede no ser tan preciso, me gustaria mejorar ese codigo para tener mas precision y lo mas importante, que el sprite del personaje npc cambie dependiendo de la posición que se le esté hablando, les dejare una imagen y los códigos para que puedan comprender mejor.

Código de la colisión antigua, (es la variable bloque):

[gml]///Mama

var  bloque;
bloque = collision_circle(x,y,5,obj_mama,false,false);

if (keyboard_check_pressed(ord("X")) and bloque){
    var msg;
    msg = instance_create(0,0,obj_textbox);
    msg.referencia = bloque;
    stop = true;
   
}[/gml]

Evento create de la mama:

[gml]msg[0] = "Mamá: Hola cariño.";
msg[1] = "Mamá: Vine aqui para comprar#algunas cosas para el almuerzo.";
msg[2] = "Mamá: Pero bien parece que no#hay nadie.";
msg[3] = "Mamá: Supongo que todos estan#en sus hogares descansando#despues de las fiestas.";
msg[4] = "Mamá: ¿Ya desayunaste?.";
msg[5] = "Mamá: Porfavor perdoname por no#haberte dejado el desayuno.";
msg[6] = "Mamá: Estaba muy apresurada.";
msg[7] = "Mamá: Vamos a casa, te pedire#una pizza.";

final = 7;


global.mensaje = 0;

image_speed = 0.1;

depth = -y;[/gml]

Una imagen de ejemplo para mayor comprensión (adjunto):

Les agradeceria mucho su ayuda amigos y gracias por todo :3
Título: Re:Mejorar codigo de colision a partir de coordenadas de posicion
Publicado por: T789 en Octubre 10, 2020, 10:30:43 PM
Saludos Alemar5

Tengo 2 soluciones para ti
La primera: para que la colision sea mas precisa, debes cambiar el penultimo argumento a true de la funcion "collision_circle" (asi se verificara una colision mas precisa en el circulo, y de paso, para no tener problemas, sugiero que tengas marcada la casilla de precise en la máscara de colisión del sprite en comun)

La segunda: sugiero que le añadas una variable al obj_mama y que contenga el id del player, algo asi como: "bloque.hijo = id" y todo eso en el primer codigo
[gml]
/// Event Step obj_mama
if instance_exists(obj_textbox) {
   if place_meeting(x-48, y, hijo)
      hijo.sprite_index = //Sprite mirando a la derecha
   if place_meeting(x+48, y, hijo)
      hijo.sprite_index = //Sprite mirando a la izquierda
   if place_meeting(x, y-48, hijo)
      hijo.sprite_index = //Sprite mirando abajo
   if place_meeting(x, y+48, hijo)
      hijo.sprite_index = //Sprite mirando abajo
}
[/gml]
Y eso solo pasaria si ya fue creada una instancia de obj_textbox. Espero te funcione, la verdad es que todo me lo acabo de pensar
Título: Re:Mejorar codigo de colision a partir de coordenadas de posicion
Publicado por: Alemar5 en Octubre 11, 2020, 12:35:02 AM
Listo amigo, ya complete el código que me diste en el evento step de la madre, sin embargo continúa sin cambiar de sprite, que puedo hacer y cómo podría colocar la variable de "bloque.hijo = id"?

[gml]if instance_exists(obj_textbox) {
   if place_meeting(x-48, y, obj_prota)
      obj_prota.sprite_index = spr_mama_derecha
   if place_meeting(x+48, y, obj_prota)
      obj_prota.sprite_index = spr_mama_izquierda
   if place_meeting(x, y-48, obj_prota)
      obj_prota.sprite_index = spr_mama_arriba
   if place_meeting(x, y+48, obj_prota)
      obj_prota.sprite_index = spr_mama_abajo
}[/gml]
Título: Re:Mejorar codigo de colision a partir de coordenadas de posicion (En proceso)
Publicado por: T789 en Octubre 11, 2020, 01:20:38 AM
Espera un momento... ¿El sprite que querias cambiar era el de la madre? Si es asi entonces quita el "obj_prota." de todos los sprite_index, ya que solo va cambiar su propio sprite

Si ese es todo el caso, entonces no hace falta usar el "bloque.hijo = id". Lo otro que iba decir es que el "48" en los place_meeting() eran solo de prueba, asi que puedes especificar mejor los pixeles (podrias intentar con el tamaño sumado del radio que seria: 10, pero mejor prueba vos)
Título: Re:Mejorar codigo de colision a partir de coordenadas de posicion (En proceso)
Publicado por: Alemar5 en Octubre 11, 2020, 02:57:51 AM
Hola amigo, de nuevo yo  :-[
ya trate de cambiar el codigo, sin embargo sigue sin afectar el sprite de la madre, ya probe cambiando las cordenadas x, y pero sigue sin resultar, inclusive trate de tomar como referencia el obj_mama.x y obj_mama.y no se que podria hacer :c

[gml]if instance_exists(obj_textbox) {
   if place_meeting(x-5, y, obj_prota)
      sprite_index = spr_mama_derecha
   if place_meeting(x+5, y, obj_prota)
      sprite_index = spr_mama_izquierda
   if place_meeting(x, y-5, obj_prota)
      obj_prota.sprite_index = spr_mama_arriba
   if place_meeting(x, y+5, obj_prota)
      obj_prota.sprite_index = spr_mama_abajo
}[/gml]

tambien intente cambiando la mascara de colision, coloque preciso y donde dice obj_prota tambien probe colocando obj_mama. ayuda :(
Título: Re:Mejorar codigo de colision a partir de coordenadas de posicion (En proceso)
Publicado por: T789 en Octubre 11, 2020, 03:05:08 AM
Olvidaste quitar 2 "obj_prota."; olvidando eso, ya que no se me ocurre que podria estar dando problema, intenta pasar todo ese codigo al evento draw, y en vez de usar sprite_index usas draw_sprite(). En lo general ya que no imagino porque da problema con el sprite_index, la alternativa es dibujarlo desde ese evento  :)

Otra cosa en la que estoy pensando, es que si no quiere cambiar el sprite con ese codigo entonces revisa a ver si no estas cambiando el sprite_index en otra parte del obj_mama (la mayoria de las veces no se puede cambiar sprite en un lado porque en otro ya se esta manejando).
Título: Re:Mejorar codigo de colision a partir de coordenadas de posicion (En proceso)
Publicado por: Alemar5 en Octubre 11, 2020, 04:27:15 AM
Ya probe de todo y corregi las cosas, incluso probe con un objeto de prueba que ocupa toda la room para ver si así hallaba la posición y ni aun así cambió su sprite, verifique los eventos del objeto y no hay ningún conflicto de sprite_index, tambien probe con los eventos de draw y nada, no me funciono muy bien este método, sin embargo enserio te agradezco por tu tiempo y por tratar de ayudarme.
Título: Re:Obtener de coordenadas de posición (Abierto a mas respuestas)
Publicado por: T789 en Octubre 11, 2020, 04:44:38 AM
Bueno se me acabaron las sugerencias. Si ninguna parte esta en conflicto, probare cambiando el metodo a otro mas dinamico. Cambia todo el codigo anterior a este:
[gml]
/// Event Step
if instance_exists(obj_textbox) {
  var dirObj;
  dirObj = point_direction(x, y, obj_prota.x, obj_prota.y);

  if (dirObj >= 45 && dirObj <= 135)
     sprite_index = spr_mama_arriba;
  if (dirObj >= 135 && dirObj <= 225)
     sprite_index = spr_mama_izquierda;
  if (dirObj >= 225 && dirObj <= 315)
     sprite_index = spr_mama_abajo;
  if (dirObj >= 315 && dirObj <= 45)
     sprite_index = spr_mama_derecha;
}
[/gml]
Título: Re:Obtener de coordenadas de posición (Abierto a mas respuestas)
Publicado por: Alemar5 en Octubre 11, 2020, 07:59:29 PM
No me funciona amigo... :'( :'( :'(
Título: Re:Obtener de coordenadas de posición (Abierto a mas respuestas)
Publicado por: T789 en Octubre 11, 2020, 08:04:04 PM
 :'(  :'(  :'(  :'(  :'(  :'(
Bueno se me acabaron las ideas y sugerencias, asi que pasa todos los codigo de todos los eventos de tu obj_mama. Absolutamente habra que revisar todo. Espero eso funcione...  :-\
Título: Re:Obtener de coordenadas de posición (Abierto a mas respuestas)
Publicado por: 3dgeminis en Octubre 12, 2020, 09:23:34 PM
En  lugar de ver de que lado esta colisionando podrias ver en que direccion esta viendo al otro objeto.
[gml]
///CREATE
direccion=0

///STEP
direccion=round(point_direction(x,y,hijo.x,hijo.y)/90) ///esto junto conla colision
[/gml]

direccion te va a dar 5 valores 0-1-2-3-4
0 y 4 quiere decir que esta a la derecha, 1 arriba, 2 izquierda, y 3 abajo

Para cambiar de sprite solo usas switch
[gml]
switch(direccion)
{
  case 0: sprite_index=sprite_derecha break;
  case 1
  case 2 .............................
}
[/gml]