Estoy creando un concepto de desarrollo de videojuegos, el cual el proposito es que sea jugable en cualquier sistema operativo sin necesitar crear ports, sino que el mismo archivo se pueda jugar el juego, esto usando las tecnologias de desarrollo con html5 y archivos de shell de linux y de windows, ademas de hacer uso del navegador predeterminado para funcionar, y gracias a eso, los juegos pueden terminar siendo software de codigo abierto, además de mas pequeños.
Los archivos que estoy usando es un archivo en formato .sh, uno en formato .bat, y estos dos archivos junto a una carpeta donde está el archivo .html del juego, junto el resto de los archivos del juego.
Para quienes no lo sepan que hace un shell (eso lo digo porque yo no soy programador, y por lo mismo, en otros casos yo no sabría que es ni que hace, asi que use la ia para saber de esto XD), lo que tengo entendido que hace es seguir una seríe de ordenes que comunmente haría usando la terminal.
Para el archivo .sh (el cual servirá para ser jugado en linux) estoy usando el siguiente codigo:
#!/bin/bash
1. Obtiene la ruta absoluta de la carpeta donde está este script
DIR=“$( cd “$( dirname “${BASH_SOURCE[0]}” )” && pwd )”
cd “$DIR”2. BÚSQUEDA DINÁMICA DEL JUEGO
Buscamos el archivo index.html dentro de las subcarpetas (hasta 3 niveles de profundidad)
INDEX_PATH=$(find . -maxdepth 3 -name “index.html” -print -quit)
Si no encontramos ningún index.html, avisamos al usuario y cerramos
if [ -z “$INDEX_PATH” ]; then
echo “Error: No se encontró el archivo index.html en ninguna subcarpeta.”
exit 1
fiObtenemos la ruta de la carpeta exacta que contiene el index.html
CARPETA_DEL_JUEGO=$(dirname “$INDEX_PATH”)
Nos movemos a esa carpeta para que el servidor de Python se ejecute ahí dentro
cd “$CARPETA_DEL_JUEGO”
3. Levanta el servidor web ultra ligero en el puerto 8000
python3 -m http.server 8000 &
SERVER_PID=$! # Guarda el ID del proceso del servidorEspera medio segundo para asegurarse de que el servidor local ya arrancó
sleep 0.5
Dirección local del juego
URL=“http://localhost:8000/index.html”
PARÁMETRO CLAVE:
Usamos un perfil temporal en la carpeta del script para que no se fusione con otras ventanas
PARAMETROS_JUEGO=“–app=$URL --start-maximized --user-data-dir=$DIR/.perfil_juego --test-type”
4. Detecta el navegador predeterminado del sistema y arranca el juego
BROWSER=$(xdg-settings get default-web-browser | tr ‘[:upper:]’ ‘[:lower:]’)
if [[ “$BROWSER” == “edge” ]] || command -v microsoft-edge &> /dev/null; then
microsoft-edge $PARAMETROS_JUEGOelif command -v google-chrome &> /dev/null; then
google-chrome $PARAMETROS_JUEGOelif command -v chromium-browser &> /dev/null; then
chromium-browser $PARAMETROS_JUEGOelif command -v chromium &> /dev/null; then
chromium $PARAMETROS_JUEGOelif command -v brave-browser &> /dev/null; then
brave-browser $PARAMETROS_JUEGOCaso de respaldo si el usuario solo tiene Firefox
else
firefox --new-window “$URL”
fi5. Monitoreo: El script se queda pausado mientras juegas.
Al cerrar la ventana, continúa hacia abajo.
kill $SERVER_PID
6. Limpieza: Borra la carpeta temporal del perfil
rm -rf “$DIR/.perfil_juego”
Nota: el usuario tiene que marcar el archivo para que pueda ejecutarse como programa, en teoria uno mismo puede dejar el permiso activado, pero no sabria si se desactivaria al viajar por internet.
Para el archivo .bat, estoy usando este codigo:
@echo off
:: Configura la consola para usar codificación UTF-8
chcp 65001 > nul:: 1. Obtiene la ruta absoluta de la carpeta donde está este script .bat
set “DIR=%~dp0”
cd /d “%DIR%”echo Buscando el archivo index.html en las subcarpetas…
:: 2. BÚSQUEDA DINÁMICA CLÁSICA (Ultra-compatible)
:: Busca en toda la estructura de carpetas el archivo index.html de forma nativa
set “INDEX_PATH=”
for /r %%i in (index.html) do (
if exist “%%i” (
set “INDEX_PATH=%%i”
goto :encontrado
)
):encontrado
if “%INDEX_PATH%”==“” (
echo [ERROR] No se pudo encontrar el archivo index.html en ninguna subcarpeta.
pause
exit /b
):: Obtiene la carpeta exacta que contiene el archivo index.html
for %%f in (“%INDEX_PATH%”) do set “CARPETA_DEL_JUEGO=%%~dpf”:: 3. LEVANTAR SERVIDOR WEB LOCAL CON POWERSHELL (Compatible con todas las versiones)
echo Iniciando servidor local en el puerto 8000…
start /b powershell -NoProfile -Command ^
“$listener = New-Object System.Net.HttpListener; ^
$listener.Prefixes.Add(‘http://localhost:8000/’); ^
$listener.Start(); ^
while ($listener.IsListening) { ^
try { ^
$context = $listener.GetContext(); ^
$req = $context.Request; ^
$res = $context.Response; ^
$localPath = Join-Path ‘%CARPETA_DEL_JUEGO:=\%’ $req.Url.LocalPath.TrimStart(‘/’); ^
if (Test-Path $localPath -PathType Leaf) { ^
$bytes = [System.IO.File]::ReadAllBytes($localPath); ^
$res.OutputStream.Write($bytes, 0, $bytes.Length); ^
} else { ^
$res.StatusCode = 404; ^
} ^
$res.Close(); ^
} catch { break } ^
}”:: Espera un segundo para que el servidor local esté listo
timeout /t 1 /nobreak > nul:: 4. CONFIGURAR PARÁMETROS DE EDGE
set “URL=http://localhost:8000/index.html”
set “PERFIL_TEMPORAL=%DIR%.perfil_juego”:: 5. LANZAR MICROSOFT EDGE EN MODO APP
echo Lanzando el juego…
start /wait msedge.exe --app=“%URL%” --start-maximized --user-data-dir=“%PERFIL_TEMPORAL%” --test-type:: 6. LIMPIEZA AL CERRAR
echo Cerrando el servidor local y limpiando archivos temporales…:: Detiene el servidor web buscando su proceso en segundo plano
powershell -NoProfile -Command “Get-Process | Where-Object { $_.CommandLine -like ‘System.Net.HttpListener’ } | Stop-Process -Force” 2>nul:: Borra la carpeta temporal creada para el perfil de Edge
if exist “%PERFIL_TEMPORAL%” rmdir /s /q “%PERFIL_TEMPORAL%”exit
Nota: aun no puedo asegurar que funciona este codigo, ya que como mencioné, no sé programar, y actualmente no tengo ninguna computadora que use windows, solo he podido dar certeza que funciona el archivo .sh en linux.
Si quieren ver un ejemplo de como puede funcionar, pueden descargar este ejemplo, el cual viene con un prototipo de un juego que estoy desarrollando:
