diff --git a/packages-user/client-modules/src/action/move.ts b/packages-user/client-modules/src/action/move.ts
index 822042c..7e97704 100644
--- a/packages-user/client-modules/src/action/move.ts
+++ b/packages-user/client-modules/src/action/move.ts
@@ -2,7 +2,7 @@ import { KeyCode } from '@motajs/client-base';
import { Hotkey, HotkeyData } from '@motajs/system-action';
import { HeroMover, IMoveController } from '@user/data-state';
import { Ticker } from 'mutate-animate';
-import { mainScope } from '@motajs/legacy-ui';
+import { mainScope } from './hotkey';
type MoveKey = Record
;
type MoveKeyConfig = Record;
diff --git a/packages-user/client-modules/src/render/components/textboxTyper.ts b/packages-user/client-modules/src/render/components/textboxTyper.ts
index 7c5ad66..c3ab13e 100644
--- a/packages-user/client-modules/src/render/components/textboxTyper.ts
+++ b/packages-user/client-modules/src/render/components/textboxTyper.ts
@@ -1,14 +1,8 @@
import { logger } from '@motajs/common';
-import {
- AutotileRenderable,
- Font,
- onTick,
- RenderableData,
- texture,
- MotaOffscreenCanvas2D
-} from '@motajs/render';
+import { Font, onTick, MotaOffscreenCanvas2D } from '@motajs/render';
import EventEmitter from 'eventemitter3';
import { isNil } from 'lodash-es';
+import { RenderableData, AutotileRenderable, texture } from '../elements';
/** 文字的安全填充,会填充在文字的上侧和下侧,防止削顶和削底 */
const SAFE_PAD = 1;
@@ -596,10 +590,8 @@ export class TextContentParser {
this.status = { ...initStatus };
this.testCanvas = new MotaOffscreenCanvas2D(false);
- this.testCanvas.withGameScale(false);
this.testCanvas.setHD(false);
this.testCanvas.size(1, 1);
- this.testCanvas.freeze();
}
/**
diff --git a/packages-user/client-modules/src/render/components/tip.tsx b/packages-user/client-modules/src/render/components/tip.tsx
index cbb805f..55e5f59 100644
--- a/packages-user/client-modules/src/render/components/tip.tsx
+++ b/packages-user/client-modules/src/render/components/tip.tsx
@@ -1,10 +1,11 @@
-import { DefaultProps, ElementLocator, Font, texture } from '@motajs/render';
+import { DefaultProps, ElementLocator, Font } from '@motajs/render';
import { logger } from '@motajs/common';
import { computed, defineComponent, onUnmounted, ref } from 'vue';
import { SetupComponentOptions } from './types';
import { transitioned } from '../use';
import { hyper } from 'mutate-animate';
import { debounce } from 'lodash-es';
+import { texture } from '../elements';
export interface TipProps extends DefaultProps {
loc: ElementLocator;
diff --git a/packages-user/client-modules/src/render/elements/block.ts b/packages-user/client-modules/src/render/elements/block.ts
index cbebdcd..c1820f0 100644
--- a/packages-user/client-modules/src/render/elements/block.ts
+++ b/packages-user/client-modules/src/render/elements/block.ts
@@ -305,7 +305,5 @@ export interface ICanvasCacheItem extends IBlockCacheable {
export class CanvasCacheItem implements ICanvasCacheItem {
constructor(public canvas: MotaOffscreenCanvas2D, public symbol: number) {}
- destroy(): void {
- this.canvas.delete();
- }
+ destroy(): void {}
}
diff --git a/packages-user/client-modules/src/render/elements/cache.ts b/packages-user/client-modules/src/render/elements/cache.ts
index 187b699..affd827 100644
--- a/packages-user/client-modules/src/render/elements/cache.ts
+++ b/packages-user/client-modules/src/render/elements/cache.ts
@@ -464,11 +464,9 @@ function splitAutotiles(map: IdToNumber): AutotileCaches {
const master = new MotaOffscreenCanvas2D();
master.setHD(false);
master.setAntiAliasing(false);
- master.withGameScale(false);
master.size(32, 32);
master.ctx.drawImage(img, 0, 0, 32, 32, 0, 0, 32, 32);
masterMap[auto] = master.canvas.toDataURL('image/png');
- master.delete();
// 自动图块的绘制信息
for (let i = 0; i <= 0b11111111; i++) {
@@ -491,9 +489,7 @@ function splitAutotiles(map: IdToNumber): AutotileCaches {
const canvas = new MotaOffscreenCanvas2D();
canvas.setHD(false);
canvas.setAntiAliasing(false);
- canvas.withGameScale(false);
canvas.size(32 * frame, 32);
- canvas.freeze();
const ctx = canvas.ctx;
for (let i = 0; i < frame; i++) {
const dx = 32 * i;
@@ -518,7 +514,6 @@ function splitAutotiles(map: IdToNumber): AutotileCaches {
const judge = new MotaOffscreenCanvas2D();
judge.setHD(false);
judge.setAntiAliasing(false);
- judge.withGameScale(false);
judge.size(32, 32);
// 进行父子关系判断
for (const [key, img] of Object.entries(core.material.images.autotile)) {
@@ -538,7 +533,6 @@ function splitAutotiles(map: IdToNumber): AutotileCaches {
}
}
}
- judge.delete();
return cache as AutotileCaches;
}
diff --git a/packages-user/client-modules/src/render/damage.ts b/packages-user/client-modules/src/render/elements/damage.ts
similarity index 99%
rename from packages-user/client-modules/src/render/damage.ts
rename to packages-user/client-modules/src/render/elements/damage.ts
index ec9a441..fa6374c 100644
--- a/packages-user/client-modules/src/render/damage.ts
+++ b/packages-user/client-modules/src/render/elements/damage.ts
@@ -8,19 +8,17 @@ import {
import { logger } from '@motajs/common';
import EventEmitter from 'eventemitter3';
import { isNil } from 'lodash-es';
-import {
- BlockCacher,
- CanvasCacheItem,
- ICanvasCacheItem,
- calNeedRenderOf,
- ILayerGroupRenderExtends,
- Layer,
- LayerGroup,
- LayerGroupFloorBinder,
- tagMap
-} from '@motajs/render';
+import { tagMap } from '@motajs/render';
import { IDamageEnemy, IEnemyCollection, MapDamage } from '@motajs/types';
import { UserEnemyInfo } from '@user/data-state';
+import { BlockCacher, ICanvasCacheItem, CanvasCacheItem } from './block';
+import {
+ ILayerGroupRenderExtends,
+ LayerGroupFloorBinder,
+ LayerGroup,
+ Layer,
+ calNeedRenderOf
+} from './layer';
/**
* 根据伤害大小获取颜色
@@ -517,7 +515,6 @@ export class Damage extends RenderItem {
temp.clear();
temp.setHD(true);
temp.setAntiAliasing(true);
- temp.withGameScale(true);
temp.size(size, size);
const { ctx: ct } = temp;
diff --git a/packages-user/client-modules/src/render/elements/index.ts b/packages-user/client-modules/src/render/elements/index.ts
index ac1be29..b0cf7ce 100644
--- a/packages-user/client-modules/src/render/elements/index.ts
+++ b/packages-user/client-modules/src/render/elements/index.ts
@@ -75,3 +75,4 @@ export * from './hero';
export * from './layer';
export * from './misc';
export * from './viewport';
+export * from './utils';
diff --git a/packages-user/client-modules/src/render/itemDetail.ts b/packages-user/client-modules/src/render/elements/itemDetail.ts
similarity index 97%
rename from packages-user/client-modules/src/render/itemDetail.ts
rename to packages-user/client-modules/src/render/elements/itemDetail.ts
index f52dcc8..5c33aab 100644
--- a/packages-user/client-modules/src/render/itemDetail.ts
+++ b/packages-user/client-modules/src/render/elements/itemDetail.ts
@@ -1,13 +1,9 @@
import { logger } from '@motajs/common';
import { mainSetting } from '@motajs/legacy-ui';
-import {
- LayerGroupFloorBinder,
- ILayerGroupRenderExtends,
- LayerGroup
-} from '@motajs/render';
import { hook } from '@user/data-base';
import { ItemState } from '@user/data-state';
import { Damage, DamageRenderable, FloorDamageExtends } from './damage';
+import { ILayerGroupRenderExtends, LayerGroup, LayerGroupFloorBinder } from '.';
interface ItemDetailData {
x: number;
@@ -22,7 +18,7 @@ interface ItemData {
}
export function createItemDetail() {
- hook.on('setBlock', (x, y, floorId, block) => {
+ hook.on('setBlock', (x, y, _floorId, block) => {
FloorItemDetail.listened.forEach(v => {
v.setBlock(block, x, y);
});
@@ -261,7 +257,7 @@ export class FloorItemDetail implements ILayerGroupRenderExtends {
}
}
- onDestroy(group: LayerGroup): void {
+ onDestroy(_group: LayerGroup): void {
this.sprite.off('beforeDamageRender', this.onBeforeDamageRender);
this.sprite.off('setMapSize', this.onUpdateMapSize);
FloorItemDetail.listened.delete(this);
diff --git a/packages-user/client-modules/src/render/elements/layer.ts b/packages-user/client-modules/src/render/elements/layer.ts
index d746942..1aaa0d4 100644
--- a/packages-user/client-modules/src/render/elements/layer.ts
+++ b/packages-user/client-modules/src/render/elements/layer.ts
@@ -629,15 +629,12 @@ export class Layer extends Container {
this.staticMap.setHD(false);
// this.staticMap.setAntiAliasing(false);
- this.staticMap.withGameScale(false);
this.staticMap.size(core._PX_, core._PY_);
this.movingMap.setHD(false);
// this.movingMap.setAntiAliasing(false);
- this.movingMap.withGameScale(false);
this.movingMap.size(core._PX_, core._PY_);
this.backMap.setHD(false);
// this.backMap.setAntiAliasing(false);
- this.backMap.withGameScale(false);
this.backMap.size(core._PX_, core._PY_);
this.main.setAntiAliasing(false);
this.main.setHD(false);
@@ -777,7 +774,6 @@ export class Layer extends Container {
const num = this.background;
const data = texture.getRenderable(num);
- this.backImage.forEach(v => v.delete());
this.backImage = [];
if (!data) return;
@@ -785,7 +781,6 @@ export class Layer extends Container {
const temp = this.requireCanvas();
temp.setHD(false);
temp.setAntiAliasing(false);
- temp.withGameScale(false);
for (let i = 0; i < frame; i++) {
const canvas = this.requireCanvas();
const ctx = canvas.ctx;
@@ -793,7 +788,6 @@ export class Layer extends Container {
const [sx, sy, w, h] = data.render[i];
canvas.setHD(false);
canvas.setAntiAliasing(false);
- canvas.withGameScale(false);
canvas.size(core._PX_, core._PY_);
temp.size(w, h);
@@ -806,7 +800,6 @@ export class Layer extends Container {
this.backImage.push(canvas);
}
- temp.delete();
for (const ex of this.extend.values()) {
ex.onBackgroundGenerated?.(this, this.backImage);
@@ -1208,7 +1201,6 @@ export class Layer extends Container {
const temp = this.requireCanvas();
temp.setAntiAliasing(false);
temp.setHD(false);
- temp.withGameScale(false);
temp.size(core._PX_, core._PY_);
// 先画到临时画布,用于缓存
@@ -1512,10 +1504,6 @@ export class Layer extends Container {
ex.onDestroy?.(this);
}
super.destroy();
- this.staticMap.delete();
- this.movingMap.delete();
- this.backMap.delete();
- this.backImage.forEach(v => v.delete());
this.block.destroy();
this.main.destroy();
layerAdapter.remove(this);
diff --git a/packages-user/client-modules/src/render/elements/misc.ts b/packages-user/client-modules/src/render/elements/misc.ts
index 17c8a6e..40767e3 100644
--- a/packages-user/client-modules/src/render/elements/misc.ts
+++ b/packages-user/client-modules/src/render/elements/misc.ts
@@ -182,7 +182,6 @@ export class Winskin extends RenderItem {
const pattern = this.requireCanvas();
const img = this.image;
pattern.size(32, 16);
- pattern.withGameScale(false);
pattern.setHD(false);
pattern.setAntiAliasing(false);
const ctx = pattern.ctx;
@@ -211,7 +210,6 @@ export class Winskin extends RenderItem {
Winskin.patternMap.set(this.imageName, winskinPattern);
}
this.patternCache = winskinPattern;
- this.deleteCanvas(pattern);
return winskinPattern;
}
diff --git a/packages/render-elements/src/utils.ts b/packages-user/client-modules/src/render/elements/utils.ts
similarity index 100%
rename from packages/render-elements/src/utils.ts
rename to packages-user/client-modules/src/render/elements/utils.ts
diff --git a/packages-user/client-modules/src/render/index.tsx b/packages-user/client-modules/src/render/index.tsx
index 49a0cfe..f137c19 100644
--- a/packages-user/client-modules/src/render/index.tsx
+++ b/packages-user/client-modules/src/render/index.tsx
@@ -1,21 +1,16 @@
-import { MotaRenderer, createApp } from '@motajs/render';
+import { createApp } from '@motajs/render';
import { defineComponent } from 'vue';
import { UIController } from '@motajs/system-ui';
import { mainSceneUI } from './ui/main';
import { MAIN_HEIGHT, MAIN_WIDTH } from './shared';
import { hook } from '@user/data-base';
-import { createItemDetail } from './itemDetail';
+import { createItemDetail } from './elements/itemDetail';
import { createLoopMap } from './loopMap';
import { createGameCanvas } from './legacy/gameCanvas';
import { createElements } from './elements';
+import { mainRenderer } from './renderer';
export function createGameRenderer() {
- const main = new MotaRenderer({
- canvas: '#render-main',
- width: MAIN_WIDTH,
- height: MAIN_HEIGHT
- });
-
const App = defineComponent(_props => {
const ui = new UIController('root-ui');
ui.open(mainSceneUI, {});
@@ -27,18 +22,18 @@ export function createGameRenderer() {
);
});
- main.hide();
- createApp(App).mount(main);
+ mainRenderer.hide();
+ createApp(App).mount(mainRenderer);
hook.on('reset', () => {
- main.show();
+ mainRenderer.show();
});
hook.on('restart', () => {
- main.hide();
+ mainRenderer.hide();
});
- console.log(main);
+ console.log(mainRenderer);
}
export function createRender() {
diff --git a/packages-user/client-modules/src/render/legacy/gameCanvas.ts b/packages-user/client-modules/src/render/legacy/gameCanvas.ts
index 091af03..6fdb840 100644
--- a/packages-user/client-modules/src/render/legacy/gameCanvas.ts
+++ b/packages-user/client-modules/src/render/legacy/gameCanvas.ts
@@ -1,10 +1,10 @@
import { logger } from '@motajs/common';
-import {
- LayerGroupFloorBinder,
- ILayerGroupRenderExtends,
- LayerGroup
-} from '@motajs/render';
import { loading } from '@user/data-base';
+import {
+ ILayerGroupRenderExtends,
+ LayerGroup,
+ LayerGroupFloorBinder
+} from '../elements';
const filterMap: [FloorIds[], string][] = [];
@@ -58,7 +58,7 @@ export class LayerGroupFilter implements ILayerGroupRenderExtends {
}
}
- onDestroy(group: LayerGroup): void {
+ onDestroy(_group: LayerGroup): void {
this.binder?.off('floorChange', this.onFloorChange);
}
}
diff --git a/packages-user/client-modules/src/render/legacy/halo.ts b/packages-user/client-modules/src/render/legacy/halo.ts
index fcffc46..6b4b0d9 100644
--- a/packages-user/client-modules/src/render/legacy/halo.ts
+++ b/packages-user/client-modules/src/render/legacy/halo.ts
@@ -1,14 +1,13 @@
import { logger } from '@motajs/common';
import { MotaOffscreenCanvas2D } from '@motajs/render';
import { mainSetting } from '@motajs/legacy-ui';
+import { Sprite, Transform } from '@motajs/render';
+import { gameListener, hook } from '@user/data-base';
import {
- LayerGroupFloorBinder,
ILayerGroupRenderExtends,
LayerGroup,
- Sprite,
- Transform
-} from '@motajs/render';
-import { gameListener, hook } from '@user/data-base';
+ LayerGroupFloorBinder
+} from '../elements';
export class LayerGroupHalo implements ILayerGroupRenderExtends {
id: string = 'halo';
@@ -37,7 +36,7 @@ export class LayerGroupHalo implements ILayerGroupRenderExtends {
}
}
- onDestroy(group: LayerGroup): void {
+ onDestroy(_group: LayerGroup): void {
this.halo?.destroy();
LayerGroupHalo.sprites.delete(this.halo);
}
@@ -67,7 +66,7 @@ class Halo extends Sprite {
});
}
- drawHalo(canvas: MotaOffscreenCanvas2D, transform: Transform) {
+ drawHalo(canvas: MotaOffscreenCanvas2D, _transform: Transform) {
if (!mainSetting.getValue('screen.halo', true)) return;
const floorId = this.binder.getFloor();
if (!floorId) return;
diff --git a/packages-user/client-modules/src/render/legacy/portal.ts b/packages-user/client-modules/src/render/legacy/portal.ts
index 8a60eb8..af9133d 100644
--- a/packages-user/client-modules/src/render/legacy/portal.ts
+++ b/packages-user/client-modules/src/render/legacy/portal.ts
@@ -1,13 +1,13 @@
import { logger } from '@motajs/common';
import { MotaOffscreenCanvas2D } from '@motajs/render';
import { mainSetting, MotaSettingItem } from '@motajs/legacy-ui';
+import { Sprite } from '@motajs/render';
+import { BluePalace } from '@user/data-state';
import {
- LayerGroupFloorBinder,
ILayerGroupRenderExtends,
LayerGroup,
- Sprite
-} from '@motajs/render';
-import { BluePalace } from '@user/data-state';
+ LayerGroupFloorBinder
+} from '../elements';
/** 最大粒子数 */
const MAX_PARTICLES = 10;
@@ -49,7 +49,7 @@ export class LayerGroupPortal implements ILayerGroupRenderExtends {
}
}
- onDestroy(group: LayerGroup): void {
+ onDestroy(_group: LayerGroup): void {
this.binder.off('floorChange', this.onFloorChange);
}
}
@@ -104,7 +104,7 @@ export class Portal extends Sprite {
this.setZIndex(35);
- this.setRenderFn((canvas, transform) => {
+ this.setRenderFn((canvas, _transform) => {
this.renderPortal(canvas);
});
}
diff --git a/packages-user/client-modules/src/render/loopMap.ts b/packages-user/client-modules/src/render/loopMap.ts
index 847b3ac..7f173b1 100644
--- a/packages-user/client-modules/src/render/loopMap.ts
+++ b/packages-user/client-modules/src/render/loopMap.ts
@@ -1,15 +1,14 @@
-import {
- Container,
- LayerGroupFloorBinder,
- FloorLayer,
- LayerGroup,
- FloorViewport,
- MotaRenderer
-} from '@motajs/render';
+import { Container, MotaRenderer } from '@motajs/render';
import { hook } from '@user/data-base';
import { MiscData } from '@user/data-state';
-import { FloorDamageExtends } from './damage';
-import { FloorItemDetail } from './itemDetail';
+import { FloorDamageExtends } from './elements/damage';
+import { FloorItemDetail } from './elements/itemDetail';
+import {
+ LayerGroup,
+ FloorLayer,
+ LayerGroupFloorBinder,
+ FloorViewport
+} from './elements';
const loopMaps = MiscData.loopMaps;
@@ -19,7 +18,7 @@ let show: boolean = false;
let delegation: number = -1;
export function createLoopMap() {
- hook.on('changingFloor', (floorId, heroLoc) => {
+ hook.on('changingFloor', (floorId, _heroLoc) => {
enableLoopMapElement(floorId);
});
}
diff --git a/packages-user/client-modules/src/render/renderer.ts b/packages-user/client-modules/src/render/renderer.ts
new file mode 100644
index 0000000..3c1984f
--- /dev/null
+++ b/packages-user/client-modules/src/render/renderer.ts
@@ -0,0 +1,8 @@
+import { MotaRenderer } from '@motajs/render-core';
+import { MAIN_WIDTH, MAIN_HEIGHT } from './shared';
+
+export const mainRenderer = new MotaRenderer({
+ canvas: '#render-main',
+ width: MAIN_WIDTH,
+ height: MAIN_HEIGHT
+});
diff --git a/packages-user/client-modules/src/render/ui/main.tsx b/packages-user/client-modules/src/render/ui/main.tsx
index 45adef4..b471347 100644
--- a/packages-user/client-modules/src/render/ui/main.tsx
+++ b/packages-user/client-modules/src/render/ui/main.tsx
@@ -1,15 +1,5 @@
import { LayerShadowExtends } from '@motajs/legacy-ui';
-import {
- ILayerGroupRenderExtends,
- LayerGroupAnimate,
- FloorViewport,
- ILayerRenderExtends,
- HeroRenderer,
- LayerDoorAnimate,
- Props,
- LayerGroup,
- Font
-} from '@motajs/render';
+import { Props, Font } from '@motajs/render';
import { WeatherController } from '../../weather';
import { defineComponent, onMounted, reactive, ref } from 'vue';
import { Textbox, Tip } from '../components';
@@ -31,14 +21,23 @@ import { ReplayingStatus } from './toolbar';
import { getHeroStatusOn, HeroSkill, NightSpecial } from '@user/data-state';
import { jumpIgnoreFloor } from '@user/legacy-plugin-data';
import { hook } from '@user/data-base';
-import { FloorDamageExtends } from '../damage';
-import { FloorItemDetail } from '../itemDetail';
+import { FloorDamageExtends } from '../elements/damage';
+import { FloorItemDetail } from '../elements/itemDetail';
import { LayerGroupPortal } from '../legacy/portal';
import { LayerGroupFilter } from '../legacy/gameCanvas';
import { LayerGroupHalo } from '../legacy/halo';
import { FloorChange } from '../legacy/fallback';
import { PopText } from '../legacy/pop';
import { mainUIController } from './controller';
+import {
+ ILayerGroupRenderExtends,
+ LayerGroupAnimate,
+ FloorViewport,
+ ILayerRenderExtends,
+ HeroRenderer,
+ LayerDoorAnimate,
+ LayerGroup
+} from '../elements';
const MainScene = defineComponent(() => {
const layerGroupExtends: ILayerGroupRenderExtends[] = [
diff --git a/packages-user/data-state/src/mechanism/misc.ts b/packages-user/data-state/src/mechanism/misc.ts
index 7478189..9fb68a2 100644
--- a/packages-user/data-state/src/mechanism/misc.ts
+++ b/packages-user/data-state/src/mechanism/misc.ts
@@ -1,7 +1,6 @@
import { backDir, has } from '@user/data-utils';
import { loading } from '@user/data-base';
-import type { LayerDoorAnimate } from '@motajs/render';
-import { getSkillLevel } from './skillTree';
+import { LayerDoorAnimate } from '@user/client-modules';
/**
* 一些零散机制的数据
@@ -87,7 +86,7 @@ export namespace BluePalace {
const Adapter = Mota.require('@motajs/render').RenderAdapter;
const adapter = Adapter.get('door-animate');
- const texture = Mota.require('@motajs/render').texture;
+ const texture = Mota.require('@user/client-modules').texture;
if (adapter) {
Promise.all(
toConvert.map(v => {
diff --git a/packages-user/data-state/src/state/hero.ts b/packages-user/data-state/src/state/hero.ts
index 5ac9089..642947b 100644
--- a/packages-user/data-state/src/state/hero.ts
+++ b/packages-user/data-state/src/state/hero.ts
@@ -59,7 +59,7 @@ function getRealStatus(
name: keyof HeroStatus | 'all' | (keyof HeroStatus)[],
floorId: FloorIds = core.status.floorId
): any {
- const { getSkillLevel } = Mota.require('@user/legacy-plugin-data');
+ const { getSkillLevel } = Mota.require('@user/data-state');
if (name instanceof Array) {
const res: any = {};
name.forEach(v => {
diff --git a/packages-user/data-state/src/state/move.ts b/packages-user/data-state/src/state/move.ts
index ff0bbc1..1ec7765 100644
--- a/packages-user/data-state/src/state/move.ts
+++ b/packages-user/data-state/src/state/move.ts
@@ -1,17 +1,17 @@
import EventEmitter from 'eventemitter3';
import { backDir, checkCanMoveExtended, toDir } from './utils';
import { loading } from '@user/data-base';
+import type { RenderAdapter } from '@motajs/render';
import type {
- RenderAdapter,
- HeroRenderer,
- FloorViewport,
FloorLayer,
+ FloorViewport,
+ HeroKeyMover,
+ HeroRenderer,
Layer,
+ LayerFloorBinder,
LayerGroup,
- LayerMovingRenderable,
- LayerFloorBinder
-} from '@motajs/render';
-import type { HeroKeyMover } from '@user/client-modules';
+ LayerMovingRenderable
+} from '@user/client-modules';
import { BluePalace, MiscData } from '../mechanism/misc';
import { sleep } from '@motajs/common';
@@ -318,7 +318,7 @@ export class BlockMover extends ObjectMoverBase {
this.blockNum = blockNum;
Mota.r(() => {
- const { Layer } = Mota.require('@motajs/render');
+ const { Layer } = Mota.require('@user/client-modules');
const r = Layer.getMovingRenderable(blockNum, this.x, this.y);
if (r) {
diff --git a/packages-user/entry-client/src/create.ts b/packages-user/entry-client/src/create.ts
index 27f63b0..4d15a84 100644
--- a/packages-user/entry-client/src/create.ts
+++ b/packages-user/entry-client/src/create.ts
@@ -50,7 +50,6 @@ export function create() {
async function createModule() {
LegacyUI.create();
- RenderElements.create();
ClientModules.create();
await import('ant-design-vue/dist/antd.dark.css');
diff --git a/packages-user/legacy-plugin-client/src/boss/palaceBoss.ts b/packages-user/legacy-plugin-client/src/boss/palaceBoss.ts
index 5f45bce..766355e 100644
--- a/packages-user/legacy-plugin-client/src/boss/palaceBoss.ts
+++ b/packages-user/legacy-plugin-client/src/boss/palaceBoss.ts
@@ -2,7 +2,6 @@ import { IStateDamageable } from '@user/data-state';
import { BarrageBoss, BossSprite, Hitbox } from './barrage';
import {
Container,
- LayerGroup,
MotaRenderer,
RenderItem,
Shader,
@@ -14,6 +13,7 @@ import { SplittableBall } from './palaceBossProjectile';
import { PointEffect } from '../fx/pointShader';
import { loading } from '@user/data-base';
import { clip } from '@user/legacy-plugin-data';
+import { LayerGroup } from '@user/client-modules';
loading.once('coreInit', () => {
const shader = new Shader();
diff --git a/packages-user/legacy-plugin-client/src/boss/palaceBossProjectile.ts b/packages-user/legacy-plugin-client/src/boss/palaceBossProjectile.ts
index 2e93823..403d9eb 100644
--- a/packages-user/legacy-plugin-client/src/boss/palaceBossProjectile.ts
+++ b/packages-user/legacy-plugin-client/src/boss/palaceBossProjectile.ts
@@ -3,6 +3,7 @@ import { IStateDamageable } from '@user/data-state';
import { Hitbox, Projectile } from './barrage';
import type { PalaceBoss } from './palaceBoss';
import { clamp } from '@motajs/legacy-ui';
+import { mainRenderer } from 'packages-user/client-modules/src/render/renderer';
function popDamage(damage: number, boss: PalaceBoss, color: string) {
const { x, y } = core.status.hero.loc;
@@ -74,9 +75,8 @@ export class SplittableBall extends Projectile {
static init(colors: Record) {
this.ball.clear();
for (const [key, color] of Object.entries(colors)) {
- const canvas = new MotaOffscreenCanvas2D();
+ const canvas = mainRenderer.requireCanvas();
canvas.size(32, 32);
- canvas.withGameScale(true);
canvas.setHD(true);
const ctx = canvas.ctx;
const gradient = ctx.createRadialGradient(16, 16, 8, 16, 16, 16);
@@ -87,7 +87,6 @@ export class SplittableBall extends Projectile {
ctx.fillStyle = gradient;
ctx.arc(16, 16, 16, 0, Math.PI * 2);
ctx.fill();
- canvas.freeze();
this.ball.set(key, canvas);
}
}
@@ -95,7 +94,7 @@ export class SplittableBall extends Projectile {
static end() {
this.ball.forEach(v => {
v.clear();
- v.delete();
+ mainRenderer.deleteCanvas(v);
});
this.ball.clear();
}
diff --git a/packages-user/legacy-plugin-client/src/boss/towerBoss.ts b/packages-user/legacy-plugin-client/src/boss/towerBoss.ts
index a33a2cd..b04b2ee 100644
--- a/packages-user/legacy-plugin-client/src/boss/towerBoss.ts
+++ b/packages-user/legacy-plugin-client/src/boss/towerBoss.ts
@@ -1,11 +1,9 @@
import {
Shader,
MotaRenderer,
- LayerGroup,
RenderItem,
MotaOffscreenCanvas2D,
- Container,
- HeroRenderer
+ Container
} from '@motajs/render';
import { PointEffect } from '../fx/pointShader';
import { BarrageBoss, BossSprite, Hitbox } from './barrage';
@@ -25,7 +23,11 @@ import { IStateDamageable } from '@user/data-state';
import { Pop } from '../../../client-modules/src/render/legacy/pop';
import { loading } from '@user/data-base';
import { clip } from '@user/legacy-plugin-data';
-import { WeatherController } from '@user/client-modules';
+import {
+ HeroRenderer,
+ LayerGroup,
+ WeatherController
+} from '@user/client-modules';
loading.once('coreInit', () => {
const shader = new Shader();
diff --git a/packages-user/legacy-plugin-client/src/boss/towerBossProjectile.ts b/packages-user/legacy-plugin-client/src/boss/towerBossProjectile.ts
index 8e98a1e..b23f0bc 100644
--- a/packages-user/legacy-plugin-client/src/boss/towerBossProjectile.ts
+++ b/packages-user/legacy-plugin-client/src/boss/towerBossProjectile.ts
@@ -5,6 +5,7 @@ import type { TowerBoss } from './towerBoss';
import { IStateDamageable } from '@user/data-state';
import { PointEffect, PointEffectType } from '../fx/pointShader';
import { isNil } from 'lodash-es';
+import { mainRenderer } from 'packages-user/client-modules/src/render/renderer';
export const enum ProjectileDirection {
Vertical,
@@ -131,12 +132,11 @@ export class ArrowProjectile extends Projectile {
static init() {
this.easing = power(2, 'in');
this.dangerEasing = power(3, 'out');
- this.horizontal = new MotaOffscreenCanvas2D();
- this.vertical = new MotaOffscreenCanvas2D();
+ this.horizontal = mainRenderer.requireCanvas();
+ this.vertical = mainRenderer.requireCanvas();
const hor = this.horizontal;
hor.size(480, 32);
hor.setHD(true);
- hor.withGameScale(true);
const ctxHor = hor.ctx;
ctxHor.fillStyle = '#f00';
ctxHor.globalAlpha = 0.6;
@@ -146,15 +146,12 @@ export class ArrowProjectile extends Projectile {
const ver = this.vertical;
ver.size(32, 480);
ver.setHD(true);
- ver.withGameScale(true);
const ctxVer = ver.ctx;
ctxVer.fillStyle = '#f00';
ctxVer.globalAlpha = 0.6;
for (let i = 0; i < 15; i++) {
ctxVer.fillRect(2, i * 32 + 2, 28, 28);
}
- hor.freeze();
- ver.freeze();
}
/**
@@ -164,10 +161,10 @@ export class ArrowProjectile extends Projectile {
this.easing = void 0;
this.dangerEasing = void 0;
this.horizontal?.clear();
- this.horizontal?.delete();
+ if (this.horizontal) mainRenderer.deleteCanvas(this.horizontal);
this.horizontal = null;
this.vertical?.clear();
- this.vertical?.delete();
+ if (this.vertical) mainRenderer.deleteCanvas(this.vertical);
this.vertical = null;
}
@@ -460,15 +457,14 @@ export class ThunderProjectile extends Projectile {
private effectId2?: number;
static init() {
- this.cache = new MotaOffscreenCanvas2D();
+ this.cache = mainRenderer.requireCanvas();
this.cache.setHD(true);
- this.cache.withGameScale(true);
this.cache.size(480, 480);
}
static end() {
this.cache?.clear();
- this.cache?.delete();
+ if (this.cache) mainRenderer.deleteCanvas(this.cache);
this.cache = null;
}
@@ -622,12 +618,11 @@ export class ThunderBallProjectile extends Projectile {
*/
static init() {
this.dangerEasing = power(3, 'out');
- this.horizontal = new MotaOffscreenCanvas2D();
- this.vertical = new MotaOffscreenCanvas2D();
+ this.horizontal = mainRenderer.requireCanvas();
+ this.vertical = mainRenderer.requireCanvas();
const hor = this.horizontal;
hor.size(480, 32);
hor.setHD(true);
- hor.withGameScale(true);
const ctxHor = hor.ctx;
ctxHor.fillStyle = '#fff';
ctxHor.globalAlpha = 0.6;
@@ -637,15 +632,12 @@ export class ThunderBallProjectile extends Projectile {
const ver = this.vertical;
ver.size(32, 480);
ver.setHD(true);
- ver.withGameScale(true);
const ctxVer = ver.ctx;
ctxVer.fillStyle = '#fff';
ctxVer.globalAlpha = 0.6;
for (let i = 0; i < 15; i++) {
ctxVer.fillRect(2, i * 32 + 2, 28, 28);
}
- hor.freeze();
- ver.freeze();
}
/**
@@ -654,10 +646,10 @@ export class ThunderBallProjectile extends Projectile {
static end() {
this.dangerEasing = void 0;
this.horizontal?.clear();
- this.horizontal?.delete();
+ if (this.horizontal) mainRenderer.deleteCanvas(this.horizontal);
this.horizontal = null;
this.vertical?.clear();
- this.vertical?.delete();
+ if (this.vertical) mainRenderer.deleteCanvas(this.vertical);
this.vertical = null;
}
diff --git a/packages-user/legacy-plugin-client/src/chase/chase.ts b/packages-user/legacy-plugin-client/src/chase/chase.ts
index 0cad83e..b1dc6ae 100644
--- a/packages-user/legacy-plugin-client/src/chase/chase.ts
+++ b/packages-user/legacy-plugin-client/src/chase/chase.ts
@@ -1,14 +1,11 @@
import { MotaOffscreenCanvas2D } from '@motajs/render';
+import { Container, MotaRenderer, Shader, Sprite } from '@motajs/render';
import {
CameraAnimation,
- Container,
LayerGroup,
- MotaRenderer,
- Shader,
- Sprite,
disableViewport,
enableViewport
-} from '@motajs/render';
+} from '@user/client-modules';
import { loading } from '@user/data-base';
import {
heroMoveCollection,
@@ -16,6 +13,7 @@ import {
type MoveStep
} from '@user/data-state';
import EventEmitter from 'eventemitter3';
+import { mainRenderer } from 'packages-user/client-modules/src/render/renderer';
export interface IChaseController {
/** 本次追逐战实例 */
@@ -190,7 +188,7 @@ export class Chase extends EventEmitter {
for (const [key, nodes] of Object.entries(this.data.path)) {
if (nodes.length === 0) return;
const floor = key as FloorIds;
- const canvas = new MotaOffscreenCanvas2D();
+ const canvas = mainRenderer.requireCanvas();
const ctx = canvas.ctx;
const cell = 32;
const half = cell / 2;
@@ -345,7 +343,7 @@ export class Chase extends EventEmitter {
Chase.shader.remove();
this.emit('end', success);
this.removeAllListeners();
- this.pathMap.forEach(v => v.delete());
+ this.pathMap.forEach(v => mainRenderer.deleteCanvas(v));
this.pathMap.clear();
}
}
diff --git a/packages-user/legacy-plugin-client/src/chase/chase1.ts b/packages-user/legacy-plugin-client/src/chase/chase1.ts
index 85f1fb8..0560635 100644
--- a/packages-user/legacy-plugin-client/src/chase/chase1.ts
+++ b/packages-user/legacy-plugin-client/src/chase/chase1.ts
@@ -1,16 +1,14 @@
import { Animation, hyper, linear, power, sleep } from 'mutate-animate';
import { Chase, ChaseData, IChaseController } from './chase';
-// import { completeAchievement } from '@motajs/legacy-ui';
+import { MotaRenderer, Sprite } from '@motajs/render';
+import { PointEffect, PointEffectType } from '../fx/pointShader';
import {
+ bgmController,
Camera,
CameraAnimation,
ICameraScale,
- LayerGroup,
- MotaRenderer,
- Sprite
-} from '@motajs/render';
-import { PointEffect, PointEffectType } from '../fx/pointShader';
-import { bgmController } from '@user/client-modules';
+ LayerGroup
+} from '@user/client-modules';
import { loading } from '@user/data-base';
import { chaseInit1, clip } from '@user/legacy-plugin-data';
@@ -301,7 +299,7 @@ function processScale(
});
}
-async function wolfMove(chase: Chase) {
+async function wolfMove(_chase: Chase) {
core.moveBlock(23, 17, Array(6).fill('down'), 80);
await sleep(550);
core.setBlock(508, 23, 23);
@@ -701,7 +699,7 @@ function para3(chase: Chase, ani: Animation) {
addLargeContrast(61, 7, ani, chase);
});
const exploded: Set = new Set();
- chase.on('step', (x, y) => {
+ chase.on('step', x => {
if (core.status.floorId !== 'MT14') return;
if (exploded.has(x)) return;
if (x > 20 && x < 49) {
diff --git a/packages-user/legacy-plugin-data/src/fallback.ts b/packages-user/legacy-plugin-data/src/fallback.ts
index 787993c..ae36dce 100644
--- a/packages-user/legacy-plugin-data/src/fallback.ts
+++ b/packages-user/legacy-plugin-data/src/fallback.ts
@@ -1,17 +1,17 @@
-import type {
- RenderAdapter,
- LayerDoorAnimate,
- LayerGroupAnimate,
- LayerFloorBinder,
- HeroRenderer,
- Layer,
- LayerGroup,
- FloorViewport
-} from '@motajs/render';
+import type { RenderAdapter } from '@motajs/render';
import type { TimingFn } from 'mutate-animate';
import { BlockMover, heroMoveCollection, MoveStep } from '@user/data-state';
import { hook, loading } from '@user/data-base';
import { Patch, PatchClass } from '@motajs/legacy-common';
+import type {
+ HeroRenderer,
+ LayerDoorAnimate,
+ LayerGroupAnimate,
+ Layer,
+ FloorViewport,
+ LayerFloorBinder,
+ LayerGroup
+} from '@user/client-modules';
// 向后兼容用,会充当两个版本间过渡的作用
@@ -88,8 +88,8 @@ export function initFallback() {
Mota.r(() => {
// ----- 引入
- const { Camera, MotaRenderer: Renderer } =
- Mota.require('@motajs/render');
+ const { MotaRenderer: Renderer } = Mota.require('@motajs/render');
+ const { Camera } = Mota.require('@user/client-modules');
const Animation = Mota.require('MutateAnimate');
const patch = new Patch(PatchClass.Control);
@@ -116,7 +116,7 @@ export function initFallback() {
'_action_moveAction',
function (data: any, x: number, y: number, prefix: any) {
if (core.canMoveHero()) {
- var nx = core.nextX(),
+ const nx = core.nextX(),
ny = core.nextY();
// 检查noPass决定是撞击还是移动
if (core.noPass(nx, ny)) {
@@ -314,10 +314,10 @@ export function initFallback() {
needKey: boolean,
callback?: () => void
) {
- var block = core.getBlock(x, y);
+ const block = core.getBlock(x, y);
core.saveAndStopAutomaticRoute();
if (!core.events._openDoor_check(block, x, y, needKey)) {
- var locked = core.status.lockControl;
+ const locked = core.status.lockControl;
core.waitHeroToStop(function () {
if (!locked) core.unlockControl();
if (callback) callback();
@@ -383,8 +383,8 @@ export function initFallback() {
if (callback) callback();
return;
}
- var block = core.getBlockById(id);
- var doorInfo = (block.event || {}).doorInfo;
+ const block = core.getBlockById(id);
+ const doorInfo = (block.event || {}).doorInfo;
if (!doorInfo) {
if (callback) callback();
return;
diff --git a/packages/legacy-ui/src/fx/shadow.ts b/packages/legacy-ui/src/fx/shadow.ts
index b495367..427da24 100644
--- a/packages/legacy-ui/src/fx/shadow.ts
+++ b/packages/legacy-ui/src/fx/shadow.ts
@@ -1,12 +1,8 @@
import { mat4 } from 'gl-matrix';
import { logger } from '@motajs/common';
import { WebGLColorArray, createProgram, isWebGL2Supported } from './webgl';
-import {
- ILayerRenderExtends,
- Layer,
- HeroRenderer,
- Sprite
-} from '@motajs/render';
+import { Sprite } from '@motajs/render';
+import { ILayerRenderExtends, Layer, HeroRenderer } from '@user/client-modules';
/**
* 最大光源数量,必须设置,且光源数不能超过这个值,这个值决定了会预留多少的缓冲区,因此最好尽可能小,同时游戏过程中不可修改
@@ -114,7 +110,7 @@ export function createShadow() {
Shadow.update(true);
LayerShadowExtends.shadowList.forEach(v => v.update());
});
- hook.on('changingFloor', floorId => {
+ hook.on('changingFloor', () => {
Shadow.clearBuffer();
Shadow.update(true);
// setCanvasFilterByFloorId(floorId);
diff --git a/packages/legacy-ui/src/preset/index.ts b/packages/legacy-ui/src/preset/index.ts
index 2a89c45..40400c9 100644
--- a/packages/legacy-ui/src/preset/index.ts
+++ b/packages/legacy-ui/src/preset/index.ts
@@ -12,7 +12,6 @@ export * from './ui';
export * from './settings';
export * from './danmaku';
export * from './fixed';
-export * from './hotkey';
export * from './keyboard';
export * from './uiIns';
export * from './settingIns';
diff --git a/packages/legacy-ui/src/ui/skillTree.vue b/packages/legacy-ui/src/ui/skillTree.vue
index 5b165f6..302f0e7 100644
--- a/packages/legacy-ui/src/ui/skillTree.vue
+++ b/packages/legacy-ui/src/ui/skillTree.vue
@@ -90,7 +90,7 @@ import { isNil } from 'lodash-es';
const props = defineProps();
-const skillTree = Mota.require('@user/legacy-plugin-data');
+const skillTree = Mota.require('@user/data-state');
let canvas: HTMLCanvasElement;
let ctx: CanvasRenderingContext2D;
diff --git a/packages/render-core/src/canvas2d.ts b/packages/render-core/src/canvas2d.ts
index 9e7ea0a..c973115 100644
--- a/packages/render-core/src/canvas2d.ts
+++ b/packages/render-core/src/canvas2d.ts
@@ -1,5 +1,4 @@
import { EventEmitter } from 'eventemitter3';
-import { logger } from '@motajs/common';
interface OffscreenCanvasEvent {
/** 当被动触发resize时(例如core.domStyle.scale变化、窗口大小变化)时触发,使用size函数并不会触发 */
@@ -7,16 +6,12 @@ interface OffscreenCanvasEvent {
}
export class MotaOffscreenCanvas2D extends EventEmitter {
- static list: Set = new Set();
-
canvas: HTMLCanvasElement;
ctx: CanvasRenderingContext2D;
width: number;
height: number;
- /** 是否自动跟随样板的core.domStyle.scale进行缩放 */
- autoScale: boolean = false;
/** 是否是高清画布 */
highResolution: boolean = true;
/** 是否启用抗锯齿 */
@@ -27,12 +22,6 @@ export class MotaOffscreenCanvas2D extends EventEmitter {
/** 更新标识符,如果发生变化则说明画布被动清空 */
symbol: number = 0;
- private _freezed: boolean = false;
- /** 当前画布是否被冻结 */
- get freezed() {
- return this._freezed;
- }
-
private _active: boolean = true;
get active() {
return this._active;
@@ -46,65 +35,52 @@ export class MotaOffscreenCanvas2D extends EventEmitter {
*/
constructor(alpha: boolean = true, canvas?: HTMLCanvasElement) {
super();
- // console.trace();
-
this.canvas = canvas ?? document.createElement('canvas');
this.ctx = this.canvas.getContext('2d', { alpha })!;
this.width = this.canvas.width / devicePixelRatio;
this.height = this.canvas.height / devicePixelRatio;
+ }
- MotaOffscreenCanvas2D.list.add(this);
+ /**
+ * 设置画布的缩放比
+ * @param scale 缩放比
+ */
+ setScale(scale: number) {
+ if (scale === this.scale) {
+ this.clear();
+ return;
+ }
+ this.scale = scale;
+ let ratio = this.highResolution ? devicePixelRatio : 1;
+ ratio *= this.scale;
+ this.canvas.width = this.width * ratio;
+ this.canvas.height = this.height * ratio;
+ this.ctx.setTransform(1, 0, 0, 1, 0, 0);
+ this.ctx.scale(ratio, ratio);
+ this.ctx.imageSmoothingEnabled = this.antiAliasing;
}
/**
* 设置画布的大小
*/
size(width: number, height: number) {
- if (this._freezed) {
- logger.warn(33);
- return;
- }
const w = Math.max(width, 1);
const h = Math.max(height, 1);
let ratio = this.highResolution ? devicePixelRatio : 1;
- const scale = core.domStyle.scale;
- if (this.autoScale) {
- ratio *= scale;
- }
- this.scale = ratio;
+ ratio *= this.scale;
this.canvas.width = w * ratio;
this.canvas.height = h * ratio;
this.width = w;
- this.height = height;
+ this.height = h;
this.ctx.setTransform(1, 0, 0, 1, 0, 0);
this.ctx.scale(ratio, ratio);
this.ctx.imageSmoothingEnabled = this.antiAliasing;
- if (this.canvas.isConnected) {
- this.canvas.style.width = `${w * scale}px`;
- this.canvas.style.height = `${h * scale}px`;
- }
- }
-
- /**
- * 设置当前画布是否跟随样板的 core.domStyle.scale 一同进行缩放
- */
- withGameScale(auto: boolean) {
- if (this._freezed) {
- logger.warn(33);
- return;
- }
- this.autoScale = auto;
- this.size(this.width, this.height);
}
/**
* 设置当前画布是否为高清画布
*/
setHD(hd: boolean) {
- if (this._freezed) {
- logger.warn(33);
- return;
- }
this.highResolution = hd;
this.size(this.width, this.height);
}
@@ -113,10 +89,6 @@ export class MotaOffscreenCanvas2D extends EventEmitter {
* 设置当前画布的抗锯齿设置
*/
setAntiAliasing(anti: boolean) {
- if (this._freezed) {
- logger.warn(33);
- return;
- }
this.antiAliasing = anti;
this.ctx.imageSmoothingEnabled = anti;
}
@@ -125,56 +97,12 @@ export class MotaOffscreenCanvas2D extends EventEmitter {
* 清空画布
*/
clear() {
- if (this._freezed) {
- logger.warn(33);
- return;
- }
this.ctx.save();
this.ctx.setTransform(1, 0, 0, 1, 0, 0);
this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
this.ctx.restore();
}
- /**
- * 删除这个画布
- */
- delete() {
- this.canvas.remove();
- this.ctx.reset();
- this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
- this._freezed = true;
- MotaOffscreenCanvas2D.list.delete(this);
- }
-
- /**
- * 冻结这个画布的属性,之后便不能被修改,同时会从画布列表中删去。
- */
- freeze() {
- this._freezed = true;
- MotaOffscreenCanvas2D.list.delete(this);
- }
-
- /**
- * 使此画布生效,使用前请务必调用此函数,生效后会跟随游戏的放缩比例更改大小,但会导致不会被垃圾回收
- */
- activate() {
- if (this._active || this._freezed) return;
- MotaOffscreenCanvas2D.list.add(this);
- if (this.autoScale) {
- this.size(this.width, this.height);
- this.symbol++;
- this.emit('resize');
- }
- }
-
- /**
- * 使此画布失效,当这个画布暂时不会被使用时请务必调用此函数,失效后若没有对此画布的引用,那么会自动垃圾回收
- */
- deactivate() {
- if (!this._active || this._freezed) return;
- MotaOffscreenCanvas2D.list.delete(this);
- }
-
/**
* 复制一个离屏Canvas2D对象,一般用于缓存等操作
* @param canvas 被复制的MotaOffscreenCanvas2D对象
@@ -183,7 +111,6 @@ export class MotaOffscreenCanvas2D extends EventEmitter {
static clone(canvas: MotaOffscreenCanvas2D): MotaOffscreenCanvas2D {
const newCanvas = new MotaOffscreenCanvas2D();
newCanvas.setHD(canvas.highResolution);
- newCanvas.withGameScale(canvas.autoScale);
newCanvas.size(canvas.width, canvas.height);
newCanvas.ctx.drawImage(
canvas.canvas,
@@ -192,23 +119,6 @@ export class MotaOffscreenCanvas2D extends EventEmitter {
canvas.width,
canvas.height
);
- newCanvas.freeze();
return newCanvas;
}
-
- static refreshAll(force: boolean = false) {
- this.list.forEach(v => {
- if (force || v.autoScale) {
- v.size(v.width, v.height);
- v.symbol++;
- v.emit('resize');
- }
- });
- }
}
-
-window.addEventListener('resize', () => {
- requestAnimationFrame(() => {
- MotaOffscreenCanvas2D.refreshAll();
- });
-});
diff --git a/packages/render-core/src/container.ts b/packages/render-core/src/container.ts
index 5809dd8..d402662 100644
--- a/packages/render-core/src/container.ts
+++ b/packages/render-core/src/container.ts
@@ -42,6 +42,11 @@ export class Container
});
}
+ onResize(scale: number): void {
+ this.sortedChildren.forEach(v => v.onResize(scale));
+ super.onResize(scale);
+ }
+
requestSort() {
if (!this.needSort) {
this.needSort = true;
diff --git a/packages/render-core/src/gl2.ts b/packages/render-core/src/gl2.ts
index 794a46b..a0ea302 100644
--- a/packages/render-core/src/gl2.ts
+++ b/packages/render-core/src/gl2.ts
@@ -184,6 +184,11 @@ export abstract class GL2 extends RenderItem<
this.init();
}
+ onResize(scale: number): void {
+ this.sizeGL(this.width, this.height);
+ super.onResize(scale);
+ }
+
setHD(hd: boolean): void {
super.setHD(hd);
this.sizeGL(this.width, this.height);
@@ -196,7 +201,7 @@ export abstract class GL2 extends RenderItem<
private sizeGL(width: number, height: number) {
const ratio = this.highResolution ? devicePixelRatio : 1;
- const scale = ratio * core.domStyle.scale;
+ const scale = ratio * this.cache.scale;
this.canvas.width = width * scale;
this.canvas.height = height * scale;
}
diff --git a/packages/render-core/src/item.ts b/packages/render-core/src/item.ts
index 5924d8d..44c713e 100644
--- a/packages/render-core/src/item.ts
+++ b/packages/render-core/src/item.ts
@@ -132,6 +132,14 @@ export interface IRenderTickerSupport {
hasTicker(id: number): boolean;
}
+export interface IRenderEvent {
+ /**
+ * 当触发缩放事件时,此函数执行的内容
+ * @param scale 缩放至的缩放比
+ */
+ onResize(scale: number): void;
+}
+
export interface IRenderVueSupport {
/**
* 在 jsx, vue 中当属性改变后触发此函数,用于处理响应式等情况
@@ -185,6 +193,10 @@ export interface IRenderTreeRoot {
hoverElement(element: RenderItem): void;
}
+interface RenderItemCanvasData {
+ autoScale: boolean;
+}
+
export interface ERenderItemEvent extends ERenderItemActionEvent {
beforeRender: [transform: Transform];
afterRender: [transform: Transform];
@@ -213,7 +225,8 @@ export abstract class RenderItem
IRenderTickerSupport,
IRenderChildable,
IRenderVueSupport,
- ITransformUpdatable
+ ITransformUpdatable,
+ IRenderEvent
{
/** 渲染的全局ticker */
static ticker: Ticker = new Ticker();
@@ -332,6 +345,11 @@ export abstract class RenderItem
readonly transformFallThrough: boolean = false;
/** 这个渲染元素使用到的所有画布 */
protected readonly canvases: Set = new Set();
+ /** 这个渲染元素每个画布的配置信息 */
+ private readonly canvasMap: Map<
+ MotaOffscreenCanvas2D,
+ RenderItemCanvasData
+ > = new Map();
//#endregion
//#region 交互事件
@@ -371,11 +389,8 @@ export abstract class RenderItem
this._transform.bind(this);
this.cache = this.requireCanvas();
- this.cache.withGameScale(true);
if (!enableCache) {
- this.cache.withGameScale(false);
this.cache.size(1, 1);
- this.cache.freeze();
}
}
@@ -439,10 +454,12 @@ export abstract class RenderItem
/**
* 申请一个 `MotaOffscreenCanvas2D`,即申请一个画布
* @param alpha 是否启用画布的 alpha 通道
+ * @param autoScale 是否自动跟随缩放
*/
- protected requireCanvas(alpha: boolean = true) {
+ requireCanvas(alpha: boolean = true, autoScale: boolean = false) {
const canvas = new MotaOffscreenCanvas2D(alpha);
this.canvases.add(canvas);
+ this.canvasMap.set(canvas, { autoScale });
return canvas;
}
@@ -450,9 +467,20 @@ export abstract class RenderItem
* 删除由 `requireCanvas` 申请的画布,当画布不再使用时,可以用该方法删除画布
* @param canvas 要删除的画布
*/
- protected deleteCanvas(canvas: MotaOffscreenCanvas2D) {
- if (!this.canvases.delete(canvas)) return;
- canvas.delete();
+ deleteCanvas(canvas: MotaOffscreenCanvas2D) {
+ this.canvases.delete(canvas);
+ this.canvasMap.delete(canvas);
+ }
+
+ //#region 事件处理
+
+ onResize(scale: number): void {
+ this.cache.setScale(scale);
+ this.canvases.forEach(v => {
+ if (this.canvasMap.get(v)?.autoScale) {
+ v.setScale(scale);
+ }
+ });
}
//#region 修改元素属性
@@ -736,7 +764,6 @@ export abstract class RenderItem
this.update();
this.checkRoot();
this._root?.connect(this);
- this.canvases.forEach(v => v.activate());
this._transform.bind(this);
}
@@ -751,7 +778,6 @@ export abstract class RenderItem
this._parent = void 0;
parent.requestSort();
parent.update();
- this.canvases.forEach(v => v.deactivate());
this._transform.bind();
if (!success) return false;
this._root?.disconnect(this);
@@ -1257,8 +1283,6 @@ export abstract class RenderItem
this.remove();
this.emit('destroy');
this.removeAllListeners();
- this.cache.delete();
- this.canvases.forEach(v => v.delete());
this.canvases.clear();
}
}
diff --git a/packages/render-core/src/render.ts b/packages/render-core/src/render.ts
index ef70e98..c6bf273 100644
--- a/packages/render-core/src/render.ts
+++ b/packages/render-core/src/render.ts
@@ -42,6 +42,9 @@ export interface MotaRendererConfig {
export class MotaRenderer extends Container implements IRenderTreeRoot {
static list: Map = new Map();
+ /** 缩放比 */
+ private scale: number = 1;
+
/** 所有连接到此根元素的渲染元素的 id 到元素自身的映射 */
protected idMap: Map = new Map();
@@ -79,7 +82,6 @@ export class MotaRenderer extends Container implements IRenderTreeRoot {
}
this.target = new MotaOffscreenCanvas2D(config.alpha ?? true, canvas);
this.size(config.width, config.height);
- this.target.withGameScale(true);
this.target.setAntiAliasing(false);
this.setAnchor(0.5, 0.5);
@@ -98,6 +100,31 @@ export class MotaRenderer extends Container implements IRenderTreeRoot {
this.listen();
}
+ /**
+ * 设置这个渲染器的缩放比
+ * @param scale 缩放比
+ */
+ setScale(scale: number) {
+ this.scale = scale;
+ this.onResize(scale);
+ }
+
+ /**
+ * 获取这个渲染器的缩放比
+ */
+ getScale() {
+ return this.scale;
+ }
+
+ onResize(scale: number): void {
+ this.target.setScale(scale);
+ const width = this.target.width * scale;
+ const height = this.target.height * scale;
+ this.target.canvas.style.width = `${width}px`;
+ this.target.canvas.style.height = `${height}px`;
+ super.onResize(scale);
+ }
+
private getMountCanvas(canvas: string | HTMLCanvasElement) {
if (typeof canvas === 'string') {
return document.querySelector(canvas) as HTMLCanvasElement;
@@ -576,7 +603,6 @@ export class MotaRenderer extends Container implements IRenderTreeRoot {
destroy() {
super.destroy();
MotaRenderer.list.delete(this.id);
- this.target.delete();
this.abort?.abort();
}
diff --git a/packages/render-core/src/utils.ts b/packages/render-core/src/utils.ts
index d8d8979..54350e8 100644
--- a/packages/render-core/src/utils.ts
+++ b/packages/render-core/src/utils.ts
@@ -1,6 +1,4 @@
import { TimingFn } from 'mutate-animate';
-// import { RenderAdapter } from './adapter';
-// import { FloorViewport } from './preset/viewport';
import { JSX } from 'vue/jsx-runtime';
import { DefineComponent, DefineSetupFnComponent } from 'vue';
import { MotaOffscreenCanvas2D } from './canvas2d';
@@ -14,10 +12,10 @@ export type Props<
> = T extends keyof JSX.IntrinsicElements
? JSX.IntrinsicElements[T]
: T extends DefineSetupFnComponent
- ? InstanceType['$props'] & InstanceType['$emits']
- : T extends DefineComponent
- ? InstanceType['$props'] & InstanceType['$emits']
- : unknown;
+ ? InstanceType['$props'] & InstanceType['$emits']
+ : T extends DefineComponent
+ ? InstanceType['$props'] & InstanceType['$emits']
+ : unknown;
export type ElementLocator = [
x?: number,
diff --git a/packages/render-elements/src/index.ts b/packages/render-elements/src/index.ts
index 1361fb6..17db1e8 100644
--- a/packages/render-elements/src/index.ts
+++ b/packages/render-elements/src/index.ts
@@ -1,24 +1,3 @@
-import { createCache } from './cache';
-import { createFrame } from './frame';
-import { createLayer } from './layer';
-import { createViewport } from './viewport';
-
-export function create() {
- createCache();
- createFrame();
- createLayer();
- createViewport();
-}
-
-export * from './animate';
-export * from './block';
-export * from './cache';
-export * from './camera';
-export * from './frame';
export * from './graphics';
-export * from './hero';
-export * from './layer';
export * from './misc';
export * from './types';
-export * from './utils';
-export * from './viewport';