:-\ Como puedo hacer referencia a un objeto en si? sé que existe id de cada objeto, quiero hacer distintas acciones para objetos diferentes ...
Cita de: luxizam en Abril 28, 2016, 03:13:02 PM
:-\ Como puedo hacer referencia a un objeto en si? sé que existe id de cada objeto, quiero hacer distintas acciones para objetos diferentes ...
No se si te servirá esto pero puedes probarlo...
En tu código cuando quieras referirte a un objeto de fuera lo puedes hacer así
[gml]with (obj_tuobjeto){
//las acciones que quieras sobre tal objeto
}[/gml]
Yo lo hago asi y funciona bien, incluso si el objeto no está en la room me a funcionado.
Espero que te sirva.
Cita de: JohnW en Abril 28, 2016, 04:48:55 PM
Cita de: luxizam en Abril 28, 2016, 03:13:02 PM
:-\ Como puedo hacer referencia a un objeto en si? sé que existe id de cada objeto, quiero hacer distintas acciones para objetos diferentes ...
No se si te servirá esto pero puedes probarlo...
En tu código cuando quieras referirte a un objeto de fuera lo puedes hacer así
[gml]with (obj_tuobjeto){
//las acciones que quieras sobre tal objeto
}[/gml]
Yo lo hago asi y funciona bien, incluso si el objeto no está en la room me a funcionado.
Espero que te sirva.
Yo estoy reempezando desde cero así que no tengo mucha idea...
Pero eso es para un objeto o para una instancia de objeto? Es que mientras más leo más lío...
La función with(objeto) creo que hace que se aplique a todos!
Me explico, creo dos instancias de un objeto vale?
instance_create(ob_player1,0,0);
instance_create(ob_player1,0,0);
si modifico por ejemplo las coordenadas :
ob_player1.x = ob_player1.x+10;
Se aplica a los dos Objetos como hago referencia solo a uno ? Se entiende?
Para realizar acciones con una instancia en específico debes tener su id. Y así podrás usar el with para sólo ese objeto.
Cita de: luxizam en Abril 28, 2016, 11:03:16 PM
La función with(objeto) creo que hace que se aplique a todos!
Me explico, creo dos instancias de un objeto vale?
instance_create(ob_player1,0,0);
instance_create(ob_player1,0,0);
si modifico por ejemplo las coordenadas :
ob_player1.x = ob_player1.x+10;
Se aplica a los dos Objetos como hago referencia solo a uno ? Se entiende?
Como te dice NiuWeb, en ese caso necesitarás la ID de cada objeto, esto no te pasaría si los objetos fueran diferentes pero al ser el mismo objeto, pues ya tienes que especificar su ID y entonces usar el "with" que te dije anteriormente con ese "ID"
Si no sabes sacar la "ID" de un objeto, si no recuerdo mal... podias poner en el objeto que querias identificar, un draw_text de tal objeto y que dibujara su ID en la room, luego la apuntas en un papel y ya la tienes.
Esto mismo se podia usar para saber la dirreción exacta o velocidad exacta de un objeto. poniendole draw_text(x, y, speed, obj_objeto) o algo asi era, o direction, y te decia en la room las posiciones, las id's, las direcciones exactas.
La manera que tiene game maker de calcular la direccion y velocidad de cada objeto para mostrarla en pantalla era algo como calculando los catetos por la hipotenusa diagonal y luego pasandola a la raiz cuadrada.
Bueno eso es todo, que ya me extendido demasiado.
Muchas gracias ! mañana lo pruebo .
Para sacar la id de un objeto, no es muy recomendable escribirla manualmente. Es más, sería una completa pérdida de tiempo hacerlo, si ya hay varias herramientas que lo hacen por tí.
GMS trae funciones de colisión u otras que devuelven la id de la instancia que consiguen detectar de alguna forma, funciones como collision_rectangle(), instance_place(), instance_position(), instance_create() (que devuelve la id de la instancia recién creada), entre otras
Para el caso de querer meter eventos a diferentes copias de un mismo objeto según su ID yo te recomendaría un ciclo for, utilizando instance_count, de esa forma haces loop entre ellos y de paso obtienes la ID actual, por ejemplo aquí podemos saber cual es el nivel de salud de cada copia del objeto_pj y actuar en consecuencia. Creo que era algo así pero igual me equivoco con el nombre de las funciones, si eso me corregis:
for(i=0;i<=instance_count(objeto_pj):i=i+1)
{
copia=instance_get_id(obj_pj,i)
if copia.salud=1 then {lo que sea que quieras hacer}
}
Gracias por la explicación , aclaro que en código se entiende mejor la explicación , de esa forma inclusivo podría guardar las id en un array y gestionarlas ahí . Gracias
Creo que el código de Arcadian se podría hacer un poco más corto y sin usar ciclos:
[gml]
with (obj_pj) {
if salud == 1 {
//Haces lo que quieras
}
}
[/gml]
Pero con el with (objeto) estamos en la mismas porque el chico queria controlar un mismo objeto con diferente ID y con el with(objeto) ya comentó que no bastaba porque obviamente afecta a todos.
Y lo que yo exponia de obtener la ID con un simple draw_text no me parece una perdida de tiempo, ya que es más fácil hacer un draw_text que poner un ciclo o código gml difícil de memorizar para alguien que esté empezando. Solo lo puse por eso.
Es tan sencillo com poner en el mismo objeto
[gml]draw_self(); //Esto es para que no se borre de la room tu objeto al usar el evento Draw
draw_text(x, y-16, string(id)); // Esto mostrará 16 pixeles encima de tu objeto su ID[/gml]
De igual manera si quieres controlar esa misma ID o cualquier otra, puedes guardar la id en una variable en el evento create del mismo por ejemplo[gml]mivariable = id;[/gml] y desde ahí ya la puedes gestionar.
Es fácil y no creo que sea una pérdida de tiempo tampoco, son 4 letras de nada.
Pero bueno solo era una forma repito "fácil" de entender y recordar. Tampoco soy profesional estoy aprendiendo igual que todos.
El with afecta a todas las instancias, pero precisamente por eso lo podemos usar.
Me explico. Yo quiero eliminar a una instancia que tenga un puntaje menor a cero (por ejemplo). Entonces, con ese método sería imposible hacerlo, puesto que sería una referencia "estática". Con el with sería algo como esto:
[gml]
with (objeto) {
if puntaje < 0
instance_destroy();
}
[/gml]
No va a eliminar a todas las instancias, sólo a las que tengan un puntaje menor a cero.
Me refiero a que ese método no es para nada dinámico, puesto que la instancia a la haríamos referencia con el id numérico como tal será siempre la misma, y si, por ejemplo, llegásemos a eliminar sin querer a la instancia de la sala, y la volviésemos a poner (con algunos objetos más agregados antes), su id cambiaría, y tendríamos que volveeer a buscar su referencia manualmente.
Mi punto de vista es similar al de NiuWeb, lo mejor probablemente sea usar un with, que al final también revisa todas las copias de un objeto como si estuvieras usando un ciclo for y el instance_count.
Creo que incluso puedes usar la coletilla other para hacer referencia al objeto que creó el with en lugar del que se esta chequeando, con lo cual creo que es lo mas recomendable.