2036 战舰图鉴 - 模块化展示
by ApexFalcon66355 lines13.5 KB
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>2036 战舰图鉴 - 模块化展示</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
html, body { width: 100%; height: 100%; overflow: hidden; background: #0a0e17; font-family: system-ui, sans-serif; -webkit-user-select: none; user-select: none; }
/* 拖拽与缩放容器 */
.viewport { position: fixed; inset: 0; overflow: hidden; cursor: grab; touch-action: none; }
.viewport.grabbing { cursor: grabbing; }
.scene {
position: absolute; left: 50%; top: 50%; width: 2000px; height: 1200px;
margin-left: -1000px; margin-top: -600px; transform-origin: 50% 50%;
will-change: transform;
/* 科技感网格背景 */
background-image:
linear-gradient(rgba(80, 150, 255, 0.05) 1px, transparent 1px),
linear-gradient(90deg, rgba(80, 150, 255, 0.05) 1px, transparent 1px);
background-size: 50px 50px;
background-position: center center;
}
/* 战舰展示容器 */
.ship-display {
position: absolute;
width: 400px; height: 400px;
/* 居中摆放 */
left: 50%; top: 50%;
margin-left: -200px; margin-top: -200px;
transform-origin: 50% 50%;
}
/* 三艘舰的位置分布 */
#disp-assault { transform: translate(-600px, 0); }
#disp-laser { transform: translate(0, 0); }
#disp-supply { transform: translate(600px, 0); }
/* 战舰本体,用来应用旋转 */
.ship-body {
position: absolute; left: 50%; top: 50%; width: 0; height: 0;
transform: rotate(0deg);
}
/* 模块基础样式 */
.mod { position: absolute; border-radius: 2px; box-shadow: 0 4px 12px rgba(0,0,0,0.6); }
/* 蓝方涂装 */
.theme-blue {
--hull1: #ffffff; --hull2: #dfe8f2; --hull3: #b8c6d6;
--panelA: #1d4d86; --panelB: #2b6cb5; --accent: #4a90d9;
--glow: rgba(120,200,255,0.5);
}
.mod-body {
background: linear-gradient(180deg, var(--hull1) 0%, var(--hull2) 50%, var(--hull3) 100%);
border: 1px solid rgba(140,160,180,0.8);
z-index: 2;
}
.mod-panel {
background: repeating-linear-gradient(0deg, var(--panelA) 0px, var(--panelA) 6px, var(--panelB) 6px, var(--panelB) 8px);
border: 1px solid var(--accent);
box-shadow: 0 0 10px var(--glow);
z-index: 1;
}
.mod-radar {
background: linear-gradient(180deg, #445, #223);
border: 1px solid #66a;
box-shadow: inset 0 0 10px rgba(100,150,255,0.8);
z-index: 3;
}
.mod-heat {
background: repeating-linear-gradient(90deg, #a44 0px, #a44 4px, #f88 4px, #f88 6px);
border: 1px solid #f66;
box-shadow: 0 0 8px #f44;
z-index: 1;
}
/* 武器与炮塔 */
.weapon-rail {
background: linear-gradient(180deg, #fff, #7fdcff, #2b6cb5);
border: 1px solid #aee;
box-shadow: 0 0 10px #7fdcff;
z-index: 4;
}
.weapon-laser {
background: linear-gradient(180deg, #fff, #ff4444, #880000);
border: 1px solid #faa;
box-shadow: 0 0 15px #f00;
z-index: 4;
}
.weapon-missile {
background: #333;
border: 1px dashed #f90;
z-index: 3;
}
.weapon-ciws {
background: #888;
border: 1px solid #ccc;
border-radius: 50%;
z-index: 4;
}
/* 对接口 */
.port {
background: #223;
border: 2px solid #4af;
box-shadow: 0 0 8px #4af inset;
border-radius: 3px;
z-index: 3;
}
/* 标签文字 */
.label {
position: absolute;
color: #8cf;
font-size: 11px;
letter-spacing: 1px;
white-space: nowrap;
pointer-events: none;
z-index: 10;
text-shadow: 1px 1px 2px #000, 0 0 4px #000;
}
/* 标题 */
.title {
position: absolute;
top: -180px;
left: 50%;
transform: translateX(-50%);
font-size: 24px;
font-weight: bold;
color: #fff;
letter-spacing: 4px;
text-shadow: 0 0 10px #4af;
pointer-events: none;
}
.subtitle {
position: absolute;
top: -140px;
left: 50%;
transform: translateX(-50%);
font-size: 12px;
color: #7aa;
letter-spacing: 2px;
pointer-events: none;
}
</style>
</head>
<body>
<div class="viewport" id="viewport">
<div class="scene" id="scene">
<!-- ================= 1. 突击舰 ================= -->
<div class="ship-display" id="disp-assault">
<div class="title">突 击 舰</div>
<div class="subtitle">Assault Ship</div>
<div class="ship-body theme-blue">
<!-- 太阳能板 x4 -->
<div class="mod mod-panel" style="left:-10px; top:-65px; width:30px; height:15px;"></div>
<div class="mod mod-panel" style="left:-10px; top:50px; width:30px; height:15px;"></div>
<div class="mod mod-panel" style="left:40px; top:-65px; width:30px; height:15px;"></div>
<div class="mod mod-panel" style="left:40px; top:50px; width:30px; height:15px;"></div>
<!-- 散热板 x2 -->
<div class="mod mod-heat" style="left:-30px; top:-40px; width:15px; height:15px; transform: rotate(-45deg);"></div>
<div class="mod mod-heat" style="left:-30px; top:25px; width:15px; height:15px; transform: rotate(45deg);"></div>
<!-- 舱段 -->
<div class="mod mod-body" style="left:-50px; top:-15px; width:40px; height:30px;"></div> <!-- 前部武器舱 -->
<div class="mod mod-body" style="left:-10px; top:-20px; width:50px; height:40px;"></div> <!-- 核心舱 -->
<div class="mod mod-radar" style="left:40px; top:-15px; width:20px; height:30px;"></div> <!-- 电子舱 -->
<div class="mod mod-body" style="left:60px; top:-10px; width:30px; height:20px;"></div> <!-- 动力舱 -->
<!-- 武器 -->
<!-- 电磁炮 x2 -->
<div class="mod weapon-rail" style="left:-90px; top:-10px; width:50px; height:6px;"></div>
<div class="mod weapon-rail" style="left:-90px; top:4px; width:50px; height:6px;"></div>
<!-- 导弹阵列 -->
<div class="mod weapon-missile" style="left:-5px; top:-15px; width:20px; height:30px;"></div>
<div class="mod weapon-missile" style="left:20px; top:-15px; width:20px; height:30px;"></div>
<!-- 近防炮 -->
<div class="mod weapon-ciws" style="left:30px; top:-30px; width:8px; height:8px;"></div>
<div class="mod weapon-ciws" style="left:30px; top:22px; width:8px; height:8px;"></div>
<!-- 标注 -->
<div class="label" style="left:-100px; top:-35px;">电磁炮</div>
<div class="label" style="left:-15px; top:-40px;">导弹单元</div>
<div class="label" style="left:30px; top:40px;">电子舱 (大雷达)</div>
<div class="label" style="left:70px; top:-30px;">动力舱</div>
<div class="label" style="left:-10px; top:65px;">太阳能板 & 散热板</div>
</div>
</div>
<!-- ================= 2. 激光舰 ================= -->
<div class="ship-display" id="disp-laser">
<div class="title">激 光 舰</div>
<div class="subtitle">Laser Ship</div>
<div class="ship-body theme-blue" style="transform: rotate(0deg);">
<!-- 太阳能板 x2 -->
<div class="mod mod-panel" style="left:20px; top:-55px; width:40px; height:15px;"></div>
<div class="mod mod-panel" style="left:20px; top:40px; width:40px; height:15px;"></div>
<!-- 散热板 x2 -->
<div class="mod mod-heat" style="left:70px; top:-35px; width:15px; height:15px; transform: rotate(-45deg);"></div>
<div class="mod mod-heat" style="left:70px; top:20px; width:15px; height:15px; transform: rotate(45deg);"></div>
<!-- 舱段 -->
<div class="mod mod-body" style="left:-30px; top:-20px; width:40px; height:40px;"></div> <!-- 武器舱 -->
<div class="mod mod-body" style="left:10px; top:-25px; width:40px; height:50px;"></div> <!-- 核心舱 -->
<div class="mod mod-body" style="left:50px; top:-15px; width:30px; height:30px;"></div> <!-- 生活舱 -->
<div class="mod mod-body" style="left:80px; top:-10px; width:20px; height:20px;"></div> <!-- 动力舱 -->
<!-- 武器 -->
<!-- 巨型舰艏激光炮 -->
<div class="mod weapon-laser" style="left:-90px; top:-6px; width:60px; height:12px;"></div>
<div class="mod mod-body" style="left:-40px; top:-12px; width:15px; height:24px; z-index:5;"></div> <!-- 炮座 -->
<!-- 4门点射激光炮 -->
<div class="mod weapon-ciws" style="left:0px; top:-30px; width:8px; height:8px; background:#f44;"></div>
<div class="mod weapon-ciws" style="left:0px; top:22px; width:8px; height:8px; background:#f44;"></div>
<div class="mod weapon-ciws" style="left:30px; top:-30px; width:8px; height:8px; background:#f44;"></div>
<div class="mod weapon-ciws" style="left:30px; top:22px; width:8px; height:8px; background:#f44;"></div>
<!-- 标注 -->
<div class="label" style="left:-110px; top:-25px;">大功率激光炮</div>
<div class="label" style="left:10px; top:30px;">点射激光塔</div>
<div class="label" style="left:50px; top:-30px;">生活舱</div>
<div class="label" style="left:85px; top:-30px;">动力舱</div>
<div class="label" style="left:15px; top:65px;">太阳能板</div>
</div>
</div>
<!-- ================= 3. 补给舰 ================= -->
<div class="ship-display" id="disp-supply">
<div class="title">补 给 舰</div>
<div class="subtitle">Supply Ship</div>
<div class="ship-body theme-blue" style="transform: rotate(0deg);">
<!-- 太阳能板 -->
<div class="mod mod-panel" style="left:-20px; top:-75px; width:30px; height:20px;"></div>
<div class="mod mod-panel" style="left:-20px; top:55px; width:30px; height:20px;"></div>
<div class="mod mod-panel" style="left:20px; top:-75px; width:30px; height:20px;"></div>
<div class="mod mod-panel" style="left:20px; top:55px; width:30px; height:20px;"></div>
<!-- 舱段 -->
<!-- 巨大的补给舱 -->
<div class="mod mod-body" style="left:-40px; top:-35px; width:80px; height:70px; border: 2px solid #888;"></div>
<!-- 动力舱 -->
<div class="mod mod-body" style="left:40px; top:-20px; width:30px; height:40px;"></div>
<!-- 对接口 x3 (顶部一个,左右各一个) -->
<div class="mod port" style="left:-45px; top:-15px; width:5px; height:30px;"></div> <!-- 左侧 -->
<div class="mod port" style="left:-20px; top:-40px; width:40px; height:5px;"></div> <!-- 顶部 -->
<div class="mod port" style="left:-20px; top:35px; width:40px; height:5px;"></div> <!-- 底部 -->
<!-- 武器 -->
<!-- 近防炮 -->
<div class="mod weapon-ciws" style="left:10px; top:-45px; width:10px; height:10px;"></div>
<!-- 标注 -->
<div class="label" style="left:-50px; top:-60px;">对接口</div>
<div class="label" style="left:-10px; top:0px;">大型资源补给舱</div>
<div class="label" style="left:45px; top:-35px;">动力舱</div>
<div class="label" style="left:-20px; top:75px;">太阳能板 (两侧)</div>
<div class="label" style="left:15px; top:-65px;">近防炮</div>
</div>
</div>
</div>
</div>
<script>
// 视角缩放与拖拽逻辑
let scale = 0.6, tx = 0, ty = 0;
const viewport = document.getElementById('viewport');
const scene = document.getElementById('scene');
function applyT() {
scene.style.transform = `translate(${tx}px, ${ty}px) scale(${scale})`;
}
// 初始自适应缩放
function initScale() {
const rect = viewport.getBoundingClientRect();
// 总宽度大约需要容纳 1600px,做个自适应
const fit = Math.min(rect.width / 1600, rect.height / 800);
scale = Math.max(0.2, Math.min(1.2, fit));
applyT();
}
window.addEventListener('resize', initScale);
initScale();
let pointers = new Map();
let pinchD = 0;
viewport.addEventListener('pointerdown', e => {
viewport.setPointerCapture(e.pointerId);
pointers.set(e.pointerId, { x: e.clientX, y: e.clientY });
viewport.classList.add('grabbing');
if (pointers.size === 2) {
let pts = [...pointers.values()];
pinchD = Math.hypot(pts[1].x - pts[0].x, pts[1].y - pts[0].y);
}
});
viewport.addEventListener('pointermove', e => {
if (!pointers.has(e.pointerId)) return;
let p = pointers.get(e.pointerId);
let dx = e.clientX - p.x;
let dy = e.clientY - p.y;
p.x = e.clientX;
p.y = e.clientY;
if (pointers.size === 1) {
tx += dx;
ty += dy;
applyT();
} else if (pointers.size === 2) {
let pts = [...pointers.values()];
let d = Math.hypot(pts[1].x - pts[0].x, pts[1].y - pts[0].y);
if (pinchD > 0 && d > 0) {
let ns = scale * (d / pinchD);
ns = Math.max(0.15, Math.min(3, ns));
// 以双指中心为锚点缩放
const rect = viewport.getBoundingClientRect();
const cx = rect.width / 2;
const cy = rect.height / 2;
const mx = (pts[0].x + pts[1].x) / 2 - rect.left;
const my = (pts[0].y + pts[1].y) / 2 - rect.top;
const k = ns / scale;
const ux = mx - cx;
const uy = my - cy;
tx = ux * (1 - k) + k * tx;
ty = uy * (1 - k) + k * ty;
scale = ns;
applyT();
}
pinchD = d;
}
});
function endPointer(e) {
pointers.delete(e.pointerId);
if (pointers.size === 0) viewport.classList.remove('grabbing');
if (pointers.size === 1) pinchD = 0;
}
viewport.addEventListener('pointerup', endPointer);
viewport.addEventListener('pointercancel', endPointer);
</script>
</body>
</html>Game Source: 2036 战舰图鉴 - 模块化展示
Creator: ApexFalcon66
Libraries: none
Complexity: complex (355 lines, 13.5 KB)
The full source code is displayed above on this page.
Remix Instructions
To remix this game, copy the source code above and modify it. Add a ARCADELAB header at the top with "remix_of: 2036-apexfalcon66" to link back to the original. Then publish at arcadelab.ai/publish.