From d359563dad3829251496a9c3c1b11f4a45f5f4b2 Mon Sep 17 00:00:00 2001 From: ShakeFlower Date: Tue, 17 Jun 2025 15:01:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=AD=98=E6=A1=A3=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E7=BB=98=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client-modules/src/render/ui/save.tsx | 139 +++++++++++++++++- .../client-modules/src/render/ui/toolbar.tsx | 19 ++- 2 files changed, 150 insertions(+), 8 deletions(-) diff --git a/packages-user/client-modules/src/render/ui/save.tsx b/packages-user/client-modules/src/render/ui/save.tsx index 6e40e0a..39acc1f 100644 --- a/packages-user/client-modules/src/render/ui/save.tsx +++ b/packages-user/client-modules/src/render/ui/save.tsx @@ -1,14 +1,16 @@ import { ElementLocator, IWheelEvent } from '@motajs/render-core'; import { DefaultProps } from '@motajs/render-vue'; +import { Font } from '@motajs/render'; import { GameUI, IUIMountable, SetupComponentOptions, UIComponentProps } from '@motajs/system-ui'; -import { defineComponent } from 'vue'; -import { Page } from '../components'; +import { defineComponent, ref } from 'vue'; +import { Background, Page, PageExpose } from '../components'; import { useKey } from '../use'; +import { MAP_WIDTH, MAP_HEIGHT } from '../shared'; export interface SaveProps extends UIComponentProps, DefaultProps { loc: ElementLocator; @@ -25,6 +27,40 @@ const saveProps = { props: ['loc', 'controller', 'instance'] } satisfies SetupComponentOptions; +function SaveBtn(props: { + loc: ElementLocator; + index: number; + emit: (index: number) => void; + isDelete: boolean; +}) { + const w = props.loc[2]; + return ( + + + props.emit(props.index)} + /> + + + ); +} + export const Save = defineComponent( (props, { emit }) => { // 这些注释写完之后删了 @@ -39,13 +75,97 @@ export const Save = defineComponent( key.realize('exit', () => {}); // 其他按键自定义,需要新开一个 save 的 group + /** 除自动存档外,每一页容纳的存档数量 */ + const pageRef = ref(); + const pageCap = 5; + + let isDelete = ref(false); + const emitSave = (index: number) => { - emit('emit', index); + if (index === -1) { + console.log('不能覆盖自动存档!'); + return; + } + emit('emit', index, isDelete.value); }; - const wheel = (ev: IWheelEvent) => {}; + const wheel = (ev: IWheelEvent) => { + if (ev.wheelY < 0) { + pageRef.value?.movePage(-(ev.ctrlKey ? 10 : 1)); + } else if (ev.wheelY > 0) { + pageRef.value?.movePage(ev.ctrlKey ? 10 : 1); + } + }; - return () => ; + return () => ( + + + + {(page: number) => ( + + + + + + + + + )} + + { + isDelete.value = !isDelete.value; + }} + /> + emit('exit')} + /> + + ); }, saveProps ); @@ -79,12 +199,17 @@ export function selectSave( const instance = controller.open(SaveUI, { loc, ...props, - onEmit: index => { + onEmit: (index: number, isDelete: boolean) => { + if (index === -1) return; // 自动存档不能用于保存 + if (isDelete) { + return; + } controller.close(instance); res(index); }, onExit: () => { - res(-1); + controller.close(instance); + res(-2); } }); }); diff --git a/packages-user/client-modules/src/render/ui/toolbar.tsx b/packages-user/client-modules/src/render/ui/toolbar.tsx index 88affe6..0f733e3 100644 --- a/packages-user/client-modules/src/render/ui/toolbar.tsx +++ b/packages-user/client-modules/src/render/ui/toolbar.tsx @@ -21,6 +21,9 @@ import { KeyCode } from '@motajs/client-base'; import { Progress } from '../components/misc'; import { generateBinary } from '@motajs/legacy-common'; import { SetupComponentOptions } from '@motajs/system-ui'; +import { selectSave } from './save'; +import { mainUIController } from '@user/client-modules'; +import { STATUS_BAR_WIDTH, MAP_WIDTH, MAP_HEIGHT } from '../shared'; interface ToolbarProps extends DefaultProps { loc?: ElementLocator; @@ -84,7 +87,21 @@ export const PlayingToolbar = defineComponent< const book = () => core.openBook(true); const tool = () => core.openToolbox(true); const fly = () => core.useFly(true); - const save = () => core.save(true); + const save = async () => { + const index = await selectSave(mainUIController, [ + STATUS_BAR_WIDTH, + 0, + MAP_WIDTH, + MAP_HEIGHT + ]); + if (index === -2) { + // 如果用户未选择存档,而是关闭了存档。 + console.log('用户关闭了存档界面。'); + } else { + // 用户选择了一个存档。 + console.log('用户选择在存档位' + index + '保存。'); + } + }; const load = () => core.load(true); const equip = () => core.openEquipbox(true); const shop = () => core.openQuickShop(true);