Febrero 12, 2016, 11:43:38 PM Ultima modificación: Febrero 21, 2016, 10:36:20 PM por TheSquirrel
Amigos, tengo un nuevo conflico con un codigo.

Tengo un objeto que es mi jugador que ataca con su espada (obj_player), creé un objeto de espada (obj_hitbox_sword), que crea un rectangulo sobre obj_player que hace que la espada golpee a los enemigos. El problema es que tengo un objeto que cuando obj_player colisiona con él, obj_player se destruye, sin embargo, esto genera conflico con obj_hitbox_sword debido a que la creacion de este objeto es segun las coordenadas de obj_player. Esto quiere decir que cuando obj_player se destruye, obj_hitbox_sword no tiene coordenadas en la room. El cual no puedo solucionar.

[spoiler]
obj_hitbox_sword.x = floor(obj_player.x);
obj_hitbox_sword.y = floor(obj_player.y);
obj_hitbox_sword.image_xscale = obj_player.facing;
Esta es la parte en conflicto

if (obj_player.attacking && obj_player.image_index >= 2 && obj_player.image_index < 5)
{
    if (!obj_player.crouching) obj_hitbox_sword.sprite_index = spr_hitbox_sword_stab;
    else obj_hitbox_sword.sprite_index = spr_hitbox_sword_stab_crouch;

    if (place_meeting(x, y, obj_enemy_parent))
    {
        with (obj_enemy_parent)
        {
            if (place_meeting(x, y, obj_hitbox_sword) && !hurt)
            {
                hurt = 1;
                alarm[0] = 20;
            }
        }
    }
    if (obj_player.image_index == 2) sound_play(snd_sword);
}
else if (obj_player.air_stab && !obj_player.attacking && !obj_player.hurt)
{
    //For any collisions that would take place here, check the script.
    if (obj_player.air_stab_dir == 1) obj_hitbox_sword.sprite_index = spr_hitbox_sword_stab_down;
    else obj_hitbox_sword.sprite_index = spr_hitbox_sword_stab_up;
}
else obj_hitbox_sword.sprite_index = -1;[/spoiler]

Puse todo el codigo, pero la parte en negrita es la que genera conflico.
¿Como puedo hacer que cuando obj_player se destruya, obj_hitbox_sword no tenga conflicto con las coordenadas?

Podes solucionarlo con algo como esto:

[gml]
if (instance_exists(obj_player)) {
    obj_hitbox_sword.x = floor(obj_player.x);
    obj_hitbox_sword.y = floor(obj_player.y);
    obj_hitbox_sword.image_xscale = obj_player.facing;
}
[/gml]

Lo que hacés ahí es comprobar si la instancia del jugador existe, si existe se van a tomar las coordenadas, de lo contrario no va a hacer nada.

Otra solución es destruir obj_hitbox_sword al mismo tiempo que obj_player.

Dejo un código fácil que podes implementar para destruir el objeto obj_hitbox_sword:

[gml]
if (instance_exists(obj_player)) {
    obj_hitbox_sword.x = floor(obj_player.x);
    obj_hitbox_sword.y = floor(obj_player.y);
    obj_hitbox_sword.image_xscale = obj_player.facing;
} else {
   with (obj_hitbox_sword) { instance_destroy(); }
}
[/gml]

En pocas palabras si no existe el objeto player se destruye a la vez el objeto obj_hitbox_sword.

#4 Febrero 13, 2016, 12:55:15 AM Ultima modificación: Febrero 14, 2016, 06:54:34 AM por ardilla321
Cita de: Clamud en Febrero 13, 2016, 12:19:46 AM
Otra solución es destruir obj_hitbox_sword al mismo tiempo que obj_player.

Cita de: Iros en Febrero 13, 2016, 12:23:24 AM
Dejo un código fácil que podes implementar para destruir el objeto obj_hitbox_sword:

[gml]
if (instance_exists(obj_player)) {
    obj_hitbox_sword.x = floor(obj_player.x);
    obj_hitbox_sword.y = floor(obj_player.y);
    obj_hitbox_sword.image_xscale = obj_player.facing;
} else {
   with (obj_hitbox_sword) { instance_destroy(); }
}
[/gml]

En pocas palabras si no existe el objeto player se destruye a la vez el objeto obj_hitbox_sword.

Intente ambas opciones y lamentablemente, ninguna a funcionado.
Me sigue saliendo el mismo error, que me dice que la coordenada de obj_player.x no se encuentra.

La historia larga del problema, es que tengo un objeto que es como una puerta que hace una transicion de room con una efecto de fade y de animacion en el personaje, el problema es que ese objeto de transición debe ser persistente, lo que no me permite crear un nivel con varios de este objeto de transicion debido a que las coordenadas deben estar previamente definidas. Probe con poner variables que cambiaran con un codigo en la room del obj_transition, sin embargo, no funciona correctamente debido a que genera conflicto entre codigos. Si el obj_transition deja de ser persistente, el cambio de habitacion no funciona como deberia. He estado mucho tiempo tratando de arreglar el problema pero no he podido lograrlo.
Sé que suena bastante complicado, y si no les molesta, le dejo dos archivos .gmk, uno en donde el la transicion funciona correctamente, y otro donde cuando el obj_transition deja de funcionar por cambiar su persistencia. Esto servira para que entiende el problema que he tenido durante mucho tiempo y que me ha costado explicar.

El objetivo final es tener la misma transicion (que cuando abran y ejecuten el archivo .gmk entenderan lo que dire ahora) con fade in; fade on; que el personaje camine solo un rato hasta que salga,  que en la nueva room camine un rato para que vuelva ha ser controlado pero que puedan ser varios obj_transition en un mismo nivel. basicamente este es el room_goto.

Todo sera más claro cuando vean el archivo. Perdon aburrirlos, pero no he podido dar con la solucion.

Edit:
Disculpen si desvie la pregunta inicial, lo que sucede es que lo que estaba trantando de hacer era solucionar por otro medio el problema de transicion creando un nuevo objeto, que cuando obj_player colisionara con este nuevo objeto (por ejemplo: obj_roomchange), obj_player se destruyera y creara un nuevo objeto del jugador, que tiene la animacion de que camina "solo"(por ejemplo: obj_playerwalk) y que este, al chocar con un nuevo objeto, provocara el fade in; fade on; y cambiara la habitacion. En esta nueva habitacion obj_playerwalk apareceria en determinadas coordenadas (como lo hace obj_transition) para luego, con una alarma destruirse y creara obj_player de nuevo. El problema es que muchos objetos son persistentes, por eso se comprometen entre si y ha la hora de destruirse, genera conflicto. Finalmente, la pregunta de este tema era para dar pie a esta posible solución.

Mirá, lo que yo veo es que tenes serios problemas de performance para empezar, no es bueno tener varios objetos persistentes, te recomiendo tener uno solo que sea objControl donde definis todas las variables que ocupés.

Otra cosa que noto es que el código está comentado en ingles, si sacaste piezas de código de un ejemplo entonces estás un poco mal, tratá de hacerlo desde cero usando la lógica.

Si, efectivamente tengo un serio problema con objetos persistentes que están afectando el juego. Sin embargo, si bien y partes de código que fueron tomados de terceros, hay partes que las he diseñado yo. El problema es que "la base" trajo consigo la persistencia, y como no soy tan Pulido en temas de GML, me topé con algo que no conocía.

He intentado crear un obj_control que permita lo que tú dices, que establezca las variables que necesito. He avanzado un poco al respecto, pero el "capricho" por mantener ese efecto de transición es la que no he podido solucionar

Muchas gracias Iros por responder, y por el consejo también.

if !instance_exist(obj_player) //si player no existe
{obj_hitbox_sword.image_xscale =0} //el 0 lo puse por poner algo




es completamente imposible que no te funque si encierras TODO lo que manipule obj_player dentro de un if instance_exists(obj_player)


pásanos todo tu código pk no tiene sentido que eso no te funcione, o que se destruya como dice clamud..
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

Olvide poner este tema como solucionado, lo lamento.

Para quien lo lea, efectivamente la solucion es la que dio Iros y Clamud.

¡Gracias a todos!  :D