class_19-52959066

La App Makers

Ohayō señores!
Hoy trataremos de determinar los Searchpaths en Android y Windows mediante un juego Ren’Py, con el fin de poder manipular archivos externos a los Assets de nuestro juego.
Este post estará relacionado de forma directa con el «Post #18», ya que se probará el código de este tutorial con el sistema de descargas que hicimos.
Sin nada más que decir, dirígete al lugar más comodo de tu casa, arranca tu tostadora, ¡y a codificar!


1. ¿SEARCHPATH? ¿Y ESO QUÉ ES?

[SCREENSHOT : Extracto del archivo “log.txt” generado por un juego Ren’Py en Android]

Todo programa busca sus recursos antes de arrancar, incluso si hay archivos que se leen después de iniciado. El punto es el siguiente: ¿Como es que Ren’Py da con el paradero de cada archivo que compone tu juego? Esa es la pregunta que resolveremos en este post.

“Searchpath” es un concepto que, si lo llevamos al español, significaría “Ruta de Búsqueda”.
Cuando nuestro juego está arrancando, Ren’Py se dedica a indexar todos los archivos en la primera etapa del arranque de tu juego, luego procede a leer tus scripts y posteriormente preparar el entorno gráfico para mostrar en pantalla. Te darás cuenta de lo que digo, cuando revises el archivo log.txt que se genera en la carpeta base de tu juego.

Nuestro objetivo final, será determinar el Searchpath en cualquier móvil o PC en que arranque el juego, para darle un uso futuro como por ejemplo, el descargar archivos de audio, imagenes o scripts para el juego.

Itinerario de este post :

  • Variables config.basedir y config.gamedir
  • Ruta Pública de Android
  • [Python + RenPy] Detector híbrido de Searchpaths para Android y PC

2. LAS VARIABLES “CONFIG.BASEDIR” Y “CONFIG.GAMEDIR”

Es probable que hayas visto algunas variables de tipo config en options.rpy y screens.rpy. El punto es que estas variables de las que hablaremos ahora, no están en ninguno de esos archivos.
PyTom, el desarrollador de Ren’Py no ha documentado de forma oficial el funcionamiento de estas variables, pero después de tanto husmear en el código fuente del motor, me siento apto para enseñarles.

Estas variables de Configuración son :

  • config.basedir [Variable nativa] : Devuelve la ruta que apunta a la carpeta base de tu proyecto, o en el caso de que el juego esté compilado, la carpeta base del juego.
  • config.gamedir [Variable nativa] : Devuelve la ruta que apunta a la carpeta /game de tu proyecto, es decir, en donde están todos los Assets de tu juego.

Es muy posible que en estos momentos ya te haya entrado la curiosidad sobre si de verdad esto retorna las rutas respectivas en el sistema de archivos. Para averiguar si esto funciona de verdad, podemos usar la consola de Ren’Py, el cual se despliega cuando tenemos nuestro juego iniciado, presionando Shift + D y seleccionando “Consola”. Se verá algo similar a esto :

Una vez abierta la consola, podemos escribir expresiones de Python, respetando la sintaxis de Ren’Py. Para ver el dato que almacena config.basedir o config.gamedir, simplemente escribe la variable y presiona Enter. Al hacerlo, la variable retornará una string con la ruta que apunta hacia la carpeta base y /game de tu juego :

NOTA 1 : Para cerrar la consola y continuar con el juego, escribe “exit” y presiona Enter.

NOTA 2 : Es posible que la UI de los Screenshots no se vea igual que en tu PC. Esto se debe a que he modificado gran parte de la UI que muestra mi Launcher de Ren’Py.

Con estas variables podemos estar conscientes de que si nosotros queremos escribir archivos propios o leerlos, se harán en sus rutas correctas, sin importar el PC donde se instale el juego.
Eso sí, en Android el asunto cambia radicalmente. Para escribir o leer archivos, el método anterior no lo recomiendo en lo absoluto. En Android, estas variables apuntan hacia la ruta raíz /data/data, la cual no es segura de que funcione en todos los dispositivos Android para actividades de escritura/lectura personalizadas. Mira el siguiente ítem para ver el método que se emplea en Android.


3. LA RUTA PÚBLICA DE ANDROID

En Android, cuando instalas una app y la arrancas, el sistema asigna una ruta privada (data/data) y una ruta pública (/storage/emulated/0/Android/data) a la app, siendo la ruta pública en que podemos escribir y leer archivos sin problemas.

[SCREENSHOT : Vista de carpetas de la ruta pública en el explorador de archivos de mi móvil.]

Ahora te estarás preguntando: ¿qué usos le podemos dar a la ruta pública?
Una de las cosas más peculiares que podemos hacer con la ruta pública, es que podamos leer archivos desde ahí, de la misma forma que si hubieramos empaquetado los archivos en el mismo APK.
Si hacemos una carpeta /game dentro de esta ruta, podemos colocar en su interior scripts RPY, imágenes, audios, y cargarlos en el arranque tal como si estuvieran dentro del APK.

Para utilizar la ruta pública, no es necesario solicitar el permiso de acceso a almacenamiento ya que es una ruta que gestiona el mismo sistema operativo para todas las apps instaladas en el móvil.

NOTA : Si el juego no solicita permiso de almacenamiento, no podrá acceder a los archivos y carpetas del usuario, incluso si el programador del juego tiene intenciones de hacerlo, pues Python retornará un error “Permiso Denegado”.

Bien, menos drama, más acción. A continuación les mostraré un código que, cuando el juego está instalado en Android y haya sido arrancado, extraerá la ruta pública :

El código anterior interactúa con el sistema operativo para extraer la ruta pública del APK en el dispositivo donde se está arrancando.
Al evaluar la variable que hicimos, nos devolverá una string con la ruta pública del APK, el cual se vería algo así :

/storage/emulated/0/Android/data/com.nombredelpaquete/files

Bien, ahora que aprendimos a extraer las rutas en PC y en Android, ya podemos adentrarnos en el siguiente y último ítem de este post, donde le daremos utilidad a los Searchpaths. ¡Vamos camarada!


4. [PYTHON + REN’PY] ¡VAMOS A HACER UN DETECTOR DE SEARCHPATHS HÍBRIDO!

En este ítem cumpliremos el objetivo final de obtener el Searchpath de nuestro juego en los sistemas operativos comunes para jugar: Windows y Android.
Nuestra misión será crear un fragmento de código híbrido, es decir, que hará algunas actividades respecto del sistema operativo donde el juego se está arrancando. Para esto crearemos una función de Python que haga el trabajo de buscar y expresar el Searchpath correspondiente. Mira el código a continuación :

Ese pequeño código hará la detección del Searchpath dependiendo del sistema operativo. En el caso de Android, la función creará las carpetas necesarias y leerá la ruta pública en el móvil que haya sido ejecutado. Para entenderlo mejor, les desglosaré el código :

  • os.path.exists() [Método] : Este método proviene desde el módulo “os” que se importó en el inicio del código. Este recibe como argumento una string o un objeto con la ruta a inspeccionar. Devolverá True si la ruta existe, de lo contrario, retorna False.
  • os.mkdir() [Método] : Este método se emplea en el codigo en caso de que la carpeta “/game” no exista. Su función principal es crear carpetas dentro del sistema de archivos de un dispositivo.
  • if renpy.android [Condicional] : Esta condición evalúa a la variable. Si la variable devuelve True, ejecutará el bloque de código respectivo para Android.
  • if renpy.windows [Condicional] : Esta condición evalúa a la variable, la cual devuelve True si el juego ha sido arrancado en un dispositivo con Windows instalado. Si devuelve True, ejecutará el bloque de código respectivo para Windows.
  • replace() [Método] : Este método se emplea para reemplazar caracteres en una string. En Windows, las rutas a cada directorio y fichero se separan con un Backslash. Para no tener problemas, se reemplazan los Backslash con un Slash normal mediante este método.

Bien, ya que hicimos nuestro detector de Searchpaths híbrido, vamos a usarlo en el sistema de descargas del post anterior.

Para hacer una retroalimentación pequeña del post anterior, les mostraré el código que ejecutaba las descargas en el juego :

Ese código funciona correctamente. El punto es que descarga los archivos en la carpeta base del motor (o cuando compilas tu juego, en la carpeta base del juego). Puede que la real intención sea de que queremos descargar los archivos dentro de la carpeta /game para usarlos dentro del juego. Para eso, tenemos que modificar al antiguo código de descargas y dejarlo de esta forma :


Al iniciar el juego y presionar “Comenzar”, nos va a salir el menú electivo que hicimos en el código :


Al iniciar la descarga nos saldrá la ventana que hicimos en el código del Post #18 :


Una vez terminada la descarga, el archivo aparecerá ahora en el interior de la carpeta /game :


Y en Android, el archivo se habrá descargado en el interior de la carpeta /game virtual de la ruta pública :


El archivo de audio se reproducirá sin problemas. Al reproducir el audio en Windows, nos aparecerá esto :


Al compilar el juego para Android y reproducir el archivo, nos aparecerá la ruta apuntando hacia el archivo :


El código de este post lo podrás encontrar en mi repositorio de GitHub en este link :

DM_Post_19.rpy

El código alternativo del sistema de descargas ha sido modificado tanto para que funcione en PC como también en Android. Encuéntralo tambien en el repositorio :

DM_Post_18_02.rpy (Código alternativo)


Hago flamear la bandera señalando que hasta aquí llega el post del día de hoy. Recuerda que si tienes dudas, puedes dejarme un comentario allá abajo o enviarme un mensaje por Telegram. Mis estudios han sido un impedimento, pero podré responder :3


Mira el código de los posts anteriores en mi repositorio de GitHub!

Eres nuevo? Descarga el motor Ren’Py para que comiences a hacer tu propia Visual Novel!

  • Visita la web oficial de Ren’Py Presionando Aquí!
  • Link para copiar : https://renpy.org/

No has entendido algo sobre este post u otros de este mismo hilo? No dudes en comunicarte conmigo! Contactame mediante los comentarios o en mi Telegram personal!


¿Próximo post? La verdad nunca pensé que llegaría tan lejos con este hilo. Es impresionante que casi llegamos a los 20 posts en este hilo.

Veamos qué se me ocurre para hacer en el siguiente post… Humm… ¡Lo tengo! Hace un tiempo en un grupo de Facebook me pidieron que hiciera un controlador de versiones de juegos Ren’Py, asi que en el siguiente post haremos un Verificador Online de actualizaciones. Esa característica notificará al jugador en caso de que haya una nueva versión del juego.

Con eso dicho, me despido de ustedes para continuar picando código para mi juego xD. Adiós chicos, ¡hasta la próxima! :3


Navega entre los posts de este hilo!

<< Ir al Post #18 Pronto estará el Post #20!

<< Eres nuevo? Click aquí para ir al Post #1 >>


CharlieFuu69 Creations! – ElectroBasicsYT


Ayuda a los autores

  • Tutorial
  • Programación | Programas, aplicaciones | Otros
0 Comentarios

Contesta

CONTACTANOS

Esta es su red social de tecnología para compartir tus ideas y proyectos .Puedes enviarnos un correo si tienes dudas.Nos vemos

Enviando

Inicia Sesión con tu Usuario y Contraseña

o    

¿Olvidó sus datos?

Create Account