Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

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: Mi sistema de teletransporte no sirve xD  (Leído 216 veces)

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

Desconectado NiuWeb

  • Flota de Justicia Particular.
  • Moderadores globales
  • Okupa
  • *
  • Puntos: 2825
  • Mensajes: 1.697
  • Agradecido: 141 veces
  • Sexo: Masculino
  • Rock anthem for saving the world.
    • Ver Perfil
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:
teleid = 0;
teled = true;

Y en el evento collision con el oTeleport del player tengo esto:
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;
 }
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í:

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

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
« última modificación: Enero 31, 2016, 02:30:32 am por NiuWeb »

El tiempo era tu aliado, humano, pero te ha abandonado.
Los Forerunners han regresado, esta tumba ahora es tuya.

-Ur-Didacta.


BA:STFW&RTFM
 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado Clamud

Respuesta #1 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:
///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
    }
}
//Ev. Step
if( not place_meeting( x,y, obPortal ) )
teled = false;