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
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]