Buenas, GM Studio me trae de cabeza...
pregunta: cuando asigno un objeto a una variable... aquello que se guarda en esa variable qué es? el id? el objeto?
Luego, si quiero comparar esa variable con un objeto qué debo hacer...
if (variable == objPersonaje)
o
if (variable.id == objPersonaje)
sonará extraño, pero por ahora me funcionaba el primer caso, y en cierto punto del programa sólo me funciona el segundo... qué pasa aquí?!
toda mi vida he hecho lo primero bien, y hasta ahora sí, pero veo que la mitad de mi juego funciona con lo primero y la otra mitad ignora el programa si no especifico variable.id... COMPROBADO!
extra: hay alguna diferencia si el objeto que asigno a la variable es una instancia obtenida mediante instance_nearest o instance_create, o si le asigno un nombre genérico de objeto (objPersonaje)? A veces me guarda el id, otras me guarda el número de objeto (0 si es el primero en crearse, etc) y me estoy haciendo un lío. En el ejemplo que os puse, intentaba comparar:
variable == ENEM
donde ENEM era instance_nearest(x, y, objEnemigo)
en este caso no daba correcto, porque variable era 10, y ENEM era 100000. Solución? variable.id == ENEM... pero hasta ahora he usado variable == ENEM todo el rato y funcionaba bien!
No soy ningún experto en la materia, pero intentaré ayudar un poco.
Para asignar el ID de una instancia a una variable, se hace en el momento de la creación de este modo: personaje=instance_create(x,y,obj_personaje). De esta manera asignas el ID de la instancia que creas a la variable personaje.
Luego, cada instancia, tiene su ID propia, llamada "id". Si por ejemplo en cada instancia de un objeto, en el evento Draw, pones un draw_self() y un draw_text(x,y-30,id), te escribirá el ID de cada instancia.
Ten en cuenta que hay un sólo objeto objEnemigo, pero puede haber muchas instancias de él, con sus ID cada una.
Si quieres comparar una variable de todos los enemigos, podrías hacer lo siguiente, llamándolo desde el objeto personaje:
with (objEnemigo)
{
if other.target=id
{
blablabla
}
}
En ese código ejecutado por ejemplo desde el step del personaje, le estas diciendo que si la variable target del objpersonaje es igual al id de un enemigo, haga lo que sea. Con with recorre todas las instancias de un objeto que estén en ejecución, y hace lo que sea. Con other, te refieres al objeto que llamó a ese código, en este caso, objpersonaje.
Espero que te resuelva alguna duda :)
Me voy a dormir!
Cita de: DarkKRuleR en Junio 13, 2014, 01:11:59 AM
pregunta: cuando asigno un objeto a una variable... aquello que se guarda en esa variable qué es? el id? el objeto?
Andas un poco enredado. En el sentido estricto, los objetos no se asignan a las variables, lo que se guarda en la variables puede ser o el índice del objeto (poco usado) o el identificador de instancia id (más usado y más útil generalmente). Funciones como instance_create e instance_nearest lo que devuelven es el id de la instancia
Cita de: DarkKRuleR en Junio 13, 2014, 01:11:59 AM
Luego, si quiero comparar esa variable con un objeto qué debo hacer...
Una variable no se puede comparar con un objeto, son cosas distintas, como comparar una cadena con un número real o peras con manzanas. Lo que se compara es el id(almacenado en la variable) de una instancia contra el id de otra instancia
Si
variable contiene una id de instancia, entonces tanto
if (variable == objPersonaje) como
if (variable.id == objPersonaje)no son sentencias del todo correctas. Una instancia no es lo mismo que su objeto, las instancias tienen ids y los objetos tienen índices de objeto, y ambos son cosas distintas. El segundo caso,
variable.id creo que es lo mismo que
variable (ambas cosas apuntan al mismo id), pero objPersonaje no es una instancia.
Creo que al final quieres comparar instancias, pero algunos conceptos los tienes mezclados. ¿Qué quieres hacer en tu juego?
Y hablando de IDs.
Entonces si en pantalla tengo múltiples instancias de un objeto, por ejemplo, obj_enemy. ¿En un momento dado cómo sé cual de todos es por ejemplo el que ha colisionado con mi personaje?
Esto se me viene a la cabeza porque tenía en mente un juego en el que aparecerían instancias de objetos de forma aleatoria (cada x segundos) y cada instancia estaría en pantalla x segundos nada más para luego desaparecer. Supongo que para llevar este control individual de tiempo de cada instancia tendría que tenerlas controladas en un array o similar, no?
¿Sabéis si hay algún ejemplo similar de esto en el apartado de descargas para ver código?
Muchas gracias y disculpar el offtopic.
Cita de: empardopo en Junio 13, 2014, 07:51:17 AM
Y hablando de IDs.
Entonces si en pantalla tengo múltiples instancias de un objeto, por ejemplo, obj_enemy. ¿En un momento dado cómo sé cual de todos es por ejemplo el que ha colisionado con mi personaje?
precísamente, por eso es muy útil el ID de la instancia y la palabra clave other. Un método podría ser, en el objeto jugador, poner un evento de colisión contra obj_enemy, y en ese evento
enemigo = other.idEn este caso, other es la otra instancia (estamos dentro de obj_player), es decir, la instancia enemiga, de la cual leemos su ID de instancia y lo guardamos en la variable enemigo. Para que esto funcione el evento de colisión se debe manejar en el jugador, si se hace en el enemigo, "other" sería el jugador, y conocer la id del jugador no tiene mucho sentido en un juego donde sólo hay un jugador.
Otro método es usar una de las funciones de colisión, que devuelven la id de la instancia contra la que se colisiona (collision_circle, collision_rectangle, collision_point, etc)
Cita de: penumbra en Junio 13, 2014, 08:09:29 AM
Cita de: empardopo en Junio 13, 2014, 07:51:17 AM
Y hablando de IDs.
Entonces si en pantalla tengo múltiples instancias de un objeto, por ejemplo, obj_enemy. ¿En un momento dado cómo sé cual de todos es por ejemplo el que ha colisionado con mi personaje?
precísamente, por eso es muy útil el ID de la instancia y la palabra clave other. Un método podría ser, en el objeto jugador, poner un evento de colisión contra obj_enemy, y en ese evento enemigo = other.id
En este caso, other es la otra instancia (estamos dentro de obj_player), es decir, la instancia enemiga, de la cual leemos su ID de instancia y lo guardamos en la variable enemigo. Para que esto funcione el evento de colisión se debe manejar en el jugador, si se hace en el enemigo, "other" sería el jugador, y conocer la id del jugador no tiene mucho sentido en un juego donde sólo hay un jugador.
Otro método es usar una de las funciones de colisión, que devuelven la id de la instancia contra la que se colisiona (collision_circle, collision_rectangle, collision_point, etc)
Muchas gracias penumbra. Creo que lo he entendido más o menos, jeje! Intentaré ponerlo en práctica a ver.
Un saludo
Sí, ya sé que cuando comparo variables con objetos comparo id's con id's xD Pero creo que lo veo...
lo que tengo que hacer es GUARDAR SIEMPRE ID's, pues instance_nearest coge el id. Y, cuando yo hacía variable = objeto, debería hacer variable = objeto.id, pues sino no me guarda el id, sino otra cosa. Y esta inconsistencia era letal y en algún momento tenía que petar por algún lado. Supongo que es eso :)
En mi juego tengo muchas variables con valor noone, y a algunas de ellas les voy asignando objetos, para luego comparar si la variable es tal objeto. Para solucionarlo deberé trabajar siempre con id's, almacenar id's, y si comparo o asigno un objeto, hacerlo en su id, no en el objeto en sí. Mi problema era mezclar ids (> 100000) con lo otro (0, < 100000), pero me sorprendía porque, de alguna forma, hasta ahora siempre me había ido bien, y se me fue la olla xD Ahora trabajaré al 100% con id's solamente, gracias :D