diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000..b6ac8dac Binary files /dev/null and b/.DS_Store differ diff --git a/docker-conf/.DS_Store b/docker-conf/.DS_Store new file mode 100644 index 00000000..570de7d0 Binary files /dev/null and b/docker-conf/.DS_Store differ diff --git a/docker-conf/conf.d/.DS_Store b/docker-conf/conf.d/.DS_Store new file mode 100644 index 00000000..2ba47ba0 Binary files /dev/null and b/docker-conf/conf.d/.DS_Store differ diff --git a/docker-conf/conf.d/nginx.conf b/docker-conf/conf.d/nginx.conf index 338cb330..e5789512 100644 --- a/docker-conf/conf.d/nginx.conf +++ b/docker-conf/conf.d/nginx.conf @@ -17,6 +17,7 @@ server { return 301 /competition.html?competition_id=13; } +<<<<<<< HEAD # Brotli 压缩 WebAssembly 文件处理 location ~* \.wasm\.br$ { default_type ""; @@ -32,13 +33,51 @@ server { add_header Content-Type application/javascript always; add_header Vary Accept-Encoding; expires 30d; +======= + # Unity 预压缩文件:禁止再次 gzip,避免 Content-Length 与实际内容不一致 + location ~* \.wasm\.br$ { + gzip off; + default_type application/wasm; + add_header Content-Encoding br; + add_header Content-Type application/wasm always; + add_header Vary Accept-Encoding; + add_header Accept-Ranges bytes; + expires 1h; + } + + location ~* \.js\.br$ { + gzip off; + default_type application/javascript; + add_header Content-Encoding br; + add_header Content-Type application/javascript always; + add_header Vary Accept-Encoding; + add_header Accept-Ranges bytes; + expires 1h; + } + + location ~* \.data\.br$ { + gzip off; + default_type application/octet-stream; + add_header Content-Encoding br; + add_header Vary Accept-Encoding; + add_header Accept-Ranges bytes; + expires 1h; +>>>>>>> cocos-main } # 通用 Brotli 文件处理 location ~* \.br$ { +<<<<<<< HEAD add_header Content-Encoding br; add_header Vary Accept-Encoding; expires 30d; +======= + gzip off; + add_header Content-Encoding br; + add_header Vary Accept-Encoding; + add_header Accept-Ranges bytes; + expires 1h; +>>>>>>> cocos-main } # 静态资源缓存配置 diff --git a/nginx.conf b/nginx.conf index feca8597..1706092a 100644 --- a/nginx.conf +++ b/nginx.conf @@ -37,9 +37,12 @@ server { # 通用 Brotli 文件处理 location ~* \.br$ { + gzip off; + gzip_static off; add_header Content-Encoding br; add_header Vary Accept-Encoding; - expires 30d; + add_header Accept-Ranges bytes; + expires 1h; } # 静态资源缓存配置 @@ -78,4 +81,4 @@ server { # 错误日志和访问日志配置 access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; -} \ No newline at end of file +} diff --git a/scratch-gui/competitio_login/index.html b/scratch-gui/competitio_login/index.html index 28543ab5..02d883f4 100644 --- a/scratch-gui/competitio_login/index.html +++ b/scratch-gui/competitio_login/index.html @@ -383,8 +383,8 @@ diff --git a/scratch-gui/src/components/menu-bar/menu-bar.css b/scratch-gui/src/components/menu-bar/menu-bar.css index be345f46..1ea53d98 100644 --- a/scratch-gui/src/components/menu-bar/menu-bar.css +++ b/scratch-gui/src/components/menu-bar/menu-bar.css @@ -235,52 +235,70 @@ } .startButton { - background-color: white; - color: inherit; + background: linear-gradient(135deg, #22c55e, #16a34a); + color: #fff; border: none; - padding: 10px 20px; + padding: 10px 22px; text-align: center; text-decoration: none; display: inline-block; - /* font-size: 16px; */ + font-weight: 600; + font-size: 14px; margin: 4px 2px; cursor: pointer; - transition: background-color 0.3s, transform 0.2s, box-shadow 0.3s; - border-radius: 4px; - animation: pulse 2s infinite; /* 添加吸引注意的动画 */ + transition: all 0.3s ease; + border-radius: 6px; + box-shadow: 0 2px 8px rgba(34, 197, 94, 0.3); + letter-spacing: 0.5px; } .startButton:hover { - background-color: #56b9b7; /* 悬停时颜色加深 */ - transform: scale(1.05); /* 悬停时略微放大 */ - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); /* 添加阴影 */ + background: linear-gradient(135deg, #16a34a, #15803d); + transform: scale(1.04); + box-shadow: 0 4px 16px rgba(34, 197, 94, 0.45); } .startButton:active { - background-color: #279a98; /* 点击时颜色进一步加深 */ - transform: scale(0.98); /* 点击时略微缩小 */ - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); /* 减少阴影 */ -} - -/* 定义吸引注意的动画 */ -@keyframes pulse { - 0% { - transform: scale(1); - } - 50% { - transform: scale(1.05); - } - 100% { - transform: scale(1); - } + background: linear-gradient(135deg, #15803d, #166534); + transform: scale(0.97); + box-shadow: 0 2px 6px rgba(34, 197, 94, 0.35); } /* 可选:在点击后停止动画并改变样式 */ .startButtonClicked { - background-color: #ff9800; /* 点击后颜色变为橙色 */ - transform: scale(1.1); /* 点击后稍微放大 */ - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3); /* 增加阴影 */ - animation: none; /* 停止动画 */ + background: linear-gradient(135deg, #f59e0b, #d97706); + transform: scale(1.05); + box-shadow: 0 6px 12px rgba(245, 158, 11, 0.4); +} + +.interruptButton { + background: linear-gradient(135deg, #ef4444, #dc2626); + color: #fff; + border: none; + padding: 10px 22px; + text-align: center; + text-decoration: none; + display: inline-block; + font-weight: 600; + font-size: 14px; + margin: 4px 8px; + cursor: pointer; + transition: all 0.3s ease; + border-radius: 6px; + box-shadow: 0 2px 8px rgba(239, 68, 68, 0.3); + letter-spacing: 0.5px; +} + +.interruptButton:hover { + background: linear-gradient(135deg, #dc2626, #b91c1c); + transform: scale(1.04); + box-shadow: 0 4px 16px rgba(239, 68, 68, 0.45); +} + +.interruptButton:active { + background: linear-gradient(135deg, #b91c1c, #991b1b); + transform: scale(0.97); + box-shadow: 0 2px 6px rgba(239, 68, 68, 0.35); } .lvcount{ diff --git a/scratch-gui/src/components/menu-bar/menu-bar.jsx b/scratch-gui/src/components/menu-bar/menu-bar.jsx index 29617a3b..6f601169 100644 --- a/scratch-gui/src/components/menu-bar/menu-bar.jsx +++ b/scratch-gui/src/components/menu-bar/menu-bar.jsx @@ -246,8 +246,10 @@ class MenuBar extends React.Component { 'restoreOptionMessage', 'handleClickStart', 'handleClickStopAll', + 'handleClickInterrupt', 'handleFeedbackClick', 'handleCloseModal', + 'handleOpenNoPermissionModal', 'handleCloseVideoModal', 'handlelearnVideoClick', 'handleVideoLoaded', @@ -262,6 +264,7 @@ class MenuBar extends React.Component { showAntiAddictionMsg: false, antiAddictionMsg: '', showModal: false, + showNoPermissionModal: false, showVideoModal: false, currentLevel: window.gamelvdata ? window.gamelvdata.currentlv : '', currentGameId: window.gamelvdata ? window.gamelvdata.gameid : '', @@ -582,9 +585,15 @@ class MenuBar extends React.Component { window.vm.stopAll(); } + handleOpenNoPermissionModal() { + this.setState({ showNoPermissionModal: true }); + } + handleCloseModal() { - // 设置 showModal 为 false 以隐藏模态窗口 - this.setState({ showModal: false }); + this.setState({ showModal: false, showNoPermissionModal: false }); + if (window.location.hash === '#carousel_ac25') { + history.replaceState(null, document.title, window.location.pathname + window.location.search); + } } // 打开视频模态窗口 @@ -843,7 +852,7 @@ class MenuBar extends React.Component { let realLvId_tmp = ''; // 发送消息给 Unity 实例,切换关卡 if (localStorage.getItem('platformMode') === 'normal') { - realLvId_tmp = CONFIG.getRealLvId(window.gamelvdataJson.gamelv, window.gamelvdataJson.gameid, window.gamelvdataJson.ismatch, window.gamelvdataJson.gameNumber, window.gamelvdataJson.gamemode) + window.gamelvdata.currentlv; + realLvId_tmp = CONFIG.getRealLvId(window.gamelvdataJson.gamelv, window.gamelvdataJson.gameid, window.gamelvdataJson.ismatch, window.gamelvdataJson.gameNumber) + window.gamelvdata.currentlv; } else { realLvId_tmp = CONFIG.getRealLvId(window.gamelvdataJson.gamelv, window.gamelvdataJson.gameid, window.gamelvdataJson.ismatch, window.gamelvdataJson.gameNumber); } @@ -875,6 +884,42 @@ class MenuBar extends React.Component { } + handleClickInterrupt() { + console.log('取消执行按钮点击'); + // 1. 终止所有代码执行 + try { this.props.vm.stopAll(); } catch (e) { /* ignore */ } + try { if (window.pythonCodeStopRun) window.pythonCodeStopRun(); } catch (e) { /* ignore */ } + try { if (window.cppCodeStopRun) window.cppCodeStopRun(); } catch (e) { /* ignore */ } + // 2. 强制重置执行状态 + window.isPythonRun = false; + window.isScriptRunOver = true; + // 3. 重置 Unity 游戏到初始状态(重新加载当前关卡) + if (window.unityInstance && window.gamelvdataJson) { + try { + let realLvId_tmp = ''; + if (localStorage.getItem('platformMode') === 'normal') { + realLvId_tmp = CONFIG.getRealLvId( + window.gamelvdataJson.gamelv, + window.gamelvdataJson.gameid, + window.gamelvdataJson.ismatch, + window.gamelvdataJson.gameNumber + ) + (window.gamelvdata ? window.gamelvdata.currentlv : ''); + } else { + realLvId_tmp = CONFIG.getRealLvId( + window.gamelvdataJson.gamelv, + window.gamelvdataJson.gameid, + window.gamelvdataJson.ismatch, + window.gamelvdataJson.gameNumber + ); + } + window.unityInstance.SendMessage("GameController", "SwitchLevel", realLvId_tmp); + console.log('Unity 关卡重置:', realLvId_tmp); + } catch (e) { + console.warn('Unity 重置失败:', e); + } + } + } + handleChangeSkin() { unityInstance.SendMessage("Player", "CallChangeSkin", 1); } @@ -1341,6 +1386,18 @@ class MenuBar extends React.Component { */} +
+
+