class_14

La App Makers

Hola a todos! Hace unos días pregunté sobre el tema del que se trataría este post, y según concluí por los comentarios, este post tratará sobre el uso de las Solicitudes Web en Ren’Py!
Para esta funcionalidad, se requiere escribir código en Python ya que Ren’Py por si solo, no es capaz de hacer solicitudes web.
Abre tu editor de texto favorito y toma apuntes!


1. INTRODUCCIÓN : TRÁNSITO DE DATOS Y REQUERIMIENTOS PREVIOS

Si! En este post trataremos con algo que puede ser una buena funcionalidad para agregar a un juego. Les enseñaré a hacer un sistema de recepción de datos en un juego Ren’Py, la cual puede ser útil como por ejemplo, para implementar un News Feed (Noticias) que el desarrollador puede mostrar al jugador en tiempo real!

Lo primero que debemos tener en cuenta, es que necesitaremos ciertas cosas para poder implementar las solicitudes. Estos requerimientos previos son los siguientes :

  • Servidor que opere con HTTP :
    Como no vamos a hacer transitar datos importantes, nuestro primer requisito será tener en nuestro poder, el acceso a un servidor que trabaje con protocolo de conexión HTTP.
  • Servidor en el que sea posible hacer solicitudes de forma libre :
    Las nubes gratuitas como MEGA o MediaFire NO nos servirá para lo que queremos hacer, ya que particularmente esos hosts muestran un archivo con una UI previa, lo que nos perturbará la respuesta recibida por el código.

Si no tienes para pagar un host, no te preocupes! Yo monté el sistema de Informaciones del proyecto TTFL usando el host gratuito 000Webhost. Este host permite el tránsito que se requiere para lo que queremos hacer, ya que al consultar un archivo mediante el server, este nos entrega una respuesta limpia de ese archivo.

Ahora que tenemos ya conocidos los requisitos de lado del servidor, podemos continuar con el siguiente item!


2. “REQUESTS”, EL MÓDULO QUE HARÁ POSIBLE LA COMUNICACIÓN DE NUESTRO JUEGO, CON NUESTRO SERVIDOR!

Para hacer transitar datos desde un servidor hasta el juego, necesitamos tener el módulo Requests de Python, dentro de nuestro juego.
Sigue el paso a paso para descargar y colocar apropiadamente el módulo en el juego!


  • PASO 1 : DESCARGA DEL MÓDULO “REQUESTS”

La forma en que se hace comunmente para descargar módulos de Python, es teniendo instalado Python en el PC, y descargando el contenido mediante CMD (con el pip), pero les facilitaré ese empalagoso trabajo.

Desempaqueta el archivo RAR. Cuando estés listo o lista, avanza al siguiente paso!


  • PASO 2 : COLOCACIÓN DEL MÓDULO EN EL JUEGO

[SCREENSHOT : Carpeta “python-packages” dentro de la carpeta “game”]

Este paso es clave para hacer funcionar correctamente el módulo.
Entra a la carpeta game de tu juego y pega en su interior, la carpeta “python-packages“que recibiste del archivo RAR.
Cuando ya tengas la carpeta dentro de “game”, el módulo estará listo para operar con el código.


3. PLANTEAMIENTO DEL CÓDIGO PARA GENERAR SOLICITUDES CON “REQUESTS”

Los que ya han tomado el hilo a Ren’Py, se habrán dado cuenta que los scripts donde se pica código, se usa Python pero de forma implícita, de una forma en que casi nadie lo nota ya que Ren’Py pone a disposición un lenguaje IDE más cómodo, pero dentro de esos scripts también podemos incrustar código Python de forma explícita, utilizando los bloques python e init python.
Sigan el paso a paso, para entender cómo realizar una solicitud a un servidor, mediante “Requests”.


  • PASO 1 : IMPORTACIÓN DE MÓDULOS

Para importar el módulo Requests al código, debemos hacerlo mediante una declaración de bloque de Python. Lo ideal, es de que la importación, se haga en las primeras líneas de código.
Para importar el módulo, debemos escribir en un Script Ren’Py, lo siguiente :

init python:
    import requests

La declaración de init, señala a Ren’Py que importe el módulo en el proceso de arranque, y la declaración python señala que dentro de ese bloque se escribirá código Python de forma explícita.


  • PASO 2 : GENERAR LA SOLICITUD

Ahora, nos moveremos hacia el interior de label start (en nuestro script principal).
Aquí ocuparemos solamente la declaración Python para escribir la solicitud. Mira a continuación :

label start:

    python:
        try:
            link = “Aquí va la URL de tu solicitud”
            data = requests.get(link)

        except:
            data = “Conexión débil”

    print(data)

Ahora, procedo a explicar el código anterior.
Dentro de label start se comprenden los siguientes comandos :

  • python [Bloque] : Recoge el código explícito de Python.
  • link [Variable] : Posee la URL del servidor hacia donde quieres enviar la solicitud, en la que esta URL, se escribe como una string (cadena de texto/comillas).
  • data [Variable] : Contiene la función que genera una lectura de la URL proporcionada en la variable link.
  • requests.get(link) [Función] : Esta función corresponde al objeto que utilizamos del módulo Requests. La función recibe como argumento (lo que esta dentro del paréntesis) la URL del servidor al que se desea generar la solicitud. Como ya declaramos la URL como variable, solo bastó escribir la variable que contiene la URL, en el interior de la función.
  • try, except [Bloques] : Estos bloques hacen que el código sea a prueba de errores en el entorno de Ren’Py. La solicitud se escribe dentro del bloque try (si lo traduces, significa “Intentar“), mientras que si la conexión es fallida, el código seguirá su curso en except (Excepción).
  • print(data) [Función] : Esta función imprimirá en la consola de Python, el argumento señalado dentro de sus paréntesis. En este caso, dentro del paréntesis está la variable data, que se encarga de mostrar la respuesta del servidor. Entonces print, imprimirá la respuesta del servidor.

NOTA : Si quieres visualizar la consola de Python en Ren’Py, puedes ir a la opción “Preferencias” del Launcher, y activar la opción “Salida de la consola”.

Al recibir los datos que hemos solicitado en el código, la consola de Python se nos verá así :


3.1 DATOS QUE TE SERÁN UTILES PARA ENTENDER LO QUE DEVUELVE LA FUNCIÓN REQUESTS.GET() :

Cuando la función requests.get() recibe una respuesta por parte de la URL indicada, devolverá el nivel de respuesta del servidor. Los niveles de respuesta que un servidor puede entregar, son los siguientes :

  • Response 200 : Cualquier código de nivel 200, querrá decir que el servidor responde correctamente hacia la solicitud.
  • Response 400 : Cualquier código de nivel 400, señala que hay un error de cliente. Por ejemplo, el código 404, señala que el archivo no existe en el servidor. Una respuesta de este nivel, hará que el código siga el curso por el bloque except.
  • Response 500 : Cualquier código de nivel 500, señala que la solicitud se envió efectivamente, pero el servidor no responde a esa solicitud, es decir, el error es del servidor. Una respuesta de este nivel, hará que el código siga el curso por el bloque except.

Pero tenemos un tipo de objeto más que nos puede devolver la función requests.get().
Si la función no nos devuelve algún tipo de “Response“, nos devolverá None, que mayormente sucede cuando la conexión es demasiado débil para hacer la solicitud, o bien, el dispositivo no está conectado a Internet.

Si entendiste esto de forma clara, podemos continuar con el siguiente item, que por cierto, tendrá un poco más de complejidad, pero animo! Never Give Up!!!


4. INTERCAMBIO DE DATOS MEDIANTE UN ARCHIVO JSON

Hoy en día, se utiliza bastante los JSON (JavaScript Object Notation) para el intercambio de datos a nivel local como también a nivel de servidor, y es que JSON ofrece un ambiente bastante cómodo para hacer intercambios de información.
Por lo particular, un JSON es leido como un diccionario, de una forma sencilla.

#OffTopic : Yo empleo esta modalidad para el intercambio de data entre el servidor y la App de Informaciones del proyecto TTFL!

Este archivo JSON, es el que se deja alojado en el servidor, y es llamado por el código mediante una URL que señala su ubicación en el servidor.

Ahora, como podemos leer ese JSON mediante Requests? Pues ahora lo veremos. Utilizaremos el mismo código escrito arriba, solo que haremos unas pequeñas modificaciones para recibir la respuesta, procesar el JSON recibido, y mostrarlo en la UI de Ren’Py. Sigan con el paso a paso camaradas!


  • PASO 1 : CREAR Y SUBIR UN JSON AL SERVIDOR

Ha llegado el momento en donde crearemos el archivo que intercambiará información entre el servidor y el dispositivo.
Recuerdan que les dije que un JSON se lee como si fuera un diccionario? Miren este código JSON que usaremos de ejemplo :

{
    “texto_mamadisimo” : “Hola mundo! Hola DitecnoMakers!”
}

El código JSON se escribe dentro de llaves, la cual al interior, encontraremos a la palabra clave : “texto_mamadisimo”, y el texto que mostrará esa palabra clave : “Hola mundo! Hola DitecnoMakers!”
La palabra clave nos va a ser útil para poder mostrar el texto final en la consola.


  • PASO 2 : IMPORTACIÓN DE MÓDULOS NECESARIOS

Anteriormente importamos solo el módulo requests, pero ahora que necesitamos decodificar el JSON, necesitamos importar el módulo de JSON de igual forma. No te preocupes, el módulo para decodificar JSON ya está integrado en Ren’Py!
Escribe lo siguiente en la parte superior de algún script que tengas de Ren’Py :

init python:
    import requests
    import json

Ahí ya tenemos a los dos módulos necesarios importados al código. Ahora, ve al siguiente paso!


  • PASO 3 : ENVÍO DE SOLICITUD Y DECODIFICACIÓN DE LA RESPUESTA (CÓDIGO COMPLETO)

Como ya viste más arriba, el enviar una solicitud, es extremadamente fácil. Solo debes escribir lo siguiente, dentro de label start:

label start:

    show text “Conectando…” at truecenter

    python:
        try:
            link = “Aquí va la URL de tu solicitud”
            data = requests.get(link)
            data.encoding = “utf-8”

            ## Decodificación del JSON
            lectura = json.loads(data.text)
            text_output = lectura[“texto_mamadisimo”]

            ## Impresión de la respuesta y del JSON
            print(“Respuesta del servidor :”, data)
            print(“JSON Decodificado :”, text_output)

            network_status = True

        except:

            ## Excepción si la conexión es inestable
            data = “Conexión débil”
            print(“Respuesta del servidor :”, data)
            network_status = False

Ahora, explicaré como funciona este código. (La parte de la solicitud, está explicada más arriba).

  • data.encoding = “utf-8” [Variable] : Indica al código de que los datos recibidos de la solicitud (los que están en la variable data), están codificadas en UTF-8. Si no agregamos esa línea, vamos a tener errores de tipeo, donde por ejemplo, la letra Ñ o las letras con tilde, no se mostrarán correctamente.
  • json.loads(data.text) [Función] : Esta función se utiliza desde el módulo JSON importado anteriormente. La función json.loads() decodifica el objeto JSON añadido dentro de sus paréntesis. En este caso, el elemento que se debe decodificar, es la variable data, y el resultado de la decodificación, debe ser en formato text.
  • text_output = lectura[“texto_mamadisimo”] [Variable] : Ya que se decodificó el JSON, ahora se puede utilizar el diccionario. En este caso, la variable extraerá el texto que le corresponde a la palabra clave “texto_mamadisimo”.

5. MOSTRAR EL TEXTO OBTENIDO DEL JSON, EN UNA STRING DE SINTAXIS DE REN’PY

Lo ideal, es crear esta funcionalidad para mostrar texto al jugador.
Es bastante dificil que un jugador se de el trabajo de examinar la consola para ver lo que el servidor le entregó, por lo que debemos hacer que ese contenido recibido, sea visible de alguna forma en la Interfaz de Juego.
A modo de ejemplo, mostraremos el texto obtenido en el cuadro de diálogos. Para esto, debemos salir del bloque python donde escribimos el código para generar las solicitudes, pero no salir del bloque label start.
Para mostrar el texto recibido, debemos escribir lo siguiente, dentro de label start :

if network_status:
    [text_output]

else:
    “No se obtuvo ninguna p*ta respuesta. Tu conexión es una auténtica mierda xD”

return

Cuando iniciemos partida, el juego comenzará a generar la solicitud. Pasará un corto tiempo hasta que muestre la respuesta obtenida y procesada de este modo :

Peeeeero si de lo contrario, nuestra conexión falla, o es inexistente :

Por supuesto, este es un código de muestra, por lo que mi sentido del humor no corresponde para hacer algo pulcro xD.
En varios posts atrás, expliqué que podemos interpolar una variable en una string, utilizando los corchetes. Simplemente debes encerrar la variable en los corchetes dentro de la string, para convertirlo en texto visible para el jugador.
Más adelante les traeré a modo de especial, un sistema de noticias en tiempo real como el de mi App :3


Bien muchachos! Aquí termina este post donde aprendimos a hacer solicitudes web con Requests!
Si quedaste con dudas, por favor, hazmelo saber en los medios señalados más abajo.

NOTA : Es posible que la App Makers no pueda redireccionar correctamente a un link, o puede que no esté preparado para descargar archivos. Intenta abrir los siguientes links en un navegador como Google Chrome.

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

Ya se ha cumplido 1 año desde que estoy desarrollando el proyecto TTFL! Una novela visual bastante acaramelada xD. Descarga la nueva actualización (v1.06) de la App de Informaciones de “Tears : The First Love!”

No has entendido algo sobre este post u otros de este mismo hilo? No dudes en comunicarte conmigo! Contactame mediante estos chats!


Siguiente post? Pues como la “creación de Screens” quedó en segundo lugar en la anterior elección que hice para el foro, finalmente les enseñaré sobre la creación de una screen y el uso de estilos en el lenguaje de pantallas de Ren’Py!

Eso es todo chicos! Hasta la próxima!


Navega entre los posts de este hilo!

<< Ir al Post #13 | Pronto llegará el Post #15!

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


ElectroBasicsYT – CharlieFuu69 Creations!


Ayuda a los autores

  • Tutorial
  • Programación | Programas, aplicaciones
6 Comentarios
  1. peter
    peter 3 meses

    Bien utilizas el formato Json para el intercambio de los datos. Es mas simple. Saludos

    2+
  2. German
    German 3 meses

    Hola Mundo! Hola ditecnomakers! 🤣🤣 “texto mamadisimo”

    3+
  3. Juanjo
    Juanjo 3 meses

    la comparación es graciosa.

    2+

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