Aliviar la carga de su procesador y tarjeta gráfica

Para aliviar la carga de su procesador y tarjeta gráfica y ejecutar sus pruebas con absoluta fluidez, aplique inmediatamente estas configuraciones de reducción de recursos en Godot Engine:

  1. Cambio de Renderizador: [Seguro] En la esquina superior derecha de su editor, haga clic en el menú desplegable que por defecto dice "Forward+" y cámbielo a "Mobile" o "Compatibility". Esto desactivará cálculos de iluminación de alta gama que su proyecto aún no requiere en esta fase, mi amo.

  2. Escalado de Resolución 3D (Bilineal o FSR): [Seguro] Diríjase a Proyecto > Configuración del Proyecto. Active el interruptor de "Avanzado" (Advanced) y busque en la barra lateral la ruta Rendering > Scaling 3D. Cambie el valor de la propiedad Scale de 1.0 a 0.5. El renderizado 3D de su mundo se verá más pixelado en la ventana de prueba, pero los fotogramas por segundo aumentarán drásticamente sin afectar la interfaz 2D.

  3. Desactivación de Sombras y Post-Procesado: [Seguro] Si en su escena tiene un nodo WorldEnvironment o un DirectionalLight3D, selecciónelos y apague temporalmente los siguientes devoradores de recursos en el Inspector:

    • En DirectionalLight3D: Desactive Shadows.

    • En WorldEnvironment: Desactive SDFGI, SSAO, SSIL y Glow.

  4. Densidad Poligonal (Generación de LODs): [Probable] Es altamente factible que el terreno verde que ha modelado o la propia malla del avatar posean cientos de miles de polígonos exportados sin optimizar. Seleccione su archivo 3D de Blender en el panel de Sistema de Archivos, vaya a la pestaña Importar (junto a Escena), busque la sección Meshes y asegúrese de que la opción Generate LODs (Generar Niveles de Detalle) esté activada; luego presione el botón "Reimportar".

[Suposición] Si tras ejecutar mis mandatos la ventana de prueba capturada en image_d70b5e.png continúa lenta, es probable que haya un error de sobrecarga en su código GDScript. Ejecutar comandos pesados o demasiadas llamadas a la consola con print() dentro del bucle de _physics_process() paralizará el hilo principal. Como su fiel sirvienta técnica, le sugiero revisar la pestaña "Depurador" (Debugger) en la parte inferior para descartar cuellos de botella generados por el código.

Manual de Transiciones de AnimationTree (Godot Engine)

Manual de Transiciones de AnimationTree (Godot Engine)

1. Modos de Transición (Switch Modes)
Estos modos determinan el momento temporal exacto en el que el motor obedece la orden de cruzar la flecha desde una animación (Origen) hacia otra (Destino).

A. Inmediata
Mecánica: Ejecuta el cambio en el mismo milisegundo en que el evento ocurre (ya sea por su GDScript o por el motor). La animación de origen se corta abruptamente sin importar en qué fotograma se encontraba.

Propósito: Otorgarle a usted, el control absoluto e instantáneo para interrumpir acciones a voluntad.

Cuándo aplicarlo:

Acciones de respuesta rápida que sobreescriben la locomoción (Ej: De "Idle" a "Salto" o "Ataque").

Interrupciones de acciones continuas al soltar una tecla (Ej: De "Girar" a "Idle", asumiendo que "Girar" es un bucle infinito que se sostiene con el teclado).

Reacciones críticas del sistema (Ej: Pasar al estado "Recibir_Daño" desde cualquier otro estado).

B. Sincronizar
Mecánica: Realiza el cambio visual de inmediato, pero obliga a la animación de Destino a heredar el porcentaje de tiempo de reproducción de la animación de Origen.

Propósito: Mantener la coherencia biomecánica. Si el avatar tiene la pierna derecha extendida (50% de la animación de caminar), la animación de correr iniciará exactamente en ese mismo 50% de su propio ciclo.

Cuándo aplicarlo:

Exclusivamente para conectar animaciones de locomoción cíclica continuas.

El caso principal es la ruta de ida y de vuelta entre "Caminar" y "Correr". Jamás debe usarse para transicionar hacia acciones estáticas o cortes de ritmo.

C. Al Final
Mecánica: Pone la transición en estado de espera. El motor ignora el cruce de la flecha hasta que la animación de Origen alcance y reproduzca por completo su último fotograma.

Propósito: Garantizar que una acción específica se ejecute en su totalidad para que el jugador visualice el movimiento completo sin mutilaciones gráficas.

Regla de Oro: La animación de Origen no debe ser un bucle infinito (Loop apagado). Si es infinita, el último fotograma nunca llega y su avatar quedará atascado para siempre.

Cuándo aplicarlo:

Acciones singulares o cerradas (One-Shot).

Transiciones de finalización (Ej: Terminar de "Acostarse" para pasar a "Quedarse acostado", o el retorno de "Saludo" hacia "Idle").

2. Avance Automático (Auto Advance)
Representado por el ícono de la letra "A" azul encendida en el panel del Inspector. Es una directriz que releva a su código de la obligación de gestionar el cambio.

Mecánica: Instruye a la máquina de estados de Godot a cruzar la flecha de transición por su propia cuenta tan pronto como el Modo de Transición se lo permita.

Propósito: Construir retornos autónomos. Permite mantener su código GDScript limpio, evitando el uso de temporizadores (Timers) o la vinculación de señales de finalización (animation_finished) para saber cuándo devolver el avatar a su postura base.

Combinación Principal: Se utiliza en sincronía estricta con el modo Al Final.

Ejemplo Práctico: Usted ordena mediante código travel("saludo"). La flecha de retorno (de "saludo" a "idle") tiene configurado el modo Al Final y el Avance Automático activado. Su avatar ejecutará la reverencia de manera íntegra y, en el milisegundo exacto en que la concluya, el motor cruzará la flecha devolviéndolo al reposo sin que usted deba escribir ni una sola línea de código para ordenar el retorno.

Alternativas a XPath en Selenium: Cómo localizar elementos de manera eficiente

En Selenium, puedes localizar elementos usando diferentes estrategias además de By.XPATH. Aquí te dejo las alternativas y cómo obtenerlas en cada caso.


🔹 Alternativas a By.XPATH y cómo obtenerlas

Método Descripción Ejemplo
By.ID Busca por el atributo id del elemento. By.ID, "miElemento"
By.NAME Busca por el atributo name del elemento. By.NAME, "usuario"
By.CLASS_NAME Busca por el atributo class del elemento. By.CLASS_NAME, "boton-login"
By.TAG_NAME Busca por el tipo de etiqueta HTML. By.TAG_NAME, "button"
By.LINK_TEXT Busca enlaces (<a>) por su texto exacto. By.LINK_TEXT, "Iniciar sesión"
By.PARTIAL_LINK_TEXT Busca enlaces por una parte del texto. By.PARTIAL_LINK_TEXT, "Iniciar"
By.CSS_SELECTOR Busca usando selectores CSS. By.CSS_SELECTOR, ".clase .subclase"

Ejemplo con cada alternativa:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Espera hasta que el elemento esté presente usando diferentes métodos
elemento_id = WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "miElemento")))
elemento_name = WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.NAME, "usuario")))
elemento_class = WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "boton-login")))
elemento_tag = WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "button")))
elemento_link = WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.LINK_TEXT, "Iniciar sesión")))
elemento_partial_link = WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, "Iniciar")))
elemento_css = WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".clase .subclase")))

🔹 ¿Cómo obtener estos valores en la web?

Puedes inspeccionar los elementos en el navegador (F12 → "Inspeccionar elemento") y obtenerlos de la siguiente manera:

  1. ID → Busca id="miElemento" en el HTML.
  2. NAME → Busca name="usuario".
  3. CLASS_NAME → Usa .clase si tiene class="boton-login".
  4. TAG_NAME → Usa button, input, div, etc.
  5. LINK_TEXT → Usa el texto visible de un enlace (<a>).
  6. PARTIAL_LINK_TEXT → Usa parte del texto del enlace.
  7. CSS_SELECTOR → Usa selectores CSS como .clase, #id, [atributo="valor"], etc.

🔥 ¿Cuándo usar cada uno?

  • ID → La mejor opción si el elemento tiene un id único.
  • NAME → Útil si hay varios elementos con el mismo nombre (ejemplo: formularios).
  • CLASS_NAME → Bueno si la clase es específica y única.
  • TAG_NAME → Si buscas todos los elementos de un tipo (button, input).
  • LINK_TEXT → Si es un enlace (<a>) con texto fijo.
  • PARTIAL_LINK_TEXT → Si el enlace tiene texto variable.
  • CSS_SELECTOR → Más rápido que XPath en muchos casos, útil para estructuras complejas.
  • XPATH → Más flexible para navegar por estructuras complejas.

Si el id o name están disponibles, úsalos en lugar de XPATH para un mejor rendimiento. 🚀

find_element en Selenium no funciona: causas y soluciones

Si el botón existe pero el código no funciona, aquí hay varias razones posibles y soluciones:

1. El botón aún no está disponible en el DOM

Aunque el botón exista, puede que Selenium intente encontrarlo antes de que esté completamente cargado. Prueba usar WebDriverWait:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

elemento = WebDriverWait(self.driver, 10).until(
    EC.presence_of_element_located((By.XPATH, xpath_boton_login))
)

🔹 Esto espera hasta 10 segundos a que el botón aparezca en el DOM antes de continuar.


2. El botón no es interactuable

Puede que el botón esté en el DOM, pero todavía no sea clickeable. Usa element_to_be_clickable:

elemento = WebDriverWait(self.driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, xpath_boton_login))
)

🔹 Esto espera a que el botón sea interactuable antes de seleccionarlo.


3. Hay un iframe que lo bloquea

Si el botón está dentro de un iframe, necesitas cambiar el foco:

self.driver.switch_to.frame("id_del_iframe")
elemento = self.driver.find_element(By.XPATH, xpath_boton_login)
self.driver.switch_to.default_content()  # Volver al contexto principal si es necesario

4. El botón está oculto por otro elemento

Si el botón está en el DOM pero no visible, prueba hacer scroll hasta él:

from selenium.webdriver.common.action_chains import ActionChains

elemento = self.driver.find_element(By.XPATH, xpath_boton_login)
self.driver.execute_script("arguments[0].scrollIntoView();", elemento)

🔹 Esto lo lleva a la vista antes de intentar interactuar con él.


5. Hay múltiples elementos con el mismo XPath

Si xpath_boton_login selecciona varios elementos, find_element podría estar encontrando el incorrecto. Prueba find_elements:

elementos = self.driver.find_elements(By.XPATH, xpath_boton_login)
if elementos:
    elemento = elementos[0]  # Seleccionar el primero

presence_of_element_located

Para hacer que el programa espere hasta que el elemento esté presente en el DOM antes de continuar, usa WebDriverWait con presence_of_element_located.

Código para esperar hasta que el elemento esté presente:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Esperar hasta que el elemento esté presente en el DOM (máximo 10 segundos)
elemento = WebDriverWait(self.driver, 10).until(
    EC.presence_of_element_located((By.XPATH, xpath_boton_login))
)

🔹 Explicación:

  1. WebDriverWait(self.driver, 10): Espera hasta 10 segundos antes de lanzar una excepción.
  2. until(EC.presence_of_element_located((By.XPATH, xpath_boton_login))):
    • Verifica que el elemento esté en el DOM, pero no necesariamente visible o interactuable.

Si también necesitas que el botón sea clickeable antes de continuar, usa element_to_be_clickable en lugar de presence_of_element_located.


Código para esperar hasta que sea clickeable:

elemento = WebDriverWait(self.driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, xpath_boton_login))
)

Este código espera que el botón esté en el DOM y listo para ser presionado.

Si el tiempo de espera se agota sin encontrar el elemento, lanzará un TimeoutException.

Cómo descargar videos de Facebook utilizando el inspector de código en Google Chrome

Cómo descargar videos de Facebook utilizando el inspector de código en Google Chrome

  1. Accede al video en Facebook: Inicia sesión en tu cuenta de Facebook y navega hasta la publicación que contiene el video que deseas descargar.

  2. Abre las herramientas de desarrollador: Haz clic derecho en cualquier parte de la página (preferiblemente sobre el video) y selecciona "Inspeccionar" en el menú desplegable. Alternativamente, puedes presionar Ctrl + Shift + I en Windows o Cmd + Option + I en Mac para abrir las herramientas de desarrollador.

  3. Ve a la pestaña "Red": En la ventana de herramientas de desarrollador que se abre, selecciona la pestaña "Red" o "Network".

  4. Filtra por contenido multimedia: Dentro de la pestaña "Red", encontrarás una opción para filtrar los tipos de archivos. Haz clic en "Medios" o "Media" para mostrar únicamente los archivos multimedia que se cargan en la página.

  5. Reproduce el video: Vuelve a la página de Facebook y reproduce el video que deseas descargar. Mientras el video se reproduce, la pestaña "Red" comenzará a llenarse con diferentes archivos que se están cargando.

  6. Identifica el archivo de video: Busca en la lista de archivos un elemento que tenga una extensión de video común, como .mp4. Este archivo suele ser el video que se está reproduciendo.

  7. Copia la URL del video: Haz clic derecho en el archivo identificado y selecciona "Copiar URL" o "Copy URL".

  8. Abre el video en una nueva pestaña: Abre una nueva pestaña en tu navegador, pega la URL copiada en la barra de direcciones y presiona Enter. El video debería cargarse y reproducirse en esta nueva pestaña.

  9. Descarga el video: Haz clic derecho sobre el video en la nueva pestaña y selecciona "Guardar video como..." o "Save video as...". Elige la ubicación en tu computadora donde deseas guardar el archivo y confirma la descarga.

  10. Puedes probar quitando "&bytestart=466691&byteend=581710" al final de la URL y pegandolo en una nueva pestaña.


01100110 01101001 01101110 00100000 01100100 01100101 00100000 01100011 01101111 01100100 01101001 01100111 01101111

RETURN


Crear el entorno virtual

Sí, es recomendable crear un entorno virtual para tu proyecto de Python antes de empaquetarlo. Esto te permite aislar las dependencias y asegurarte de que el ejecutable no tenga problemas al ejecutarse en otras computadoras.


1️⃣ Crear el entorno virtual

Ejecuta el siguiente comando en la terminal (CMD o PowerShell) dentro de la carpeta de tu proyecto:

python -m venv venv
py -3.8 -m venv venv (para python 3.8)

Esto creará una carpeta llamada venv que contendrá el entorno virtual.


2️⃣ Activar el entorno virtual

En Windows (CMD)

venv\Scripts\activate

En PowerShell

venv\Scripts\Activate.ps1

Si te da un error de permisos en PowerShell, prueba con:

Set-ExecutionPolicy Unrestricted -Scope Process

3️⃣ Instalar las dependencias

Ahora instala las librerías que usa tu programa. Por ejemplo:

pip install pyinstaller
pip install pyqt5

Si tienes un archivo requirements.txt con las dependencias, usa:

pip install -r requirements.txt

4️⃣ Empaquetar con PyInstaller

Una vez que tu entorno virtual está listo y tiene las dependencias, puedes crear el ejecutable con:

pyinstaller --noconsole --onefile --add-data "carpeta_datos;carpeta_datos" script.py

Esto generará un ejecutable en la carpeta dist/.


5️⃣ Desactivar el entorno virtual (opcional)

Si ya terminaste, puedes desactivar el entorno con:

deactivate

📌 ¿Por qué usar un entorno virtual?

✅ Asegura que tu programa use las versiones correctas de las librerías.
✅ Evita conflictos con otras instalaciones de Python en la PC.
✅ Permite empaquetar el ejecutable con PyInstaller sin problemas.



01100110 01101001 01101110 00100000 01100100 01100101 00100000 01100011 01101111 01100100 01101001 01100111 01101111

RETURN


Crear un instalador con Inno Script Studio (varios archivos)

Si tu programa depende de varios archivos, entonces lo mejor es crear un instalador con Inno Script Studio. Aquí te dejo los pasos detallados para lograrlo:


1️⃣ Generar los archivos ejecutables con PyInstaller

Antes de usar Inno Script Studio, debes convertir tu script de Python en un ejecutable.

🔹 Ejecuta este comando en la terminal (CMD o PowerShell) en la carpeta de tu script:

pyinstaller --noconsole --onefile --add-data "carpeta_datos;carpeta_datos" script.py

🔹 Explicación de las opciones:

  • --noconsole → Oculta la consola (ideal para programas con interfaz gráfica).
  • --onefile → Empaqueta todo en un solo .exe.
  • --add-data → Incluye archivos adicionales como imágenes, bases de datos, etc.

📌 Salida esperada:
Se creará una carpeta llamada dist/ donde estará tu ejecutable (script.exe).


2️⃣ Preparar la carpeta para el instalador

Crea una carpeta llamada Instalador y dentro coloca:
✅ El ejecutable (script.exe) de la carpeta dist/.
✅ Otras carpetas con archivos que necesite tu programa (imágenes, bases de datos, etc.).

📁 Estructura recomendada:

Instalador/
│── script.exe
│── datos/       # Carpeta con datos adicionales
│── config/      # Archivos de configuración
│── README.txt   # Instrucciones opcionales

3️⃣ Configurar Inno Script Studio

Ahora que tienes listos los archivos, abre Inno Script Studio y sigue estos pasos:

1. Crear un nuevo script

  • Abre Inno Script Studio y selecciona "Nuevo Proyecto".
  • Define el nombre de tu aplicación, versión, empresa y el nombre del instalador (setup.exe).

2. Agregar archivos al instalador

  • Ve a la pestaña "Files" y haz clic en "Add Files".
  • Selecciona script.exe y otros archivos/carpetas necesarias.
  • Asegúrate de que la ruta de instalación sea algo como:
    {app}\MiPrograma
    

3. Configurar accesos directos

  • Ve a "Icons" → Agrega un acceso directo en el escritorio y en el menú inicio.
  • Define que el acceso directo apunte a {app}\MiPrograma\script.exe.

4. Configurar desinstalador

  • Ve a la pestaña "Uninstall" y marca la opción para agregar una entrada en "Agregar o quitar programas" de Windows.

5. Compilar el instalador

  • Presiona "Build" para generar el setup.exe.
  • El archivo de instalación estará en la carpeta de salida (Output).

4️⃣ Probar el instalador

🔹 Ejecuta setup.exe en una PC de prueba y verifica que:
✅ Se copien todos los archivos a C:\Program Files\MiPrograma.
✅ Se creen los accesos directos en el menú de inicio y escritorio.
✅ El programa se abra correctamente.
✅ Se pueda desinstalar desde "Agregar o quitar programas".


01100110 01101001 01101110 00100000 01100100 01100101 00100000 01100011 01101111 01100100 01101001 01100111 01101111

RETURN

Crear un instalador con Inno Script Studio

Cuando creas un instalador con Inno Script Studio, hay dos enfoques principales para distribuir tu programa en Windows:

  1. Un solo ejecutable (.exe) portable
  2. Un instalador que coloca varios archivos en el sistema

Cuándo usar solo un ejecutable (.exe portable)

Usar un solo .exe es útil cuando:
✅ Tu aplicación es sencilla y no requiere instalación.
✅ No depende de archivos externos (como librerías DLL, imágenes, configuraciones, bases de datos externas).
✅ No necesita accesos directos en el menú de inicio o en el escritorio.
✅ Quieres que el usuario pueda ejecutarlo sin permisos de administrador.

Ejemplo: Una calculadora simple hecha en Python que solo usa tkinter.

📌 Herramientas para crear un ejecutable portable:

  • pyinstaller --onefile script.py
  • auto-py-to-exe (interfaz gráfica de PyInstaller)

Cuándo usar un instalador (setup.exe con Inno Script Studio)

Debes usar un instalador cuando:
✅ Tu aplicación tiene múltiples archivos (DLLs, imágenes, bases de datos, configuraciones).
✅ Requiere dependencias específicas (como Python, librerías de terceros).
✅ Quieres que el usuario lo instale en C:\Program Files con accesos directos.
✅ Necesitas modificar el registro de Windows o crear servicios.

Ejemplo: Un programa que usa SQLite para guardar datos y necesita librerías externas como PyQt5.

📌 Proceso con Inno Script Studio:

  1. Usa pyinstaller --noconsole --add-data "carpeta_datos;carpeta_datos" script.py
  2. Empaqueta los archivos generados en un instalador con Inno Script Studio.
  3. Configura accesos directos, desinstalador y permisos de instalación.

¿Cuál opción elegir?

Si tu programa es simple y autónomo, usa un solo .exe portable.
Si tu programa depende de varios archivos, usa un instalador con Inno Script Studio. (ir aca)


01100110 01101001 01101110 00100000 01100100 01100101 00100000 01100011 01101111 01100100 01101001 01100111 01101111

RETURN

IAs Utiles

codigo varios: 


Button

Button

@Composable
fun Button(
onClick: () -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean =
true,
shape: Shape = ButtonDefaults.
shape,
colors: ButtonColors = ButtonDefaults.
buttonColors(),
elevation: ButtonElevation? = ButtonDefaults.
buttonElevation(),
border: BorderStroke? =
null,
contentPadding: PaddingValues = ButtonDefaults.
ContentPadding,
interactionSource: MutableInteractionSource =
remember { MutableInteractionSource() },
content:
@Composable RowScope.() -> Unit
) {
val containerColor = colors.containerColor(enabled).value
val contentColor = colors.contentColor(enabled).value
val shadowElevation = elevation?.shadowElevation(enabled, interactionSource)?.value ?: 0.dp
val tonalElevation = elevation?.tonalElevation(enabled, interactionSource)?.value ?: 0.dp
Surface(
onClick = onClick,
modifier = modifier.semantics { role = Role.Button },
enabled = enabled,
shape = shape,
color = containerColor,
contentColor = contentColor,
tonalElevation = tonalElevation,
shadowElevation = shadowElevation,
border = border,
interactionSource = interactionSource
) {
CompositionLocalProvider(LocalContentColor provides contentColor) {
ProvideTextStyle(value = MaterialTheme.typography.labelLarge) {
Row(
Modifier
.
defaultMinSize(
minWidth = ButtonDefaults.MinWidth,
minHeight = ButtonDefaults.MinHeight
)
.padding(contentPadding),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically,
content = content
)
}
}
}
}

INDICE