Hola, quisiera solucionar un pequeño problemilla que no sé si sea pequeño...xD (noy NooB)

Tengo un juego en el cual se toman x capturas de pantalla de x partes iguales de la misma. Y las guarda con el nombre "captura" y un número obetenido de un ciclo for:

[gml]
partt = room_width/x;

for(i=0;i<x;i+=1)
{
   screen_save_part("captura"+string(i),partt*i,0,partt,room_height);
}[/gml]

Imaginémonos que ese código crea x capturas de pantalla con nombres por ejemplo: "captura0","captura1"...etc...

mi duda es cómo puedo hacer que el GMS cuente cuantas imágenes "captura[NÚMERO]" hay guardadas...
no sé si me expliqué bien, pero cualquier ayuda me serviría... :D :D
alaberga regué el café.

BA:STFW&RTFM

Bueno, es posible hacerlo, pero, una pregunta. ¿Por qué no usar directamente la variable límite del ciclo? Se supone que no sería necesario contar las imágenes ya que habría x capturas hechas, de acuerdo a tu código.

#2 Octubre 27, 2015, 10:02:25 PM Ultima modificación: Octubre 27, 2015, 10:04:38 PM por NiuWeb
Cita de: penumbra en Octubre 27, 2015, 09:58:21 PM
Bueno, es posible hacerlo, pero, una pregunta. ¿Por qué no usar directamente la variable límite del ciclo? Se supone que no sería necesario contar las imágenes ya que habría x capturas hechas, de acuerdo a tu código.

Porque el juego se cerrará en algún momento. ¿Y si el jugador elimina las imágenes de forma remota(es decir, del directorio del juego)?. Lo de menos sería crear un .ini con la variable límite, pero como dije antes: No es exacto. Dado caso que el .ini se borre. El conteo se descuadra y devolverá datos que no son. Básicamente, el programa debe saber cuántos archivos/imágenes hay en el directorio sin leer ninguna variable. Sólo contar...
alaberga regué el café.

BA:STFW&RTFM

Cita de: NiuWeb en Octubre 27, 2015, 10:02:25 PM
Porque el juego se cerrará en algún momento. ¿Y si el jugador elimina las imágenes de forma remota(es decir, del directorio del juego)?. Lo de menos sería crear un .ini con la variable límite, pero como dije antes: No es exacto. Dado caso que el .ini se borre. El conteo se descuadra y devolverá datos que no son. Básicamente, el programa debe saber cuántos archivos/imágenes hay en el directorio sin leer ninguna variable. Sólo contar...
Eso imaginé.
[gml]
for(i=0; i<x; i+=1)
{
     if asset_get_index("captura" + string(i) )  > -1
          contador++

}
[/gml]

#4 Octubre 27, 2015, 10:17:16 PM Ultima modificación: Octubre 27, 2015, 10:19:13 PM por NiuWeb
Cita de: penumbra en Octubre 27, 2015, 10:10:09 PM
Cita de: NiuWeb en Octubre 27, 2015, 10:02:25 PM
Porque el juego se cerrará en algún momento. ¿Y si el jugador elimina las imágenes de forma remota(es decir, del directorio del juego)?. Lo de menos sería crear un .ini con la variable límite, pero como dije antes: No es exacto. Dado caso que el .ini se borre. El conteo se descuadra y devolverá datos que no son. Básicamente, el programa debe saber cuántos archivos/imágenes hay en el directorio sin leer ninguna variable. Sólo contar...
Eso imaginé.
[gml]
for(i=0; i<x; i+=1)
{
     if asset_get_index("captura" + string(i) )  > -1
          contador++

}
[/gml]

mmm.... veo útil el código. Pero me parece que igualmente necesita un límite de imágenes(x) para contar.

Me explico mejor:

Tengo una room cualquiera, y tomo x fotos cualquieras con nombre cualquiera MÁS UN NÚMERO QUE LA IDENTIFIQUE(foto1,foto2,fotoN)
Después, en otra parte cualquiera del juego, necesito contar el número de imágenes con el nombre(foto1,fotoN) que hayan en el directorio. Sin necesidad de haber mirado la variable del límite de capturas que se tomó... :D
alaberga regué el café.

BA:STFW&RTFM

#5 Octubre 27, 2015, 10:29:32 PM Ultima modificación: Octubre 27, 2015, 10:51:06 PM por penumbra
No conozco una función nativa de GML que cuente cuántos archivos (sprites) hay en una carpeta. No digo que no la haya, pero yo nunca la he visto.

SI no la hubiera, creo que lo mejor sería que lleves un conteo de cuántas capturas se crean, y almacenes esa variable en un ini,  y la uses para limitar el ciclo for cuando sea necesario, ya que en la carpeta de escritura de GMS nunca habrá más imágenes que las que indique esa variable. Si el jugador borra imágenes por fuera del juego, es su problema, o crea tu mismo un sistema que permita borrar las capturas desde el juego y modifica el valor de el contador cuando se borre una captura.


EDITADO:
Leyendo el manual, quizás se podrían usar las funciones file_find_first() y file_find_next() para contar el número de imágenes en la carpeta.

sc = 0;
num = 0;
while (sc < 50)
{
    if (!file_exists("/sdcard/captura"+string(sc)+".png"))
        sc++;
    else
    {
        num++;
        sc++;
    }
}

sc hace la revisión hasta 50, para marcar un límite y no hacerlo infinito, que explotaría tu juego xD (no creo que nunca tengan 50 capturas guardadas cierto? xD tu verás, cambialo a tu gusto)
y num, son los archivos que sí existen, por lo tanto, es el dato que tú necesitas, aunque exista la captura1, la 2, la 3, la 4 no exista, pero la 5 si.. me explico?
el código no lo pongas en step ni ningún evento en bucle, ya que se pondría en 0 siempre xD
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

#7 Octubre 28, 2015, 12:38:47 AM Ultima modificación: Octubre 28, 2015, 12:58:21 AM por penumbra
Es lo mismo que NiuWeb quiere evitar: usar un número fijo para determinar la cantidad de iteraciones. Por ejemplo, con el código que puse antes:
[gml]
for(i=0; i<50; i+=1)
{
     if asset_get_index("captura" + string(i) )  > -1
          contador++
}
[/gml]
Hace lo mismo que el while, partiendo de la suposición de que no habría una cantidad de capturas mayor a 50. Sin contar con que por ejemplo, si se guardan 10 capturas, y se usa 50 como límite, se harían 40 iteraciones de más.

tiene que haber un límite sí o sí, si le apetece ponerlo bien grande ok, lo que demorará más al juego, pero sin limite, simplemente... PUM! xD
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

Cita de: kostra en Octubre 28, 2015, 01:44:17 AM
tiene que haber un límite sí o sí, si le apetece ponerlo bien grande ok, lo que demorará más al juego, pero sin limite, simplemente... PUM! xD
Yo no digo que no tenga que haber un límite, pero hay diferencia entre usar un límite FIJO y un límite DINÁMICO. Ya estoy terminando un ejemplo para mostrar lo del límite dinámico

#10 Octubre 28, 2015, 04:46:14 AM Ultima modificación: Octubre 28, 2015, 04:48:39 AM por Guacusio
Se puede hacer así (en los comentarios puse la explicación de los pasos):

var l,f,n,a,i;
l=ds_list_create();//lista para guardar los nombres de los archivos
f=file_find_first("captura*.png",fa_archive);//busca el primer archivo con la forma "captura*.png"
while f!=""
    {//si existe tal archivo, entonces:
    n=string_replace(f,"captura","");//al nombre del archivo le sacamos la parte "captura"
    n=string_replace(n,".png","");//luego le sacamos la parte ".png"
    if string_length(string_digits(n))=string_length(n)//si el número de dígitos contenido en lo que quedó es igual al número total de caracteres, cumple el requisito (que el * sólo sean dígitos)
        ds_list_add(l,f);//y se agrega a la lista
    f=file_find_next();//a continuación repite el proceso para el siguiente archivo con la forma "captura*.png"
    }
//volcado de la lista a una sola variable para mostrarla en pantalla:
a="";
for(i=0;i<ds_list_size(l);i+=1)
    a+=l[| i]+"#";
show_message(a);
ds_list_destroy(l);


Eso mostrará una lista con los archivos que tienen la forma captura*.png, donde * es un número entero.


Bueno, venía a postear el ejemplo pero ya Guacusio se me adelantó. Buen trabajo, Guacusio.

Cita de: penumbra en Octubre 28, 2015, 05:16:41 AM
Bueno, venía a postear el ejemplo pero ya Guacusio se me adelantó. Buen trabajo, Guacusio.

Gracias, Penumbra. Pero si ya te diste el trabajo de preparar una solución, debieras publicarla de todos modos. Dudo que sean idénticas y siempre es bueno tener en cuenta más de una opinión.


Gracias a todos por la ayuda, y en especial a Guacusio, que publicó ese código angelical...xD
Adjunté un GMZ que tiene una pequeña prueba de este lio...xD
alaberga regué el café.

BA:STFW&RTFM