Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: bygdle en Enero 31, 2016, 02:23:50 AM

Título: Mi sistema de teletransporte no sirve xD
Publicado por: bygdle en Enero 31, 2016, 02:23:50 AM
Guenas, comencé un bonito proshectico muy sensual (este sí lo termino porque lo termino XD ), y he progresado muy bien. El juego está casi, CASI, ¡¡¡CASI!!! listo (en el sentido del motor, no los niveles y eso xD).
Le intenté implantar un sistema de "teletransporte". Que la idea original fuera que funcionara así:

Se tienen varias instancias de "oTeleport" (el objeto de teletransporte xD).
Todas las instancias tienen un ID de teletransporte, y hay parejas de estos, es decir que cada dos instancias tienen el mismo ID para teletransportarse de una a la otra.
Al colisionar con una, se busca a otra instancia con su misma ID de teletransporte, y si la encuentra, teletransportar al player

Ahora los códigos:
En el create del oTeleport tengo esto:
[gml]
teleid = 0;
teled = true;
[/gml]

Y en el evento collision con el oTeleport del player tengo esto:
[gml]
var g = other.teleid;
var d = ds_list_create();
var xX, yY, j, m;
var otherid = other.id;
with oTeleport
{
    if id != otherid
     {
        ds_list_add(d,id);
     }
}

for(i=0;i<ds_list_size(d);i++)
{
    m = d[| i];
    if m.teleid == g and m.id != otherid
     {
        xX = m.x;
        yY = m.y;
        j = m;
        break;
     }
}
ds_list_destroy(d);

if instance_exists(j) and j.teled == true
{
    x = xX;
    y = yY;
    j.teled = false;
}
[/gml]
La variable "teleid" dice a cuál objeto teletransportar el player. Yo configuro estos valores en el Creation Code de cada instancia, aunque por defecto el valor es 0. Tengo dos instancias separadas entre sí, y ambas tienen "teleid" en 1

Más o menos explicado el código hace esto:
Citar
-->se sacan los valores "id" y "teleid" del objeto que colisionó con el player
-->Se crea una lista para almacenar todas las "id" de las instancias de oTeleport
-->Se revisan cada instancia de oTeleport, y si el "id" de la instancia que se está revisando actualmente no es el mismo de la instancia que colisionó con el player, éste se agrega a la lista
--> Se examina cada elemento que quedó guardado en la lista
-->Si el elemento tiene el mismo valor en "teleid", guardar en xX & yY la posición del elemento, y guardar la id del mismo en la variable "j".
-->Si la instancia con la id "j" existe, y éste no ha sido activado (variable "teled"), teletransportar al player hacia esta instancia y desactivar a la que colisionó con él primero.

Pero sencillamente me deja el player en donde está. Pero veo que lo mueve un poquito, como si se tomara a sí mismo como "j", pero eso lo veo imposible porque ni siquiera se agregó a la lista.
Decidí poner un show_message después de las acciones importantes, puse los mensajes así:

[gml]
var g = other.teleid;
show_message(string(g));
var d = ds_list_create();
var xX, yY, j, m;
var otherid = other.id;
show_message(string(otherid));
with oTeleport
{
    show_message(string(id));
    if id != otherid
     {
        ds_list_add(d,id);
        show_message(string(id) + " agregado a la lista");
     }
    else
        show_message(string(id) + " no agregado a la lista");
}

for(i=0;i<ds_list_size(d);i++)
{
    m = d[| i];
    show_message("Instancia numero "+string(i+1)+" probando#id: "+string(m.id)+"#teleid: "+string(m.teleid));
    if m.teleid == g and m.id != otherid
     {
        xX = m.x;
        yY = m.y;
        j = m;
        show_message("Se ha encontrado:#id: "+string(m.id)+"#x: "+string(xX) + "#y: " + string(yY));
        break;
     }
}
ds_list_destroy(d);

if instance_exists(j) and j.teled == true
{
    x = xX;
    y = yY;
    j.teled = false;
}
[/gml]

Y el resultado fue este:

Citar
1

-----------------
110117

-----------------
110117

-----------------
110117 no agregado a la lista

-----------------
110118

-----------------
110118 agregado a la lista

-----------------
Instancia numero 1 probando
id: 110118
teleid: 1

-----------------
Se ha encontrado:
id: 110118
x: 432
y: 432

Efectivamente, los datos que me arrojan los mensajes coinciden con la instancia a la que deseo que el player se teletransporte, pero sencillamente NO lo hace.

¿Alguien logra descubrir cuál es el error?
Muchas gracias de antecabeza :B
Título: Re:Mi sistema de teletransporte no sirve xD
Publicado por: Clamud en Enero 31, 2016, 05:14:44 PM
En este caso la ds_list sobra, porque se puede sacar el portal de destino dentro del with. Yo lo implementé de esta forma:
[gml]
///Teleportar
//Ev. Colision con obPortal

if( not teled ) //se puede tele teleportar
if( point_distance( x,y, other.x,other.y ) < 16 ) //cerca del centro
{
    var color = other.image_blend; //caracteristicas
    var salida = other.id;         // del portal actual
    var destino = noone; //no sabemos si existe portal de destino
    with( obPortal ) //revisar todos los portales
    {
        if( id <> salida //si es diferente a la salida
        and image_blend == color ) //y tiene el mismo color
        {
            destino = id; //es un destino valido
            break; //dejamos de revisar
        }
    }
    if( destino <> noone ) //si el portal destino existe
    {
        x = destino.x; //ir a su posicion
        y = destino.y;
        teled = true; //evitar un doble teleporte
    }
}
[/gml]
[gml]
//Ev. Step
if( not place_meeting( x,y, obPortal ) )
teled = false;
[/gml]