Proyecto de juego universal (el mp3 de los videojuegos)

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
fi

Obtenemos 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 servidor

Espera 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_JUEGO

elif command -v google-chrome &> /dev/null; then
google-chrome $PARAMETROS_JUEGO

elif command -v chromium-browser &> /dev/null; then
chromium-browser $PARAMETROS_JUEGO

elif command -v chromium &> /dev/null; then
chromium $PARAMETROS_JUEGO

elif command -v brave-browser &> /dev/null; then
brave-browser $PARAMETROS_JUEGO

Caso de respaldo si el usuario solo tiene Firefox

else
firefox --new-window “$URL”
fi

5. 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:

Descargar

5 Me gusta

Modificando un poco el script lo logre correr en OpenBSD ; No pos ta divertido el jueguito xd buen trabajo supongo

3 Me gusta

Podrías usar algún lenguaje que sea independiente de la arquitectura como Python, Ruby y esas cosas.

Ya voy a probar tu juego. Me recuerda al juego de la prueba final en Ready Player One.