216 lines
7.6 KiB
HTML
216 lines
7.6 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en-us">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover">
|
||
<title>Space Game</title>
|
||
<style>
|
||
body, html {
|
||
margin: 0; padding: 0; width: 100%; height: 100%;
|
||
overflow: hidden; background-color: #000;
|
||
position: fixed;
|
||
}
|
||
#canvas {
|
||
display: block;
|
||
position: absolute;
|
||
top: 0; left: 0;
|
||
width: 100vw; height: 100vh;
|
||
border: none;
|
||
}
|
||
|
||
#fs-button {
|
||
position: absolute;
|
||
top: 10px; right: 10px;
|
||
padding: 10px;
|
||
z-index: 10;
|
||
background: rgba(255,255,255,0.3);
|
||
color: white; border: 1px solid white;
|
||
cursor: pointer;
|
||
font-family: sans-serif;
|
||
border-radius: 5px;
|
||
}
|
||
#status { color: white; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); }
|
||
|
||
/* Nick modal */
|
||
#nickOverlay {
|
||
position: absolute;
|
||
inset: 0;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
background: rgba(0,0,0,0.85);
|
||
z-index: 9999;
|
||
}
|
||
#nickBox {
|
||
background: #111;
|
||
border: 1px solid #444;
|
||
padding: 24px;
|
||
width: 320px;
|
||
box-shadow: 0 8px 24px rgba(0,0,0,0.6);
|
||
text-align: center;
|
||
}
|
||
#nickBox h2 { margin: 0 0 12px 0; font-size: 18px; color: #eee; }
|
||
#nickBox input[type="text"] {
|
||
width: 100%;
|
||
padding: 10px;
|
||
font-size: 16px;
|
||
box-sizing: border-box;
|
||
margin-bottom: 12px;
|
||
border: 1px solid #333;
|
||
background: #000;
|
||
color: #fff;
|
||
}
|
||
#nickBox button {
|
||
padding: 10px 16px;
|
||
font-size: 16px;
|
||
background: #2a9fd6;
|
||
border: none;
|
||
color: #fff;
|
||
cursor: pointer;
|
||
}
|
||
#nickSkip { margin-left: 8px; background: #666; }
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<button id="fs-button">Fullscreen</button>
|
||
<div id="status">Downloading...</div>
|
||
<canvas id="canvas" oncontextmenu="event.preventDefault()" tabindex="-1"></canvas>
|
||
<!--
|
||
<script>
|
||
var statusElement = document.getElementById("status");
|
||
var canvas = document.getElementById("canvas");
|
||
|
||
var Module = {
|
||
canvas: canvas,
|
||
setStatus: function(text) {
|
||
statusElement.innerHTML = text;
|
||
statusElement.style.display = text ? 'block' : 'none';
|
||
}
|
||
};
|
||
|
||
document.getElementById('fs-button').addEventListener('click', function() {
|
||
if (!document.fullscreenElement) {
|
||
document.documentElement.requestFullscreen().catch(e => {
|
||
console.error(`Error attempting to enable full-screen mode: ${e.message}`);
|
||
});
|
||
} else {
|
||
document.exitFullscreen();
|
||
}
|
||
});
|
||
|
||
window.addEventListener("orientationchange", function() {
|
||
setTimeout(() => {
|
||
window.dispatchEvent(new Event('resize'));
|
||
}, 200);
|
||
});
|
||
|
||
</script>
|
||
<script async src="space-game001.js"></script>-->
|
||
|
||
<div id="nickOverlay" style="display:none;">
|
||
<div id="nickBox">
|
||
<h2>Enter your nickname</h2>
|
||
<input id="nickInput" type="text" maxlength="32" placeholder="Player" />
|
||
<div>
|
||
<button id="nickSubmit">Start</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<script>
|
||
// Utility: подготовить глобальный Module до загрузки Emscripten-скрипта
|
||
function prepareModuleEnvironment() {
|
||
window.Module = window.Module || {};
|
||
var canvasEl = document.getElementById('canvas');
|
||
// Устанавливаем canvas для Emscripten, чтобы createContext не падал
|
||
window.Module.canvas = canvasEl;
|
||
// Подготовим заглушку setStatus, если ещё нет
|
||
window.Module.setStatus = window.Module.setStatus || function (text) {
|
||
var statusElement = document.getElementById("status");
|
||
statusElement.innerHTML = text;
|
||
statusElement.style.display = text ? 'block' : 'none';
|
||
};
|
||
}
|
||
|
||
// Show overlay only if no nickname saved.
|
||
function loadGameScript() {
|
||
var s = document.createElement('script');
|
||
s.src = 'space-game001.js';
|
||
s.async = true;
|
||
document.body.appendChild(s);
|
||
}
|
||
|
||
function showNickOverlay() {
|
||
var overlay = document.getElementById('nickOverlay');
|
||
overlay.style.display = 'flex';
|
||
var input = document.getElementById('nickInput');
|
||
input.focus();
|
||
}
|
||
|
||
function hideNickOverlay() {
|
||
var overlay = document.getElementById('nickOverlay');
|
||
overlay.style.display = 'none';
|
||
}
|
||
|
||
function saveNickAndStart(nick) {
|
||
try {
|
||
if (!nick || nick.trim() === '') nick = 'Player';
|
||
localStorage.setItem('spacegame_nick', nick);
|
||
} catch (e) {
|
||
console.warn('localStorage not available', e);
|
||
}
|
||
hideNickOverlay();
|
||
// перед загрузкой скрипта гарантируем, что Module.canvas задан
|
||
prepareModuleEnvironment();
|
||
loadGameScript();
|
||
}
|
||
|
||
document.addEventListener('DOMContentLoaded', function() {
|
||
// Готовим Module сразу — даже если откроется модалка, поле canvas будет доступно для скрипта (если он загружается позже)
|
||
prepareModuleEnvironment();
|
||
|
||
var stored = null;
|
||
try {
|
||
stored = localStorage.getItem('spacegame_nick');
|
||
} catch (e) {
|
||
console.warn('localStorage not available', e);
|
||
}
|
||
|
||
if (stored && stored.trim() !== '') {
|
||
// Nick is present — start immediately
|
||
loadGameScript();
|
||
} else {
|
||
// Show modal to request nickname before loading WASM
|
||
showNickOverlay();
|
||
var submit = document.getElementById('nickSubmit');
|
||
var skip = document.getElementById('nickSkip');
|
||
var input = document.getElementById('nickInput');
|
||
|
||
submit.addEventListener('click', function() {
|
||
saveNickAndStart(input.value);
|
||
});
|
||
skip.addEventListener('click', function() {
|
||
saveNickAndStart('Player');
|
||
});
|
||
|
||
input.addEventListener('keydown', function(e) {
|
||
if (e.key === 'Enter') {
|
||
saveNickAndStart(input.value);
|
||
}
|
||
});
|
||
}
|
||
});
|
||
|
||
window.addEventListener("orientationchange", function() {
|
||
// Chrome на Android обновляет innerWidth/Height не мгновенно.
|
||
// Ждем завершения анимации поворота.
|
||
setTimeout(() => {
|
||
// В Emscripten это вызовет ваш onWindowResized в C++
|
||
window.dispatchEvent(new Event('resize'));
|
||
}, 200);
|
||
});
|
||
|
||
</script>
|
||
|
||
</body>
|
||
</html> |