mirror of
https://github.com/unanmed/HumanBreak.git
synced 2025-10-09 04:11:46 +08:00
Compare commits
3 Commits
82d58756b7
...
608cd15f76
Author | SHA1 | Date | |
---|---|---|---|
608cd15f76 | |||
f9bd3fc3b4 | |||
5c49f6617b |
@ -7,13 +7,17 @@ import { ElementLocator } from '@motajs/render-core';
|
|||||||
/** 每个格子的宽高 */
|
/** 每个格子的宽高 */
|
||||||
export const CELL_SIZE = 32;
|
export const CELL_SIZE = 32;
|
||||||
/** 地图格子宽度,此处仅影响画面,不影响游戏内逻辑,游戏内逻辑地图大小请在 core.js 中修改 */
|
/** 地图格子宽度,此处仅影响画面,不影响游戏内逻辑,游戏内逻辑地图大小请在 core.js 中修改 */
|
||||||
export const MAP_BLOCK_WIDTH = 13;
|
export const MAP_BLOCK_WIDTH = 15;
|
||||||
/** 地图格子高度,此处仅影响画面,不影响游戏内逻辑,游戏内逻辑地图大小请在 core.js 中修改 */
|
/** 地图格子高度,此处仅影响画面,不影响游戏内逻辑,游戏内逻辑地图大小请在 core.js 中修改 */
|
||||||
export const MAP_BLOCK_HEIGHT = 13;
|
export const MAP_BLOCK_HEIGHT = 15;
|
||||||
/** 地图像素宽度 */
|
/** 地图像素宽度 */
|
||||||
export const MAP_WIDTH = CELL_SIZE * MAP_BLOCK_WIDTH;
|
export const MAP_WIDTH = CELL_SIZE * MAP_BLOCK_WIDTH;
|
||||||
/** 地图像素高度 */
|
/** 地图像素高度 */
|
||||||
export const MAP_HEIGHT = CELL_SIZE * MAP_BLOCK_HEIGHT;
|
export const MAP_HEIGHT = CELL_SIZE * MAP_BLOCK_HEIGHT;
|
||||||
|
/** 地图宽度的一半 */
|
||||||
|
export const HALF_MAP_WIDTH = MAP_WIDTH / 2;
|
||||||
|
/** 地图高度的一半 */
|
||||||
|
export const HALF_MAP_HEIGHT = MAP_HEIGHT / 2;
|
||||||
|
|
||||||
//#region 状态栏
|
//#region 状态栏
|
||||||
|
|
||||||
|
@ -41,7 +41,8 @@ import { useKey } from '../use';
|
|||||||
import {
|
import {
|
||||||
ENABLE_RIGHT_STATUS_BAR,
|
ENABLE_RIGHT_STATUS_BAR,
|
||||||
FULL_LOC,
|
FULL_LOC,
|
||||||
HALF_WIDTH,
|
HALF_MAP_WIDTH,
|
||||||
|
HALF_STATUS_WIDTH,
|
||||||
MAIN_HEIGHT,
|
MAIN_HEIGHT,
|
||||||
MAP_HEIGHT,
|
MAP_HEIGHT,
|
||||||
MAP_WIDTH,
|
MAP_WIDTH,
|
||||||
@ -70,6 +71,12 @@ export const ViewMap = defineComponent<ViewMapProps>(props => {
|
|||||||
new LayerGroupAnimate()
|
new LayerGroupAnimate()
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const restHeight = STATUS_BAR_HEIGHT - 292;
|
||||||
|
const col = restHeight / 4;
|
||||||
|
const loc1: ElementLocator = [HALF_STATUS_WIDTH, col * 1 + 292];
|
||||||
|
const loc2: ElementLocator = [HALF_STATUS_WIDTH, col * 2 + 292];
|
||||||
|
const loc3: ElementLocator = [HALF_STATUS_WIDTH, col * 3 + 292];
|
||||||
|
|
||||||
const rightFont = new Font(Font.defaultFamily, 15);
|
const rightFont = new Font(Font.defaultFamily, 15);
|
||||||
|
|
||||||
const viewableFloor = markRaw(
|
const viewableFloor = markRaw(
|
||||||
@ -105,7 +112,13 @@ export const ViewMap = defineComponent<ViewMapProps>(props => {
|
|||||||
.realize('@viewMap_book', () => openBook())
|
.realize('@viewMap_book', () => openBook())
|
||||||
.realize('@viewMap_fly', () => fly())
|
.realize('@viewMap_fly', () => fly())
|
||||||
.realize('@viewMap_reset', () => resetCamera())
|
.realize('@viewMap_reset', () => resetCamera())
|
||||||
.realize('confirm', () => close());
|
.realize('confirm', () => close())
|
||||||
|
.realize('exit', (_, code, assist) => {
|
||||||
|
// 如果按键不能触发怪物手册,则关闭界面,因为怪物手册和退出默认使用同一个按键,需要特判
|
||||||
|
if (!key.willEmit(code, assist, 'book')) {
|
||||||
|
props.controller.close(props.instance);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
//#region 功能函数
|
//#region 功能函数
|
||||||
|
|
||||||
@ -213,6 +226,28 @@ export const ViewMap = defineComponent<ViewMapProps>(props => {
|
|||||||
group.value?.update();
|
group.value?.update();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//#region 事件监听
|
||||||
|
|
||||||
|
const clickTop = (ev: IActionEvent) => {
|
||||||
|
const col = MAP_WIDTH / 3;
|
||||||
|
if (ev.offsetX < col * 2) {
|
||||||
|
changeFloor(1);
|
||||||
|
} else {
|
||||||
|
resetCamera();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const clickBottom = (ev: IActionEvent) => {
|
||||||
|
const col = MAP_WIDTH / 3;
|
||||||
|
if (ev.offsetX < col) {
|
||||||
|
openBook();
|
||||||
|
} else if (ev.offsetX < col * 2) {
|
||||||
|
changeFloor(-1);
|
||||||
|
} else {
|
||||||
|
fly();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
//#region 地图交互
|
//#region 地图交互
|
||||||
|
|
||||||
let mouseDown = false;
|
let mouseDown = false;
|
||||||
@ -394,7 +429,7 @@ export const ViewMap = defineComponent<ViewMapProps>(props => {
|
|||||||
cursor="pointer"
|
cursor="pointer"
|
||||||
onEnter={enterTop}
|
onEnter={enterTop}
|
||||||
onLeave={leaveTop}
|
onLeave={leaveTop}
|
||||||
onClick={() => changeFloor(1)}
|
onClick={clickTop}
|
||||||
/>
|
/>
|
||||||
<sprite
|
<sprite
|
||||||
loc={[STATUS_BAR_WIDTH, MAP_HEIGHT - 64, MAP_WIDTH, 64]}
|
loc={[STATUS_BAR_WIDTH, MAP_HEIGHT - 64, MAP_WIDTH, 64]}
|
||||||
@ -404,22 +439,43 @@ export const ViewMap = defineComponent<ViewMapProps>(props => {
|
|||||||
cursor="pointer"
|
cursor="pointer"
|
||||||
onEnter={enterBottom}
|
onEnter={enterBottom}
|
||||||
onLeave={leaveBottom}
|
onLeave={leaveBottom}
|
||||||
onClick={() => changeFloor(-1)}
|
onClick={clickBottom}
|
||||||
/>
|
/>
|
||||||
<text
|
<text
|
||||||
text="上移地图"
|
text="上移地图"
|
||||||
loc={[HALF_WIDTH, 24]}
|
loc={[HALF_MAP_WIDTH + STATUS_BAR_WIDTH, 24]}
|
||||||
anc={[0.5, 0.5]}
|
anc={[0.5, 0.5]}
|
||||||
zIndex={20}
|
zIndex={20}
|
||||||
noevent
|
noevent
|
||||||
/>
|
/>
|
||||||
<text
|
<text
|
||||||
text="下移地图"
|
text="下移地图"
|
||||||
loc={[HALF_WIDTH, MAP_HEIGHT - 24]}
|
loc={[HALF_MAP_WIDTH + STATUS_BAR_WIDTH, MAP_HEIGHT - 24]}
|
||||||
anc={[0.5, 0.5]}
|
anc={[0.5, 0.5]}
|
||||||
zIndex={20}
|
zIndex={20}
|
||||||
noevent
|
noevent
|
||||||
/>
|
/>
|
||||||
|
<text
|
||||||
|
text="「 怪物手册 」"
|
||||||
|
loc={[32 + STATUS_BAR_WIDTH, MAP_HEIGHT - 24]}
|
||||||
|
anc={[0, 0.5]}
|
||||||
|
zIndex={20}
|
||||||
|
noevent
|
||||||
|
/>
|
||||||
|
<text
|
||||||
|
text="「 传送至此 」"
|
||||||
|
loc={[RIGHT_STATUS_POS - 32, MAP_HEIGHT - 24]}
|
||||||
|
anc={[1, 0.5]}
|
||||||
|
zIndex={20}
|
||||||
|
noevent
|
||||||
|
/>
|
||||||
|
<text
|
||||||
|
text="「 重置视角 」"
|
||||||
|
loc={[RIGHT_STATUS_POS - 32, 24]}
|
||||||
|
anc={[1, 0.5]}
|
||||||
|
zIndex={20}
|
||||||
|
noevent
|
||||||
|
/>
|
||||||
<container
|
<container
|
||||||
loc={[RIGHT_STATUS_POS, 0, STATUS_BAR_WIDTH, STATUS_BAR_HEIGHT]}
|
loc={[RIGHT_STATUS_POS, 0, STATUS_BAR_WIDTH, STATUS_BAR_HEIGHT]}
|
||||||
hidden={!ENABLE_RIGHT_STATUS_BAR}
|
hidden={!ENABLE_RIGHT_STATUS_BAR}
|
||||||
@ -484,21 +540,21 @@ export const ViewMap = defineComponent<ViewMapProps>(props => {
|
|||||||
<g-line line={[12, 292, 168, 292]} lineWidth={1} />
|
<g-line line={[12, 292, 168, 292]} lineWidth={1} />
|
||||||
<text
|
<text
|
||||||
text="「 怪物手册 」"
|
text="「 怪物手册 」"
|
||||||
loc={[90, 330]}
|
loc={loc1}
|
||||||
anc={[0.5, 0.5]}
|
anc={[0.5, 0.5]}
|
||||||
cursor="pointer"
|
cursor="pointer"
|
||||||
onClick={openBook}
|
onClick={openBook}
|
||||||
/>
|
/>
|
||||||
<text
|
<text
|
||||||
text="「 传送至此 」"
|
text="「 传送至此 」"
|
||||||
loc={[90, 380]}
|
loc={loc2}
|
||||||
anc={[0.5, 0.5]}
|
anc={[0.5, 0.5]}
|
||||||
cursor="pointer"
|
cursor="pointer"
|
||||||
onClick={fly}
|
onClick={fly}
|
||||||
/>
|
/>
|
||||||
<text
|
<text
|
||||||
text="「 重置视角 」"
|
text="「 重置视角 」"
|
||||||
loc={[90, 430]}
|
loc={loc3}
|
||||||
anc={[0.5, 0.5]}
|
anc={[0.5, 0.5]}
|
||||||
cursor="pointer"
|
cursor="pointer"
|
||||||
onClick={resetCamera}
|
onClick={resetCamera}
|
||||||
|
@ -52,6 +52,7 @@ export interface HotkeyData extends Required<RegisterHotkeyData> {
|
|||||||
type HotkeyFunc = (
|
type HotkeyFunc = (
|
||||||
id: string,
|
id: string,
|
||||||
code: KeyCode,
|
code: KeyCode,
|
||||||
|
assist: number,
|
||||||
ev: KeyboardEvent
|
ev: KeyboardEvent
|
||||||
) => void | '@void';
|
) => void | '@void';
|
||||||
|
|
||||||
@ -223,6 +224,30 @@ export class Hotkey extends EventEmitter<HotkeyEvent> {
|
|||||||
if (emit) this.emit('set', id, key, assist);
|
if (emit) this.emit('set', id, key, assist);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断指定按键和辅助按键是否可能会触发给定 id 的按键操作
|
||||||
|
* @param key 按键
|
||||||
|
* @param assist 辅助按键
|
||||||
|
* @param id 注册的按键操作 id
|
||||||
|
*/
|
||||||
|
willEmit(key: KeyCode, assist: number, id: string) {
|
||||||
|
const emittable = this.keyMap.get(key);
|
||||||
|
if (!emittable) return false;
|
||||||
|
const { ctrl, shift, alt } = unwarpBinary(assist);
|
||||||
|
return emittable.some(v => {
|
||||||
|
if (
|
||||||
|
v.id === id &&
|
||||||
|
v.ctrl === ctrl &&
|
||||||
|
v.shift === shift &&
|
||||||
|
v.alt === alt
|
||||||
|
) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 触发一个按键
|
* 触发一个按键
|
||||||
* @param key 要触发的按键
|
* @param key 要触发的按键
|
||||||
@ -256,12 +281,12 @@ export class Hotkey extends EventEmitter<HotkeyEvent> {
|
|||||||
if (!data) return;
|
if (!data) return;
|
||||||
|
|
||||||
if (type === 'up' && data.onUp) {
|
if (type === 'up' && data.onUp) {
|
||||||
data.onUp(v.id, key, ev);
|
data.onUp(v.id, key, assist, ev);
|
||||||
emitted = true;
|
emitted = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!this.canEmit(v.id, key, type, data)) return;
|
if (!this.canEmit(v.id, key, type, data)) return;
|
||||||
const res = data.func(v.id, key, ev);
|
const res = data.func(v.id, key, assist, ev);
|
||||||
if (res !== '@void') emitted = true;
|
if (res !== '@void') emitted = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -453,12 +478,12 @@ document.addEventListener('keyup', e => {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// polyfill样板
|
// polyfill样板
|
||||||
if (main.dom.inputDiv.style.display == 'block') {
|
if (main.dom.inputDiv.style.display === 'block') {
|
||||||
if (e.keyCode == 13) {
|
if (e.keyCode === 13) {
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
main.dom.inputYes.click();
|
main.dom.inputYes.click();
|
||||||
}, 50);
|
}, 50);
|
||||||
} else if (e.keyCode == 27) {
|
} else if (e.keyCode === 27) {
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
main.dom.inputNo.click();
|
main.dom.inputNo.click();
|
||||||
}, 50);
|
}, 50);
|
||||||
|
Loading…
Reference in New Issue
Block a user