Noticias

¡Ayuda a la Comunidad GM, haz una donación!

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: Obtener de coordenadas de posición (Abierto a mas respuestas)  (Leído 620 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Alemar5

  • Habitual
  • *
  • Puntos: 42
  • Mensajes: 19
  • Sexo: Masculino
    • Ver Perfil
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):

///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;
   
}

Evento create de la mama:

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;


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

Les agradeceria mucho su ayuda amigos y gracias por todo :3
« última modificación: Octubre 11, 2020, 04:29:04 am por Alemar5 »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado T789

Respuesta #1 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
/// 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
}
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

 
Los siguientes usuarios dieron las gracias a este tema: Alemar5


Desconectado Alemar5

  • Habitual
  • *
  • Puntos: 42
  • Mensajes: 19
  • Sexo: Masculino
    • Ver Perfil
Respuesta #2 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"?

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
}

 


Desconectado T789

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)
« última modificación: Octubre 11, 2020, 01:24:55 am por T789 »

 
Los siguientes usuarios dieron las gracias a este tema: Alemar5


Desconectado Alemar5

  • Habitual
  • *
  • Puntos: 42
  • Mensajes: 19
  • Sexo: Masculino
    • Ver Perfil
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

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
}

tambien intente cambiando la mascara de colision, coloque preciso y donde dice obj_prota tambien probe colocando obj_mama. ayuda :(

 


Desconectado T789

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).
« última modificación: Octubre 11, 2020, 03:08:21 am por T789 »

 
Los siguientes usuarios dieron las gracias a este tema: Alemar5


Desconectado Alemar5

  • Habitual
  • *
  • Puntos: 42
  • Mensajes: 19
  • Sexo: Masculino
    • Ver Perfil
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.

 


Desconectado T789

Respuesta #7 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:
/// 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;
}
« última modificación: Octubre 11, 2020, 04:56:09 am por T789 »

 
Los siguientes usuarios dieron las gracias a este tema: Alemar5


Desconectado Alemar5

  • Habitual
  • *
  • Puntos: 42
  • Mensajes: 19
  • Sexo: Masculino
    • Ver Perfil
Respuesta #8 en: Octubre 11, 2020, 07:59:29 pm
No me funciona amigo... :'( :'( :'(

 


Desconectado T789

Respuesta #9 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...  :-\

 
Los siguientes usuarios dieron las gracias a este tema: Alemar5


Desconectado 3dgeminis

Respuesta #10 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.
///CREATE
direccion=0

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

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
switch(direccion)
 {
  case 0: sprite_index=sprite_derecha break;
  case 1
  case 2 .............................
 }

 
Los siguientes usuarios dieron las gracias a este tema: Alemar5