目標
開發視覺縮放容器元件,讓遊戲畫面可以在 Discord 不同裝置(桌面、側邊欄、行動端)中正確顯示,並維持地圖長寬比。
關聯
驗收標準
範圍
新增項目
不包含
技術細節
元件設計
<template>
<div ref="container" class="auto-resizer">
<div
class="content"
:style="{ transform: `scale(${scale})` }"
>
<slot />
</div>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
const props = defineProps({
// 原始設計尺寸
baseWidth: { type: Number, default: 1920 },
baseHeight: { type: Number, default: 1080 },
});
const container = ref(null);
const scale = ref(1);
function calculateScale() {
if (!container.value) return;
const { clientWidth, clientHeight } = container.value;
const scaleX = clientWidth / props.baseWidth;
const scaleY = clientHeight / props.baseHeight;
// 取較小值以確保內容完全顯示
scale.value = Math.min(scaleX, scaleY);
}
onMounted(() => {
calculateScale();
window.addEventListener('resize', calculateScale);
});
onUnmounted(() => {
window.removeEventListener('resize', calculateScale);
});
</script>
Discord SDK 整合(未來)
當 Discord SDK 整合完成後,可改用 SDK 的 layout 事件:
discordSdk.subscribe('ACTIVITY_LAYOUT_MODE_UPDATE', (event) => {
// event.layout_mode: 'focused' | 'pip' | 'grid'
calculateScale();
});
現有硬編碼問題
目前 GameView.vue 中六邊形位置使用硬編碼 105px:
// GameView.vue:257-258
newDiv.style.left = `calc(${ from.x * 105 }px + ...)`
本 issue 的做法:使用 transform: scale() 整體縮放,不修改硬編碼。
後續優化:可考慮將 105px 改為 CSS 變數或動態計算。
測試方式
開發階段(不需 Discord)
- 調整瀏覽器視窗大小
- 使用 Chrome DevTools 模擬不同裝置尺寸
- 確認遊戲畫面正確縮放且不變形
整合階段(需要 Issue #21 完成)
- 在 Discord Activity 中測試
- 測試桌面版全螢幕
- 測試側邊欄模式
- 測試行動端(如有)
參考資料
目標
開發視覺縮放容器元件,讓遊戲畫面可以在 Discord 不同裝置(桌面、側邊欄、行動端)中正確顯示,並維持地圖長寬比。
關聯
驗收標準
AutoResizer元件範圍
新增項目
src/components/AutoResizer.vuetransform: scale()進行縮放GameView.vue不包含
105px硬編碼重構(可作為後續優化)技術細節
元件設計
Discord SDK 整合(未來)
當 Discord SDK 整合完成後,可改用 SDK 的 layout 事件:
現有硬編碼問題
目前
GameView.vue中六邊形位置使用硬編碼105px:本 issue 的做法:使用
transform: scale()整體縮放,不修改硬編碼。後續優化:可考慮將
105px改為 CSS 變數或動態計算。測試方式
開發階段(不需 Discord)
整合階段(需要 Issue #21 完成)
參考資料