Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: AndreiiCx en Noviembre 08, 2013, 08:13:26 AM

Título: [RESUELTO] Contar cantidad de instancias del mismo objeto al lado
Publicado por: AndreiiCx en Noviembre 08, 2013, 08:13:26 AM
Saludos Makeros!

Hoy me topé con este problema, quiero saber si es posible (y como hacerlo :-[) contar la cantidad de instancias de un mismo objeto que estén a su derecha (o a cualquiera de sus lados, pero iniciemos por algo XD).

Para explicarme mas, que el primer objeto a la izquierda, guarde en una variable la cantidad de veces que se repite su instancia a la derecha, como si de contar tiles se tratase.

Si necesitan que profundice más me avisan C: y gracias desde ya!
Título: Re:Contar cantidad de instancias del mismo objeto al lado
Publicado por: AndreiiCx en Noviembre 19, 2013, 01:02:24 AM
Up :-[
alguien? :'(
Título: Re:Contar cantidad de instancias del mismo objeto al lado
Publicado por: penumbra en Noviembre 19, 2013, 01:49:13 AM
No garantizo que funcione, es lo primero que se me ocurrió:

CREATE
ultima_id = 0
id_cuenta = 0

STEP
if instance_exists(obj_x)
{
    with (obj_x)
    {   
   ultima_id = id
        if (ultima_id.x > obj_jugador.x)
        {
       id_cuenta += 1
   }

    }
}

ultima_id creo que no es necesaria, se puede usar id directamente en la comparación del if. Tambien, en el primer if, lo mejor sería agregar una condición más para evitar que el proceso se repita en cada step, y sólo se ejecute cuando se quiera saber las instancias a la derecha
Título: Re:Contar cantidad de instancias del mismo objeto al lado
Publicado por: Mochi Mochi en Noviembre 19, 2013, 10:13:22 AM
Hola AndreiiCx!! :P
Quieres que cada instancia realice ese calculo?? o solo quieres que lo realice la instancia que esta mas a la izquierda??

bueno si es de todas, a mi se me ocurre asi:

1.- contar el numero de instancias del tipo objeto
2.-guardarlos en una lista (para no recorrer todas las instancias existentes en el room, y de esta manera agilizar el calculo)
3.-contar y guardar en cada instancia el numero de instancias que tiene a la derecha (que su valor x sea mayor)

aquí pongo el código, en mi caso el tipo de objeto es pelota.

//contar instancias
numInstancias=instance_number(pelota)
//recuperar todas las instancias de un objeto y guardarlas en una lista
lsInstancias= ds_list_create();
//agregar instancias a la lista
for(i=0;i<numInstancias;i+=1){
    ds_list_add(lsInstancias,instance_find(pelota,i))
}
//contar y guardar en cada instancia el número de instancias que tiene a la derecha (que su valor x sea mayor)
for(i=0;i<numInstancias;i+=1){
    contar=0
    instancia=ds_list_find_value(lsInstancias,i)
    for(j=0;j<numInstancias;j+=1){//comparar el valor de x de la instancia con el valor x de todas las demás instancias en la lista
        instanciaAComparar=ds_list_find_value(lsInstancias,j)
        if(instanciaAComparar.x>instancia.x){
            contar+=1
        }
    }
    instancia.numInstanciasDer=contar
    show_message("instancia="+string(instancia)+" tiene "+string(instancia.numInstanciasDer)+" a su derecha")
}


Espero haber entendido y espero te sirva, un saludo  :D
Título: Re:Contar cantidad de instancias del mismo objeto al lado
Publicado por: AndreiiCx en Noviembre 22, 2013, 01:36:59 AM
Muchas gracias a ambos!!

@Mochi Mochi

No eh revisado tu codigo por completo :-[ (aun no manejo muy bien la ds_list) pero al ver el uso del for me solucionates el problema x'D ahora lo que hago, es que si hay una instancia a la izquierda, no realize la cuenta, de lo contrario, inicie con el ciclo, y usando tu metodo, cuenta cada instancia.

Me falto explicar al principio, que lo quería para una secuencia de tiles, en un paltaforma, por que quiero hacer un generador  random de "tile breakers" y pues, si hay espacio para uno de los tile grandes, que lo ponga, de otra forma, empieze a buscar el que le sigue en cuanto a tamaño mas pequeño, y asi.

Gracias de verdad, tema resuelto! 8)
Título: Re:[RESUELTO] Contar cantidad de instancias del mismo objeto al lado
Publicado por: brunoxzx en Noviembre 23, 2013, 07:48:59 AM
Siendo sincero no entiendo para que la lista, en el script que pusiste no sirve de mucho  :P. Para este caso yo usaría un script como este:

[gml]instance_count_side(objeto, lado(1 der, -1izq) )[/gml]
[Gml]
var c=0;
with(argument0) c+=(x-other.x)*argument1>0;
return (c);
[/gml]