import { Font, IActionEvent, MotaOffscreenCanvas2D, CustomRenderItem } from '@motajs/render'; // import { WeatherController } from '../weather'; import { defineComponent, ref } from 'vue'; import { Textbox, TextboxProps, Tip } from '@user/client-base'; import { GameUI, SetupComponentOptions } from '@motajs/system'; import { ENABLE_RIGHT_STATUS_BAR, MAIN_HEIGHT, MAIN_WIDTH, MAP_HEIGHT, MAP_WIDTH, RIGHT_STATUS_POS, STATUS_BAR_HEIGHT, STATUS_BAR_WIDTH } from '../shared'; import { LeftStatusBar, RightStatusBar } from './statusBar'; import { state } from '@user/data-state'; import { mainUIController } from './controller'; import { isNil } from 'lodash-es'; import { using } from '../render/renderer'; import { IUIPropsBase } from './types'; interface MainSceneProps extends IUIPropsBase {} const mainSceneProps = { props: ['controller', 'instance', 'state'] } satisfies SetupComponentOptions; const MainScene = defineComponent(props => { const mainMapRenderer = props.state.mainMapRenderer; const mainMapExtension = props.state.mainMapExtension; //#region 基本定义 const mainTextboxProps: TextboxProps = { text: '', hidden: true, loc: [0, MAP_HEIGHT - 150, MAP_WIDTH, 150], zIndex: 30, fillStyle: '#fff', titleFill: 'gold', font: new Font('normal'), titleFont: new Font('normal', 20, 'px', 700), winskin: 'winskin.png', interval: 30, lineHeight: 4, width: MAP_WIDTH }; const hideStatus = ref( p.state.flags.getFieldValueDefaults('hideStatusBar', false) ); // TODO: flags 更新未接(当前无监听系统) // const weather = new WeatherController(); // weather.extern('main'); //#region sprite 渲染 let lastLength = 0; using.onExcitedFunc(() => { const len = core.status.stepPostfix?.length ?? 0; if (len !== lastLength) { mapMiscSprite.value?.update(); lastLength = len; } }); const mapMiscSprite = ref(); const renderMapMisc = (canvas: MotaOffscreenCanvas2D) => { const step = core.status.stepPostfix; if (!step) return; const ctx = canvas.ctx; ctx.fillStyle = '#fff'; step.forEach(({ x, y, direction }) => { ctx.fillRect(x * 32 + 12, y * 32 + 12, 8, 8); if (!isNil(direction)) { switch (direction) { case 'down': ctx.fillRect(x * 32 + 12, y * 32 + 20, 8, 12); break; case 'left': ctx.fillRect(x * 32, y * 32 + 12, 12, 8); break; case 'right': ctx.fillRect(x * 32 + 20, y * 32 + 12, 12, 8); break; case 'up': ctx.fillRect(x * 32 + 12, y * 32, 8, 12); break; } } }); }; //#region 交互监听 /** * 对于 registerAction 的 fallback */ const clickMap = (ev: IActionEvent) => { const bx = Math.floor(ev.offsetX / 32); const by = Math.floor(ev.offsetY / 32); core.doRegisteredAction('onup', bx, by, ev.offsetX, ev.offsetY); }; /** * 对于 registerAction 的 fallback */ const downMap = (ev: IActionEvent) => { const bx = Math.floor(ev.offsetX / 32); const by = Math.floor(ev.offsetY / 32); core.doRegisteredAction('ondown', bx, by, ev.offsetX, ev.offsetY); }; /** * 对于 registerAction 的 fallback */ const moveMap = (ev: IActionEvent) => { const bx = Math.floor(ev.offsetX / 32); const by = Math.floor(ev.offsetY / 32); core.doRegisteredAction('onmove', bx, by, ev.offsetX, ev.offsetY); }; return () => ( {/* */} ); }, mainSceneProps); export const MainSceneUI = new GameUI('main-scene', MainScene);