์ด ๋ ํฌ์งํ ๋ฆฌ๋ ์ ํด์ง ํฌ๋งท๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
์์ง npm package๋ก ๋ฐฐํฌ๋์ง ์์์ต๋๋ค.
$ npm run buildbuild๋ฅผ ์คํํ๋ฉด distํด๋์ bundle.js ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
<script src="bundle.js"></script>html์์ bundle๋ jsํ์ผ์ ๋ถ๋ฌ์ต๋๋ค.
let data = { Formatted Data };
let minimap = new Replay.Minimap(data);
minimap.mount(document.body);์์ ๊ฐ์ด new Replay.Minimap(data)๋ก ๋ฏธ๋๋งต์ ์์ฑํ ์ ์์ต๋๋ค.
ํ์ฌ ๋ฆฌํ๋ ์ด๊ฐ ์ฌ์ ์ค์ธ ์ํ์ด๋ฉด true, ์ค์ง๋ ์ํ์ด๋ฉด false์ ๊ฐ์ ๊ฐ์ง๋๋ค.
์ด ์์ฑ์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ผ๋ก ๋ฏธ๋๋งต์ ์ฌ์/์ค์ง ์ํฌ ์ ์์ต๋๋ค.
- type: number
- default: 0
- min: 0
- max: duration
ํ์ฌ ๋ฏธ๋๋งต์ด ํํํ๊ณ ์๋ ๊ฒ์์ ์๊ฐ์ ๋๋ค.
- type: number
- value: (data์ ๊ฐ์ ๋ฐ๋ฆ)
- min: 0
๊ฒ์์ ์ด ์๊ฐ์ ๋๋ค.
- type: number
- default: 10
- min: 0
๋ฏธ๋๋งต์ ์ฌ์ํ ๋ ๋ช ๋ฐฐ์์ผ๋ก ์ฌ์ํ ์ง ์ง์ ํฉ๋๋ค.
- type: Point
- default: { x: gameWidth / 2, y: gameHeight / 2 }
ํ์ฌ ํ๋ฉด ์ค์ฌ ์ง์ ์ ๋ํ ๊ฒ์ ๋ด์์์ ์ขํ์ ๋๋ค.
center ์ง์ ์ x๊ฐ๊ณผ y๊ฐ์ ๊ฐ์ด ๋ณ๊ฒฝํ ์ ์๋ ๋ฉ์๋์ ๋๋ค.
let minimap = new Replay.Minimap(data);
minimap.center.set(minimap.gameWidth / 2, minimap.gameHeight / 2);center ์ง์ ์ด ๋ณ๊ฒฝ๋๋ฉด ํธ์ถ๋๋ ์ด๋ฒคํธ์ ๋๋ค.
let minimap = new Replay.Minimap(data);
minimap.center.on('change', () => {
console.log('center position changed');
});- type: number
- default: 1
- min: 1
๋ฏธ๋๋งต์ ์ผ๋ง๋ ํ๋ํ๋์ง ๋ํ๋ ๋๋ค.
- type: number
- default: 800
canvas์ ๊ทธ๋ ค์ง๋ ๋ฏธ๋๋งต์ ๊ฐ๋ก ํฌ๊ธฐ์ ๋๋ค.
- type: number
- default: 800
canvas์ ๊ทธ๋ ค์ง๋ ๋ฏธ๋๋งต์ ์ธ๋ก ํฌ๊ธฐ์ ๋๋ค.
- type: number
- value: width * zoom / gameWidth
๊ฒ์์ ๋ฏธ๋๋งต์ ๊ทธ๋ฆฌ๊ธฐ ์ํด x์ถ์ผ๋ก ์ผ๋ง๋ ์ถ์/ํ๋๋์๋์ง ๋ํ๋ ๋๋ค.
- type: number
- value: height * zoom / gameHeight
๊ฒ์์ ๋ฏธ๋๋งต์ ๊ทธ๋ฆฌ๊ธฐ ์ํด y์ถ์ผ๋ก ์ผ๋ง๋ ์ถ์/ํ๋๋์๋์ง ๋ํ๋ ๋๋ค.
- type: number
- value: (data์ ๊ฐ์ ๋ฐ๋ฆ)
๊ฒ์์ ๋งต ๊ฐ๋ก ํฌ๊ธฐ๋ฅผ ์๋ฏธํฉ๋๋ค.
- type: number
- value: (data์ ๊ฐ์ ๋ฐ๋ฆ)
๊ฒ์์ ๋งต ์ธ๋ก ํฌ๊ธฐ๋ฅผ ์๋ฏธํฉ๋๋ค.
- type: HTMLCanvasElement
๋ฏธ๋๋งต์ด ๊ทธ๋ ค์ง๋ <canvas> ์์์
๋๋ค.
๋ฏธ๋๋งต์ ์ฌ์ํฉ๋๋ค. isPlaying ์์ฑ์ด true๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.
๋ฏธ๋๋งต์ ์ค์งํฉ๋๋ค. isPlaying ์์ฑ์ด false๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.
๋ฏธ๋๋งต์ด ๊ทธ๋ ค์ง๋ canvas๋ฅผ element์ (๋ง์ง๋ง) ์์ ์์๋ก ์ถ๊ฐํฉ๋๋ค.
์๋์ ์ด๋ฒคํธ๋ minimap.on('event name', callback); ํํ๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
let data = { ... };
let minimap = new Replay.Minimap(data);
minimap.on('assetsLoaded', () => {
// All texture loaded
minimap.mount(document.body);
});data์์ ์๋ ๋ชจ๋ texture๊ฐ ๋ก๋ ๋ ํ ํธ์ถ๋๋ ์ด๋ฒคํธ์ ๋๋ค.
isPlaying ์์ฑ์ด ๋ณ๊ฒฝ๋๋ฉด ํธ์ถ๋๋ ์ด๋ฒคํธ์ ๋๋ค.
currentTime ์์ฑ์ด ๋ณ๊ฒฝ๋๋ฉด ํธ์ถ๋๋ ์ด๋ฒคํธ์ ๋๋ค.
speed ์์ฑ์ด ๋ณ๊ฒฝ๋๋ฉด ํธ์ถ๋๋ ์ด๋ฒคํธ์ ๋๋ค.
zoom ์์ฑ์ด ๋ณ๊ฒฝ๋๋ฉด ํธ์ถ๋๋ ์ด๋ฒคํธ์ ๋๋ค.
width ์์ฑ์ด ๋ณ๊ฒฝ๋๋ฉด ํธ์ถ๋๋ ์ด๋ฒคํธ์ ๋๋ค.
height ์์ฑ์ด ๋ณ๊ฒฝ๋๋ฉด ํธ์ถ๋๋ ์ด๋ฒคํธ์ ๋๋ค.
| type | example | description |
|---|---|---|
| string | "test" | ๋ฌธ์์ด |
| integer | 123 | ์ ์ํ |
| number | 1.23 | ์ค์ํ |
| boolean | true | ๋ ผ๋ฆฌํ |
| color | 0 | 0 ์ด์ 0xFFFFFF ์ดํ์ ์ ์๊ฐ์ ๋๋ค. |
| AssetID | "AssetPath" | ๋ฌธ์์ด๋ก ํํ๋๋ฉฐ AssetList ์์ Key๋ก ๋ฐ๋์ ์กด์ฌํด์ผ ํฉ๋๋ค. |
๋ฆฌํ๋ ์ด ํ์ผ์ ์ ์ฒด ๊ตฌ์กฐ์ ๋๋ค.
{
// ์ด ๋ฆฌํ๋ ์ด์ ํ์ฉํ Asset์ ๋ชฉ๋ก (๋ฐฐ์ด์ด ์๋ key-value object ํํ)
"assets": AssetList,
// ๊ฒ์์ ์ ๋ฐ์ ์ธ ์ ๋ณด๋ฅผ ์ ์ฅ
"game": GameInformation,
// ํ๋ ์ด์ด๋ ์ค๋ฆฝ ๋ชฌ์คํฐ๋ฑ ์ด์์๋ ์๋ช
์ฒด๋ฅผ ํํ
"characters": [
GameCharacter,
GameCharacter,
GameCharacter,
...
],
// ๋ฏธ๋๋งต์ ํ์๋๋ ์ผ๋ฐ ๊ฐ์ฒด
"objects": [
GameObject,
GameObject,
GameObject,
...
],
// ๋ฏธ๋๋งต์ ํ์ํ UI
"ui": [
GameUI,
GameUI,
GameUI,
...
],
// ์บ๋ฆญํฐ๋ค์ด ๊ณต๊ฒฉํ๋ ๊ฒ์ ํํ
"attacks": [
GameAttack,
GameAttack,
GameAttack,
...
],
}๋ฆฌํ๋ ์ด์ ํ์ํ ์ฌ๋ฌ ์ด๋ฏธ์ง ์์
๋ค์ ๋ด๊ณ ์์ต๋๋ค.
์ด๋ฏธ์ง ์์
์ ์น ๊ฒฝ๋ก๋ base64๋ก ์ธ์ฝ๋ฉ๋ ์ด๋ฏธ์ง๋ฅผ ๋ฃ์ ์ ์์ต๋๋ค.
{
"Asset-ID-1": "Asset1 path",
"Asset-ID-2": "Asset2 path",
"Asset-ID-3": "Asset3 path",
...
}๊ฒ์์ ์ ์ฒด์ ์ธ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์์ต๋๋ค.
{
// ๊ฒ์ ๋ด์์ ๋งต ๊ฐ๋ก ํฌ๊ธฐ
"width": number,
// ๊ฒ์ ๋ด์์์ ๋งต ์ธ๋ก ํฌ๊ธฐ
"height": number,
// ๋ฐฐ๊ฒฝ์ ๋ํ ์ ๋ณด
"background": {
// ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง์ AssetID
"image": AssetID,
},
// ๊ฒ์ ์ด ์งํ ์๊ฐ (๋จ์: ms)
"duration": number
}ํ๋ ์ด์ด๋ ์ค๋ฆฝ ๋ชฌ์คํฐ๋ฑ ์ด์์๋ ์๋ช ์ฒด๋ฅผ ํํํ ๋ ์ฌ์ฉํฉ๋๋ค.
{
// ์บ๋ฆญํฐ๋ฅผ ๊ตฌ๋ถํ ์์ด๋
"id": string,
// ์บ๋ฆญํฐ๊ฐ ํ์๋ ์ด๋ฆ, ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด ํดํ์ผ๋ก ์ด๋ฆ์ด ํ์๋ฉ๋๋ค.
"name": string,
// ์๊ฐ์ ๋ฐ๋ฅธ ์บ๋ฆญํฐ ์์น ์ ๋ณด
"locations": [
LiveGameLocation,
LiveGameLocation,
LiveGameLocation,
...
],
// ์๊ฐ์ ๋ฐ๋ฅธ ์บ๋ฆญํฐ ๋ชจ์ ์ ๋ณด
"shapes": [
LiveShape,
LiveShape,
LiveShape,
...
]
}๋ฏธ๋๋งต์ ํ์๋๋ ์ผ๋ฐ ๊ฐ์ฒด์
๋๋ค.
๋ฐฐํ๊ทธ๋ผ์ด๋์ ๋ ๋์กด, ์๊ธฐ์ฅ(ํ๋ ์), ์์ ์ง์ญ(ํฐ์ ์), ๋ณด๊ธ์์ ๋ฑ์ ํ์ํ ๋ ํ์ฉ ํ ์ ์์ต๋๋ค.
{
// ์๊ฐ์ ๋ฐ๋ฅธ ๊ฐ์ฒด ์์น ์ ๋ณด
"locations": [
LiveGameLocation,
LiveGameLocation,
LiveGameLocation,
...
],
// ์๊ฐ์ ๋ฐ๋ฅธ ๊ฐ์ฒด ๋ชจ์ ์ ๋ณด
"shapes": [
LiveShape,
LiveShape,
LiveShape,
...
],
// ๊ฐ์ฒด์ ๋ง์ฐ์ค ์ค๋ฒ์ ํดํ์ผ๋ก ํ์ํ ๋ด์ฉ (ํด๋น ๊ฐ์ฒด ํด๋ฆญ์ ํดํ์ด ๊ณ ์ ๋จ)
"tooltips": [
LiveTooltip,
LiveTooltip,
LiveTooltip,
...
],
}๋ฏธ๋๋งต์ ํ์ํ UI๋ฅผ ์ ์ํฉ๋๋ค.
๋ฐฐํ ๊ทธ๋ผ์ด๋์ ์ด์์๋ ์ฌ๋ ์, ํน์ ๋ฆฌ๊ทธ์ค๋ธ๋ ์ ๋์ ํฌ ์ค์ฝ์ด ํํฉ ๋ฑ์ ํ์ํ ๋ ํ์ฉ ํ ์ ์์ต๋๋ค.
{
// ์๊ฐ์ ๋ฐ๋ฅธ UI์ ์์น
"positions": [
LivePosition,
LivePosition,
LivePosition,
...
],
// ์๊ฐ์ ๋ฐ๋ฅธ UI์ ๋ชจ์
"shapes": [
LiveShape,
LiveShape,
LiveShape,
...
],
// ์๊ฐ์ ๋ฐ๋ฅธ UI ๋ด ๊ธ์จ
"texts": [
LiveText,
LiveText,
LiveText,
...
],
}์บ๋ฆญํฐ๋ค์ด ๊ณต๊ฒฉํ๋ ๊ฒ์ ํํํฉ๋๋ค.
LineAttack | BulletAttack๊ณต๊ฒฉ ์์ ์ง์ ์์ ๊ณต๊ฒฉ ๋์ ์ง์ ์ผ๋ก ์ ๋ชจ์์ผ๋ก ๊ทธ๋ ค์ง๋ ๊ณต๊ฒฉ์ ๋๋ค.
{
// ์ ๋ชจ์ Attack
"type": "line",
// ๊ณต๊ฒฉ ์์ ์ง์
"attacker": GameLocation,
// ๊ณต๊ฒฉ ๋์ ์ง์
"target": GameLocation,
// ๊ณต๊ฒฉ ์ ๋ชจ์ ์ ์
"shape": {
// ์ ๋๊ป
"lineWidth": number,
// ์ ์์
"lineColor": color,
// ์
"lineAlpha": number,
},
// ๊ณต๊ฒฉ์ด ์งํ๋๋ ์๊ฐ (๋จ์: ๊ฒ์ ๋ด์ ์๊ฐ ms)
"duration": number,
// ์ duration์ ๊ฒ์ ๋ด์ ์๊ฐ์ด ์๋ ๋ฆฌํ๋ ์ด ์ ๋ณด์ฌ์ง๋ ์๊ฐ์ผ๋ก ์ฌ์ฉ
"fixDuration": boolean,
// ํ์ฌ ์ ๋ณด์ ํด๋นํ๋ ๊ฒ์ ์๊ฐ (๋จ์: ms)
"elapsedTime": number
}{
// ์ด์ ํํ Attack
"type": "bullet",
// ๊ณต๊ฒฉ ์์ ์ง์
"attacker": GameLocation,
// ๊ณต๊ฒฉ ๋์ ์ง์
"target": GameLocation,
// ์ด์ ๋ชจ์ ์ ์
"shape": Shape,
// ๊ณต๊ฒฉ์ด ์งํ๋๋ ์๊ฐ (๋จ์: ๊ฒ์ ๋ด์ ์๊ฐ ms)
"duration": number,
// ์ duration์ ๊ฒ์ ๋ด์ ์๊ฐ์ด ์๋ ๋ฆฌํ๋ ์ด ์ ๋ณด์ฌ์ง๋ ์๊ฐ์ผ๋ก ์ฌ์ฉ
"fixDuration": boolean,
// ํ์ฌ ์ ๋ณด์ ํด๋นํ๋ ๊ฒ์ ์๊ฐ (๋จ์: ms)
"elapsedTime": number
}๊ฒ์ ์๊ฐ, ๋ณด๊ฐ ์ ๋ณด๋ฅผ ํฌํจํ ๊ฒ์ ๋งต ๊ธฐ์ค ์ขํ ์ ๋ณด์ ๋๋ค.
{
// ๊ฒ์์ ์์ํ์ง elapsedTime๋งํผ ์ง๋ฌ์ ๋์ ์ขํ
...GameLocation,
// ์ด์ ์ขํ์ ํ์ฌ ์ขํ ์ฌ์ด์ ์ขํ๋ฅผ ๋ณด๊ฐํด์ ์ฌ์ฉ ํ ์ง ์ฌ๋ถ
"transition": boolean,
// ํ์ฌ ์ขํ์ ํด๋นํ๋ ๊ฒ์ ์๊ฐ (๋จ์: ms)
"elapsedTime": number
}๊ฒ์ ๋งต ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ํน์ ์ขํ๋ฅผ ์๋ฏธํฉ๋๋ค.
{
// ๊ฒ์ ๋งต ํฌ๊ธฐ ๊ธฐ์ค x์ขํ
"x": number,
// ๊ฒ์ ๋งต ํฌ๊ธฐ ๊ธฐ์ค y์ขํ
"y": number
}๊ฒ์ ์๊ฐ, ๋ณด๊ฐ ์ ๋ณด๋ฅผ ํฌํจํ ์บ๋ฒ์ค ๊ธฐ์ค ์ขํ ์ ๋ณด์ ๋๋ค.
{
// ๊ฒ์์ ์์ํ์ง elapsedTime๋งํผ ์ง๋ฌ์ ๋์ ์ขํ
...Position,
// ์ด์ ์ขํ์ ํ์ฌ ์ขํ ์ฌ์ด์ ์ขํ๋ฅผ ๋ณด๊ฐํด์ ์ฌ์ฉ ํ ์ง ์ฌ๋ถ
"transition": boolean,
// ํ์ฌ ์ขํ์ ํด๋นํ๋ ๊ฒ์ ์๊ฐ (๋จ์: ms)
"elapsedTime": number
}์บ๋ฒ์ค ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ํน์ ์ขํ๋ฅผ ์๋ฏธํฉ๋๋ค.
{
// ์บ๋ฒ์ค ํฌ๊ธฐ ๊ธฐ์ค x์ขํ
"x": number,
// ์บ๋ฒ์ค ํฌ๊ธฐ ๊ธฐ์ค y์ขํ
"y": number
}๊ฒ์ ์๊ฐ์ ํฌํจํ ํดํ ์ ๋ณด์ ๋๋ค.
{
// ํดํ์ผ๋ก ํ์ํ ๊ธ์จ
"text": string,
// ํ์ฌ ํดํ์ ํด๋นํ๋ ๊ฒ์ ์๊ฐ (๋จ์: ms)
"elapsedTime": number,
}๊ฒ์ ์๊ฐ์ ํฌํจํ ๊ธ์จ ์ ๋ณด์ ๋๋ค.
{
// ๊ธ์จ ๋ด์ฉ
"text": string,
// ๊ธ์จ ์
"textColor": color,
// ๊ธ์จ ํฌ๋ช
๋
"textAlpha": number,
// ๊ธ์จ ํฌ๊ธฐ
"textSize": number,
// ํ์ฌ ๊ธ์จ์ ํด๋นํ๋ ๊ฒ์ ์๊ฐ (๋จ์: ms)
"elapsedTime": number,
}๊ฒ์ ์๊ฐ, ๋ณด๊ฐ ์ ๋ณด๋ฅผ ํฌํจํ ๋ชจ์ ์ ๋ณด์ ๋๋ค.
{
// ๊ฒ์์ ์์ํ์ง elapsedTime๋งํผ ์ง๋ฌ์ ๋์ ์บ๋ฆญํฐ ๋ชจ์ ์ ๋ณด
...Shape,
// ์ด์ ๋ชจ์ ์ ๋ณด์ ํ์ฌ ๋ชจ์ ์ ๋ณด ์ฌ์ด์ ๋ชจ์๋ฅผ ๋ณด๊ฐํด์ ์ฌ์ฉ ํ ์ง ์ฌ๋ถ
// - ์๋ก ๋ค๋ฅธ Shape ์ฌ์ด์์๋ ๋ณด๊ฐ์ด ๋์ง ์์
// - Shape์ fillColor, lineColor๋ ๋ณด๊ฐ์ด ๋์ง ์์
"transition": boolean,
// ํ์ฌ ๋ชจ์ ์ ๋ณด์ ํด๋นํ๋ ๊ฒ์ ์๊ฐ (๋จ์: ms)
"elapsedTime": number
}RectangleShape | EllipseShape | ImageShape์ง์ฌ๊ฐํ ํํ์ Shape์ ๋๋ค.
{
// ์ง์ฌ๊ฐํ ๋ชจ์ Shape
"type": "rectangle",
// ๊ฐ๋ก ํฌ๊ธฐ (๊ฒ์ ๋งต ํฌ๊ธฐ ๊ธฐ์ค)
"width": number,
// ์ธ๋ก ํฌ๊ธฐ (๊ฒ์ ๋งต ํฌ๊ธฐ ๊ธฐ์ค)
"height": number,
// width๊ณผ height๋ฅผ ๊ฒ์ ๋งต ํฌ๊ธฐ ๊ธฐ์ค์ด ์๋ ์บ๋ฒ์ค ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ
"fixSize": boolean,
// ๋ฐฐ๊ฒฝ ์์
"fillColor": color,
// ๋ฐฐ๊ฒฝ ํฌ๋ช
๋
"fillAlpha": number,
// ํ
๋๋ฆฌ ์์
"lineColor": color,
// ํ
๋๋ฆฌ ํฌ๋ช
๋
"lineAlpha": number,
// ํ
๋๋ฆฌ ๋๊ป
"lineWidth": number,
}ํ์ ํํ์ Shape์ ๋๋ค.
{
// ํ์ ๋ชจ์ Shape
"type": "ellipse",
// ๊ฐ๋ก ํฌ๊ธฐ
"width": number,
// ์ธ๋ก ํฌ๊ธฐ
"height": number,
// width๊ณผ height๋ฅผ ๊ฒ์ ๋งต ํฌ๊ธฐ ๊ธฐ์ค์ด ์๋ ์บ๋ฒ์ค ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ
"fixSize": boolean,
// ๋ฐฐ๊ฒฝ ์์
"fillColor": color,
// ๋ฐฐ๊ฒฝ ํฌ๋ช
๋
"fillAlpha": number,
// ํ
๋๋ฆฌ ์์
"lineColor": color,
// ํ
๋๋ฆฌ ํฌ๋ช
๋
"lineAlpha": number,
// ํ
๋๋ฆฌ ๋๊ป
"lineWidth": number,
}์ด๋ฏธ์ง Asset์ ํ์ฉํ Shape์ ๋๋ค.
{
// ์ด๋ฏธ์ง ๋ชจ์ Shape
"type": "image",
// ๊ฐ๋ก ํฌ๊ธฐ
"width": number,
// ์ธ๋ก ํฌ๊ธฐ
"height": number,
// width๊ณผ height๋ฅผ ๊ฒ์ ๋งต ํฌ๊ธฐ ๊ธฐ์ค์ด ์๋ ์บ๋ฒ์ค ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ
"fixSize": boolean,
// ์ฌ์ฉํ ์ด๋ฏธ์ง์ AssetID
โimage": AssetID,
}