원클릭으로
map-scene-drawing
2D 地圖場景動態繪製與 RPGRoom 擴展指南。提供如何使用編輯器、匯出場景 JSON、設定碰撞邊界、NPC 對話、場景傳送門以及離屏 Canvas 預渲染機制的標準化流程。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
2D 地圖場景動態繪製與 RPGRoom 擴展指南。提供如何使用編輯器、匯出場景 JSON、設定碰撞邊界、NPC 對話、場景傳送門以及離屏 Canvas 預渲染機制的標準化流程。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Godot 遊戲開發循環(匯出、測試、產物 commit)。當需要修改 godot-src/(RPG)或 godot-candy-src/(糖果)的 GDScript/場景/關卡,或要重新匯出 Web build、同步地圖 JSON 時使用。
使用 Google libwebp CLI (`cwebp`) 將 JPG/PNG 圖片批次轉換為 WebP 格式。當需要壓縮圖片、批次轉檔、或將專案圖片統一為 WebP 時使用。
Design intelligence skill providing professional UI/UX knowledge for building production-grade interfaces. Includes design system architecture, token management, color palettes, typography, UX guidelines, and accessibility standards. Adapted for Vue 3 + Quasar + Tailwind CSS v4 stack.
本專案網頁驗證流程(Playwright、hash 路由、Godot iframe、多人對戰)。當需要在瀏覽器中驗證頁面行為、截圖、測 /battle 多人同步、或 Playwright MCP 啟不動時使用。
為 RpgRoom 生成 2D RPG 地圖場景 JSON(房屋外觀、室內房間、布置場景)。當使用者要求新增/修改 RPG 地圖、場景、房間布置、NPC 配置時使用。支援「設計 [長x寬] 的 [風格] 場景,出入口接 [場景名]」參數化需求。
將 2D 俯視場景圖(截圖/AI 繪製稿/手繪 mockup)轉換成 RpgRoom 地圖 JSON。當使用者提供場景圖片並要求轉成遊戲室地圖時使用,例如「根據 [圖片] 製作 [場景名],出入口設置在 [場景2名]」。不符合格式的圖片防呆拒絕執行。
| name | map-scene-drawing |
| description | 2D 地圖場景動態繪製與 RPGRoom 擴展指南。提供如何使用編輯器、匯出場景 JSON、設定碰撞邊界、NPC 對話、場景傳送門以及離屏 Canvas 預渲染機制的標準化流程。 |
本 Skill 旨在指導開發者或 AI 代理人如何流暢地在專案中新增地圖、房屋、NPC 與對話,並說明動態地圖渲染技術。
地圖開發包含兩個主要部分:
graph TD
A[在 MapDeveloper 繪製地圖] --> B[點擊匯出地圖 JSON]
B --> C[放入 src/pages/RpgRoom/data/ 目錄]
C --> D[設定 src/pages/RpgRoom/data/index.ts 統一匯出]
D --> E[設定 src/pages/RpgRoom/constants/isMove.ts 碰撞]
E --> F[設定 src/pages/RpgRoom/constants/message.tsx 對話]
F --> G[在 RpgRoom 進行測試與遊玩]
/map-developer)。960x640 或 1920x1280,建議為 32 的倍數)。z !== 2): 地板、草地、牆壁、矮樹等角色會在其前方的物件。z === 2): 樹頂、高屋頂、吊燈等角色會在其後方的物件(能遮擋角色)。Alt + 滑鼠左鍵拖曳):
cm 地圖 ID 與 cmm 生成點索引)。e 事件 ID)。000X_map.json (X 為地圖 ID)。mapsJson 陣列中:
import mapX from './000X_map.json'
// ...
export const mapsJson: MapJsonData[] = [
// ...
mapX as MapJsonData,
]
開啟 isMove.ts,比照現有地圖格式加入新地圖資料:
const ISMOVE_000X: MapData = {
map: {
index: X, // 地圖 ID (數字)
name: '地圖區域名稱',
width: 960, // 地圖寬度
height: 640, // 地圖高度
in: [
{ x: 472, y: 580 }, // 傳送生成點 0
{ x: 100, y: 200 } // 傳送生成點 1 (如有)
],
},
isMove: [
// 牆壁碰撞 (阻擋)
{ n: '牆壁', x: 32, y: 32, w: 928, h: 32 },
// NPC 互動觸發 (e 指向對話事件索引,例如 0)
{ n: 'NPC名字', x: 480, y: 352, w: 32, h: 32, e: 0 },
// 傳送門 (cm 指向目標地圖 ID,cmm 指向目標地圖的生成點索引)
{ n: '傳送門', x: 448, y: 640, w: 64, h: 32, cm: 0, cmm: 1 }
]
}
並記得將 ISMOVE_000X 加到陣列尾端:
export const isMoveObject: MapData[] = [
// ...
ISMOVE_000X, // 新增
]
開啟 message.tsx,為新地圖新增 NPC 對話:
const MESSAGE_000X: NpcMessage[] = [
{
name: 'NPC 名字',
text: [
'第一句對話。',
'第二句對話,支持 JSX 標籤,例如:',
<span key="custom">
請按 <kbd className="bg-slate-700 text-slate-100 px-2 py-0.5 rounded text-xs font-mono">ESC</kbd> 觀看說明。
</span>
]
}
]
並加到 messageObject 陣列中:
export const messageObject: NpcMessage[][] = [
// ...
MESSAGE_000X, // 新增,對齊地圖 ID
]
為了確保玩家能順暢地來回不同場景,請務必確認傳送門與生成點(in 座標)是雙向對齊的:
cm 必須設為 目標地圖 ID。cmm 必須設為 目標地圖 in 陣列中對應的生成點索引。x, y 必須是能行走區域,且不可與任何碰撞區重疊(否則玩家傳送後會被卡住)。cm 指回 起點地圖 ID,且 cmm 指回 起點地圖的門口生成點索引。為了保障遊戲能以 60 FPS 流暢度運作,RpgRoom 採用離屏 Canvas 緩存預渲染機制:
rpg_maker_xp.png/rpg_maker_xp2.png。bgOffscreen 與 fgOffscreen),並調整為該地圖大小。bgOffscreen 上先重複繪製 32x32 的重複草地背景。styles:
tile.z !== 2,根據 tile.b 的索引(1 或 2)從對應的拼圖庫擷取切片(利用 drawImage 的 source 和 destination 參數)畫到 bgOffscreen 上。tile.z === 2,以同樣方式將遮罩層繪製到 fgOffscreen 上。requestAnimationFrame 的繪圖循環中,主 Canvas 只需要使用 drawImage 直接將緩存好的離屏背景與前景 Canvas 渲染出來,避免了每幀迭代繪製數千個貼圖所造成的極大效能瓶頸。