explico mi problema, necesito obtener el objeto de una id, no la id de un objeto.
obtener la id de un objeto es relativamente facil, pero no e logrado hacer lo contrario, que yo, dando una id, me arroje que objeto es. escribí este codigo:
create:
objeto_test_id = 0
global_mouse_pressed:
objeto_test_id =get_integer("codigo","")
draw:
if objeto_test_id != 0
if objeto_test_id = objeto_test //este es el objeto a testear
draw_text(x,y,"funciono")
else
draw_text(x,y,"id no valida")
este codigo no funciono, asi que probe este
create:
objeto_test_id = 0
global_mouse_pressed:
objeto_test_id =get_integer("codigo","")
draw:
if objeto_test_id != 0
if objeto_test_id = objeto_test.id //este es el objeto a testear
draw_text(x,y,"funciono")
else
draw_text(x,y,"id no valida")
al principio funciono, pero solo funciona con la id del primer objeto creado, es decir no funciona si hay mas de un mismo objeto.
entonces la pregunta es esa, obtener objeto de una id dada para poder usarla para comparar con un if para que el código haga una acción especifica dependiendo del objeto que tenga esa id.
esto solo es una prueba de concepto ya que el uso real que le daría seria dentro de un for para testear todos los objetos dentro de una room y dependiendo de que objeto sea cada uno hacer una acción dada( es un sistema de guardado propio que necesito, no, no me sirve el que trae por defecto el gamemaker.)
object_get_name(object_index);
gracias por tu respuesta, sin embargo la funcion no funciona sola, estube investigando un poco y asi es como se hace funcionar la funcion, para todos los que tengan el mismo problema que yo:
Create Event:
execute code:
objeto_test_id = 0
Mouse Event for Glob Left Pressed:
execute code:
objeto_test_id=get_integer("numero de id","")
//esta es la parte que hace el trabajo
with (other)
{
aa=other.objeto_test_id
objeto = object_get_name(aa.object_index)
}
Draw Event:
execute code:
draw_text(x,y-50,"aga click para introducir la id")
if objeto_test_id != 0
{
draw_text(x,y-25,objeto)
if objeto = "objeto_test"
{
draw_text(x,y,"funciona")
}
else
if objeto_test_id = 1
draw_text(x,y,"introduzca una id valida")
}
ahora lo unico que todavia no logro descubrir es como hacer cuando se encuentre con una id que no exista, por ejemplo que sea una id de un objeto destruido. si alguien tiene una idea de como arreglar esto seria de gran ayuda.
edito:
la funcion trabaja asi: object_get_name(instance_id.object_index)
tal vez si creas tus propias ids, cada vez que se crea un objeto cuentas y ese numero lo asignas a una variable de ese objeto
De lo que he visto en tu código, le pides al usuario que introduzca un id, pero no me imagino por qué un usuario común y corriente tendría que saber los ids de cada objeto que haya en el juego
para saber si un objeto existe
object_exists(object_index)
para saber si una instancia existe
if (instance_number(object_index) > 0 )
sigo con el problema de antes, de que necesito comprobar si una id existe, el problema es ese, si no existe el programa me tira error.
ya intente con variable_local_exist y con object_exist.
pero cada que se ingresa una id de un objeto que no existe me tira un error asi:
ERROR in
action number 1
of Mouse Event for Left Released
for object obj_escritor:
Error in code at line 11:
if variable_local_exists(objeto_test_id.object_index)
^
at position 42: Unknown variable object_index
de verdad no se como solucionar este problema. aqui tienen el codiogo de lo que trato de hacer, a ver si alguien me puede dar una solucion o orientarme a como comprobar si algo existe.
archivo = file_text_open_write(working_directory+"/test/archivo.txt")
for (i = 0 ; i < 21 ; i +=1)
{
objeto_test_id = i+100000
if variable_local_exists(objeto_test_id.object_index)
{
objeto = object_get_name(objeto_test_id.object_index)
if objeto = "obj_test"
{
file_text_write_string(archivo,string(objeto)+","+string(objeto_test_id.x)+","+string(objeto_test_id.y))
}
file_text_writeln(archivo)
}
contador +=1
}
file_text_close(archivo)
como les digo, este código funciona hasta que se encuentra una id que no posee objeto.
penumbra, gracias por la idea, pero no me funcionaria debido a que tengo mas de un mismo objeto.
edito:
ya solucione el problema, si a alguien le sirve el código que hice aquí lo doy sin el error que tenia antes.
archivo = file_text_open_write(working_directory+"/test/archivo.txt")
/*
file_text_write_string(archivo,"hola mundo,15,2")
file_text_writeln(archivo)
file_text_write_string(archivo,"hola mundo2")
file_text_close(archivo)
*/
for (i = 0 ; i < 21 ; i +=1)
{
objeto_test_id = i+100000
if instance_exists(objeto_test_id)
{
objeto = object_get_name(objeto_test_id.object_index)
if objeto = "obj_test"
{
file_text_write_string(archivo,string(objeto)+","+string(objeto_test_id.x)+","+string(objeto_test_id.y))
}
file_text_writeln(archivo)
}
contador +=1
}
file_text_close(archivo)
básicamente este código permite analizar todos los objetos id por id ver que objeto es y por medio de eso hacer la acción que se quiera con ese objeto.
todavía necesito descubrir como encontrar la id mas alta en una room.
si alguien tiene ideas estoy abierto a ellas.
A ver si este método te cuadra...
Se puede evitar el uso de un ciclo, de esta manera no hay necesidad de comprobar si existe la instancia, el código guarda las ids de todas las instancias existentes (y obviamente no se va a guardar una id de una instancia que no existe). También se evita la necesidad de saber de antemano cuantas veces se repite el ciclo.
lista_i = ds_list_create()
with (all) //para todas las instancias existentes...
{
ds_list_add(lista_i, id) // guardar su id en una lista
}
Y ahora, la magia de las ds_list
ds_list_sort(lista_i, true) //Ordena de manera ascendente los identificadores de cada instancia
Si quieres ordenar descendentemente, cambias a false
para leer el primer valor de la lista
ds_list_find_value(lista_i, 0)
para leer el último valor de la lista
ds_list_find_value(lista_i, ds_list_size(lista_i) - 1)
a ver si entendi... estos codigos son SOLO para buscar las id de los objetos?
porque yo ocupo que el programa me detecte las id de una misma instancia en el mismo room (mas de un enemigo con el mismo sprite y object en el mismo room)
para que un misil "estatico" empieze su movimiento hacia una instancia seleccionada y destruya al enemigo por id.
Para ello cambia lo siguiente:
with ( obj_enemigo ) //cambia aqui all por el objeto enemigo
{
ds_list_add(lista_i, id) // guardar su id en una lista
}
De esta forrma guardaras en una ds_list las "ids" de todas las instancias del objeto enemigo que hayan en el room.
Ahora si lo que quieres es un Homming Missile, una manera de lograrlo es la siguiente:
obj_missile
Evento Create
target = instance_nearest( x, y, obj_enemy );
Evento Step
If ( instance_exist( target )
{
delta = point_direction( x, y, target.x, target.y ) - direction;
}
If ( abs( delta ) > 180 )
{
delta -= delta;
}
if ( abs( delta ) > 4 )
{
direction += 4 * sign( delta );
}
image_angle = direction;
les dejo mi archivo game maker
no es el original, solo vienen las partes necesarias para que sepan que es lo que quiero hacer, en game info viene una imagen detallada
https://www.dropbox.com/sh/tzkeydnlvjt6137/ya52JVhzHG
La variable delta contiene la diferencia en angulos entre la direccion en la que en este momento el misil se dirige y la direccion a la que necesita girar para llegar a su objetivo. Osea contiene el valor de un angulo.
Si el valor de este angulo es positivo, significa que el misil debe girar al contrario de la manecillas de reloj (counter-clockwise), osea incrementar su angulo de direccion. Si su valor es negativo, todo lo anterior pero al contrario.