diff --git a/.gitignore b/.gitignore index 0a9cc494..2e549c59 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,6 @@ stats.html vite-test/dist examples/spine38.html examples/loader.html -package-lock.json \ No newline at end of file +package-lock.json + +pnpm-lock.yaml \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..876990fc --- /dev/null +++ b/Makefile @@ -0,0 +1,15 @@ +clean: + @lerna clean + +install: + @npm install --force + @lerna bootstrap + +build: clean install + @npm run build spine-base -- --types + @npm run build -- --types + +link: + @node scripts/link.js + +all: build link \ No newline at end of file diff --git a/examples/src/addChildAt.ts b/examples/src/addChildAt.ts new file mode 100644 index 00000000..7de11be2 --- /dev/null +++ b/examples/src/addChildAt.ts @@ -0,0 +1,56 @@ +import { RendererSystem } from "@eva/plugin-renderer"; +import { Game, GameObject, RESOURCE_TYPE, resource } from "@eva/eva.js" +import { Img, ImgSystem } from "@eva/plugin-renderer-img"; +export const name = 'image'; +export async function init(canvas) { + resource.addResource([ + { + name: 'imageName', + type: RESOURCE_TYPE.IMAGE, + src: { + image: { + type: 'png', + url: 'https://gw.alicdn.com/tfs/TB1DNzoOvb2gK0jSZK9XXaEgFXa-658-1152.webp', + }, + }, + preload: true, + }, + ]); + const game = new Game({ + systems: [ + new RendererSystem({ + canvas, + width: 750, + height: 1000, + }), + new ImgSystem(), + ], + }); + + + + window.test = (index: number) => { + + const image = new GameObject('image', { + size: { width: 500, height: 500 }, + origin: { x: 0, y: 0 }, + position: { + x: Math.random() * 650, + y: Math.random() * 800, + }, + anchor: { + x: 0, + y: 0, + }, + }); + + image.addComponent( + new Img({ + resource: 'imageName', + }), + ); + + game.scene.addChildAt(image, index); + + } +} \ No newline at end of file diff --git a/package.json b/package.json index 9798a4a6..6a14c12e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "1.2.7", + "version": "1.2.7-editor.12", "workspace": "packages", "name": "eva.js", "scripts": { @@ -65,6 +65,7 @@ "lerna": "^3.22.1", "minimist": "^1.2.5", "prettier": "^2.2.1", + "reflect-metadata": "^0.1.13", "reset.css": "^2.0.2", "rollup": "^2.40.0", "rollup-plugin-inject": "^3.0.2", diff --git a/packages/eva.js/__tests__/decorators.spec.ts b/packages/eva.js/__tests__/decorators.spec.ts index 958c8a6d..1c74a6a7 100644 --- a/packages/eva.js/__tests__/decorators.spec.ts +++ b/packages/eva.js/__tests__/decorators.spec.ts @@ -1,26 +1,19 @@ -import { type } from '@eva/inspector-decorator' -import {decorators, System} from '../lib'; +import { Field, getPropertiesOf } from '@eva/inspector-decorator'; +import { decorators, System } from '../lib'; -const {componentObserver} = decorators; +const { componentObserver } = decorators; describe('decorators', () => { it('ide decorator should collect props', () => { class Test { - static IDEProps: any = {}; - - @type('string') public name: string = 'Test'; - @type('size') public size: number[] = [10, 10]; + @Field() public name: string = 'Test'; + @Field(() => Number) public size: number[] = [10, 10]; } - expect(Test.IDEProps).toEqual({ - name: { - key: 'name', - type: 'string' - }, - size: { - key: 'size', - type: 'size' - } - }); + const attrs = getPropertiesOf(Test); + expect(attrs.children[0].type).toBe('string'); + expect(attrs.children[0].isArray).toBe(false); + expect(attrs.children[1].type).toBe('number'); + expect(attrs.children[1].isArray).toBe(true); }); it('class use component observer decorator', () => { diff --git a/packages/eva.js/lib/core/GameObject.ts b/packages/eva.js/lib/core/GameObject.ts index f2fb91ca..e47bd02c 100644 --- a/packages/eva.js/lib/core/GameObject.ts +++ b/packages/eva.js/lib/core/GameObject.ts @@ -112,6 +112,24 @@ class GameObject { gameObject.scene = this.scene; } + /** + * + * @param gameObject Child GameObject + * @param index Add to index in children + */ + addChildAt(gameObject: GameObject, index: number) { + if (index > this.transform.children.length) { + throw new Error( + gameObject.name + 'addChildAt: The index 18 supplied is out of bounds ' + this.transform.children.length, + ); + } + gameObject.transform.childIndex = index; + this.addChild(gameObject); + // packages/eva.js/lib/core/GameObject.ts > addChildAt + // packages/plugin-renderer/lib/Transform.ts > change + // packages/eva.js/lib/core/Transform.ts > addChild + } + /** * Remove child gameObject * @param gameObject - child gameobject @@ -135,7 +153,7 @@ class GameObject { addComponent>(C: T): T; addComponent>(C: ComponentConstructor, obj?: ComponentParams): T; addComponent>(C: T | ComponentConstructor, obj?: ComponentParams): T { - if (this.destroyed) return + if (this.destroyed) return; const componentName = getComponentName(C); if (this._componentCache[componentName]) return; @@ -238,8 +256,8 @@ class GameObject { /** Destory this gameObject */ destroy() { if (!this.transform) { - console.error('Cannot destroy gameObject that have already been destroyed.') - return + console.error('Cannot destroy gameObject that have already been destroyed.'); + return; } Array.from(this.transform.children).forEach(({ gameObject }) => { gameObject.destroy(); @@ -250,7 +268,7 @@ class GameObject { this._removeComponent(key); } this.components.length = 0; - this.destroyed = true + this.destroyed = true; } } diff --git a/packages/eva.js/lib/core/Transform.ts b/packages/eva.js/lib/core/Transform.ts index 5d41b3b3..8fc78165 100644 --- a/packages/eva.js/lib/core/Transform.ts +++ b/packages/eva.js/lib/core/Transform.ts @@ -1,4 +1,4 @@ -import {type, step} from '@eva/inspector-decorator'; +import { Field } from '@eva/inspector-decorator'; import Component from './Component'; import type { ComponentParams } from './Component'; @@ -10,9 +10,6 @@ interface Vector2 { y: number; } -/** - * Two dimensional size - */ interface Size2 { width: number; height: number; @@ -56,6 +53,9 @@ class Transform extends Component { readonly name: string = 'Transform'; private _parent: Transform = null; + /** only used in addChildAt */ + childIndex: number = -1; + /** Whether this transform in a scene object */ inScene: boolean = false; @@ -77,13 +77,18 @@ class Transform extends Component { this.rotation = params.rotation || this.rotation; } - @type('vector2') @step(1) position: Vector2 = {x: 0, y: 0}; - @type('size') @step(1) size: Size2 = {width: 0, height: 0}; - @type('vector2') @step(0.1) origin: Vector2 = {x: 0, y: 0}; - @type('vector2') @step(0.1) anchor: Vector2 = {x: 0, y: 0}; - @type('vector2') @step(0.1) scale: Vector2 = {x: 1, y: 1}; - @type('vector2') @step(0.1) skew: Vector2 = {x: 0, y: 0}; - @type('number') @step(0.1) rotation: number = 0; + @Field({ type: 'vector2', step: 0.01 }) position = { x: 0, y: 0 }; + @Field({ + type: 'size2', + step: 0.01, + min: 0, + }) + size: Size2 = { width: 0, height: 0 }; + @Field({ type: 'vector2', step: 0.01 }) origin: Vector2 = { x: 0, y: 0 }; + @Field({ type: 'vector2', step: 0.01 }) anchor: Vector2 = { x: 0, y: 0 }; + @Field({ type: 'vector2', bindable: true, step: 0.01, min: 0 }) scale: Vector2 = { x: 1, y: 1 }; + @Field({ type: 'vector2', step: 0.01 }) skew: Vector2 = { x: 0, y: 0 }; + @Field({ step: 0.01 }) rotation: number = 0; set parent(val: Transform) { if (val) { @@ -108,14 +113,18 @@ class Transform extends Component { * @param child - child gameObject's transform component */ addChild(child: Transform) { - if (child.parent === this) { - const index = this.children.findIndex(item => item === child); - this.children.splice(index, 1); - } else if (child.parent) { + if (child.parent) { child.parent.removeChild(child); } child._parent = this; - this.children.push(child); + if (child.childIndex > -1) { + // packages/eva.js/lib/core/GameObject.ts > addChildAt + // packages/plugin-renderer/lib/Transform.ts > change + // packages/eva.js/lib/core/Transform.ts > addChild + this.children.splice(child.childIndex, 0, child); + } else { + this.children.push(child); + } } /** diff --git a/packages/eva.js/lib/decorators/ide.ts b/packages/eva.js/lib/decorators/ide.ts deleted file mode 100644 index f7e996d1..00000000 --- a/packages/eva.js/lib/decorators/ide.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Collect property which react in Editor, such as EVA Design - * @param target - component instance - * @param propertyKey - property name - */ -export function IDEProp(target, propertyKey) { - if (!target.constructor.IDEProps) { - target.constructor.IDEProps = []; - } - target.constructor.IDEProps.push(propertyKey); -} - diff --git a/packages/eva.js/lib/game/Game.ts b/packages/eva.js/lib/game/Game.ts index 1f14d0e8..c9387000 100644 --- a/packages/eva.js/lib/game/Game.ts +++ b/packages/eva.js/lib/game/Game.ts @@ -5,7 +5,7 @@ import System from '../core/System'; import Component from '../core/Component'; import { setSystemObserver, initObserver } from '../core/observer'; import EventEmitter from 'eventemitter3'; - +import { shouldExecuteInEditMode } from '@eva/inspector-decorator'; /** eva plugin struct */ export interface PluginStruct { @@ -13,6 +13,8 @@ export interface PluginStruct { Systems?: typeof System[]; } +type Mode = 'EDIT' | 'PLAY'; + interface GameParams { /** isn't game will auto start */ autoStart?: boolean; @@ -25,6 +27,8 @@ interface GameParams { /** whether or not need to create scene */ needScene?: boolean; + /** */ + mode?: Mode; } export enum LOAD_SCENE_MODE { @@ -38,8 +42,8 @@ interface LoadSceneParams { params?: { width?: number; height?: number; - canvas?: HTMLCanvasElement - renderType?: number + canvas?: HTMLCanvasElement; + renderType?: number; autoStart?: boolean; sharedTicker?: boolean; sharedLoader?: boolean; @@ -53,7 +57,7 @@ interface LoadSceneParams { forceFXAA?: boolean; legacy?: boolean; autoResize?: boolean; - powerPreference?: "high-performance"; + powerPreference?: 'high-performance'; }; } @@ -86,28 +90,6 @@ const getAllGameObjects = game => { return [...mainSceneGameObjects, ...otherSceneGameObjects]; }; -const gameObjectLoop = (e, gameObjects = []) => { - for (const gameObject of gameObjects) { - for (const component of gameObject.components) { - try { - triggerStart(component); - component.update && component.update(e); - } catch (e) { - console.error(`gameObject: ${gameObject.name} ${component.name} update error`, e); - } - } - } - for (const gameObject of gameObjects) { - for (const component of gameObject.components) { - try { - component.lateUpdate && component.lateUpdate(e); - } catch (e) { - console.error(`gameObject: ${gameObject.name} ${component.name} lateUpdate error`, e); - } - } - } -}; - const gameObjectResume = gameObjects => { for (const gameObject of gameObjects) { for (const component of gameObject.components) { @@ -152,8 +134,11 @@ class Game extends EventEmitter { /** Systems alled to this game */ systems: System[] = []; - constructor({ systems, frameRate = 60, autoStart = true, needScene = true }: GameParams = {}) { + mode: Mode = 'PLAY'; + + constructor({ systems, frameRate = 60, autoStart = true, needScene = true, mode = 'PLAY' }: GameParams = {}) { super(); + this.mode = mode; if (window.__EVA_INSPECTOR_ENV__) { window.__EVA_GAME_INSTANCE__ = this; } @@ -307,7 +292,7 @@ class Game extends EventEmitter { */ initTicker() { this.ticker.add(e => { - this.scene && gameObjectLoop(e, this.gameObjects); + this.scene && this.gameObjectLoop(e, this.gameObjects); for (const system of this.systems) { try { triggerStart(system); @@ -391,6 +376,36 @@ class Game extends EventEmitter { } this.emit('sceneChanged', { scene, mode, params }); } + + private shouldUpdate(component) { + return this.mode === 'PLAY' || (this.mode === 'EDIT' && shouldExecuteInEditMode(component.constructor)); + } + + private gameObjectLoop(e, gameObjects = []) { + for (const gameObject of gameObjects) { + for (const component of gameObject.components) { + try { + if (this.shouldUpdate(component)) { + triggerStart(component); + component.update && component.update(e); + } + } catch (e) { + console.error(`gameObject: ${gameObject.name} ${component.name} update error`, e); + } + } + } + for (const gameObject of gameObjects) { + for (const component of gameObject.components) { + try { + if (this.shouldUpdate(component)) { + component.lateUpdate && component.lateUpdate(e); + } + } catch (e) { + console.error(`gameObject: ${gameObject.name} ${component.name} lateUpdate error`, e); + } + } + } + } } export default Game; diff --git a/packages/eva.js/lib/index.ts b/packages/eva.js/lib/index.ts index 7922f098..bf46b654 100644 --- a/packages/eva.js/lib/index.ts +++ b/packages/eva.js/lib/index.ts @@ -1,3 +1,4 @@ +import 'reflect-metadata'; import Component from './core/Component'; import { ObserverType } from './core/observer'; import GameObject from './core/GameObject'; @@ -5,13 +6,11 @@ import System from './core/System'; import Transform from './core/Transform'; import Game, { LOAD_SCENE_MODE } from './game/Game'; import Scene from './game/Scene'; -import { IDEProp } from './decorators/ide'; import { componentObserver } from './decorators/system'; import { resource, LOAD_EVENT, RESOURCE_TYPE, RESOURCE_TYPE_STRATEGY, resourceLoader } from './loader/Resource'; /** Decorators util */ const decorators = { - IDEProp, componentObserver, }; @@ -42,8 +41,7 @@ export { RESOURCE_TYPE, ObserverType as OBSERVER_TYPE, LOAD_SCENE_MODE, - IDEProp, componentObserver, RESOURCE_TYPE_STRATEGY, - resourceLoader -}; \ No newline at end of file + resourceLoader, +}; diff --git a/packages/eva.js/package.json b/packages/eva.js/package.json index 528fb1a2..63320b19 100644 --- a/packages/eva.js/package.json +++ b/packages/eva.js/package.json @@ -1,6 +1,6 @@ { "name": "@eva/eva.js", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/eva.js", "main": "index.js", "module": "dist/eva.js.esm.js", @@ -18,11 +18,12 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/inspector-decorator": "^0.0.5", + "@eva/inspector-decorator": "^0.1.0-alpha.3", "eventemitter3": "^3.1.2", "lodash-es": "^4.17.21", "mini-signals": "^1.2.0", "parse-uri": "^1.0.3", + "reflect-metadata": "^0.1.13", "resource-loader": "^4.0.0-rc4", "sprite-timeline": "^1.10.2" } diff --git a/packages/miniprogram-adapter/package.json b/packages/miniprogram-adapter/package.json index c34a1170..b1a86aa6 100644 --- a/packages/miniprogram-adapter/package.json +++ b/packages/miniprogram-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@eva/miniprogram-adapter", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/miniprogram-adapter", "main": "index.js", "module": "dist/miniprogram-adapter.esm.js", @@ -24,6 +24,6 @@ ] }, "dependencies": { - "@eva/miniprogram-pixi": "1.2.7" + "@eva/miniprogram-pixi": "1.2.7-editor.12" } } diff --git a/packages/miniprogram-pixi/package.json b/packages/miniprogram-pixi/package.json index da021262..7bddad0f 100644 --- a/packages/miniprogram-pixi/package.json +++ b/packages/miniprogram-pixi/package.json @@ -1,6 +1,6 @@ { "name": "@eva/miniprogram-pixi", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/miniprogram-pixi", "main": "index.js", "module": "dist/miniprogram-pixi.esm.js", diff --git a/packages/plugin-a11y/lib/A11y.ts b/packages/plugin-a11y/lib/A11y.ts index 11b9705e..1ca1b31a 100644 --- a/packages/plugin-a11y/lib/A11y.ts +++ b/packages/plugin-a11y/lib/A11y.ts @@ -1,6 +1,6 @@ -import {Component} from '@eva/eva.js'; -import {type, step} from '@eva/inspector-decorator'; -import {uuid} from './utils'; +import { Component } from '@eva/eva.js'; +import { Field } from '@eva/inspector-decorator'; +import { uuid } from './utils'; export interface A11yParams { hint: string; @@ -20,11 +20,11 @@ export default class A11y extends Component { /** * 是否可交互 */ - @type('boolean') interactive: boolean; + @Field() interactive: boolean; /** * 无障碍标签朗读内容 */ - @type('string') hint: string; + @Field() hint: string; /** * 弃用,将根据Event组件自动添加 * 事件对象 @@ -33,12 +33,12 @@ export default class A11y extends Component { /** * 延时加载时间(millisecond) */ - @type('number') @step(1) delay: number; + @Field({ step: 1 }) delay: number; /** * role 属性 */ - @type('string') role: string; + @Field() role: string; /** * 弃用,将属性写在component上 @@ -65,7 +65,7 @@ export default class A11y extends Component { /** * 辅助Dom id 自动生成 */ - @type('string') a11yId: string; + @Field() a11yId: string; /** * 无障碍组件构造函数 diff --git a/packages/plugin-a11y/package.json b/packages/plugin-a11y/package.json index 2fb8e7fc..0b539501 100644 --- a/packages/plugin-a11y/package.json +++ b/packages/plugin-a11y/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-a11y", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-a11y", "main": "index.js", "module": "dist/plugin-a11y.esm.js", @@ -18,9 +18,9 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/eva.js": "1.2.7", - "@eva/inspector-decorator": "^0.0.5", - "@eva/plugin-renderer": "1.2.7", + "@eva/eva.js": "1.2.7-editor.12", + "@eva/inspector-decorator": "0.1.0-alpha.3", + "@eva/plugin-renderer": "1.2.7-editor.12", "eventemitter3": "^3.1.2" } } diff --git a/packages/plugin-evax/package.json b/packages/plugin-evax/package.json index 290c695c..2fc8f7f2 100644 --- a/packages/plugin-evax/package.json +++ b/packages/plugin-evax/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-evax", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-evax", "main": "index.js", "module": "dist/plugin-evax.esm.js", @@ -18,7 +18,7 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/eva.js": "1.2.7", + "@eva/eva.js": "1.2.7-editor.12", "eventemitter3": "^3.1.2", "lodash-es": "^4.17.21" } diff --git a/packages/plugin-matterjs/package.json b/packages/plugin-matterjs/package.json index 7a49460b..4266bcc6 100644 --- a/packages/plugin-matterjs/package.json +++ b/packages/plugin-matterjs/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-matterjs", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-matterjs", "main": "index.js", "module": "dist/plugin-matterjs.esm.js", @@ -18,7 +18,7 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/eva.js": "1.2.7", + "@eva/eva.js": "1.2.7-editor.12", "@types/matter-js": "^0.17.5", "poly-decomp": "^0.3.0" } diff --git a/packages/plugin-renderer-dragonbone/lib/component.ts b/packages/plugin-renderer-dragonbone/lib/component.ts index 4a0eaa15..1d6ce555 100644 --- a/packages/plugin-renderer-dragonbone/lib/component.ts +++ b/packages/plugin-renderer-dragonbone/lib/component.ts @@ -1,4 +1,4 @@ -import { type } from '@eva/inspector-decorator'; +import { Field } from '@eva/inspector-decorator'; import DragonboneEngine from './engine'; import { Component, ComponentParams } from '@eva/eva.js'; @@ -18,10 +18,10 @@ export default class DragonBone extends Component { private waitPlayInfo: { animationName: string; times?: number } = { animationName: null, }; - @type('string') resource: string = ''; - @type('string') armatureName: string = ''; - @type('string') animationName: string = ''; - @type('boolean') autoPlay: boolean = true; + @Field() resource: string = ''; + @Field() armatureName: string = ''; + @Field() animationName: string = ''; + @Field() autoPlay: boolean = true; init(obj?: DragonBoneParams) { if (!obj) return; diff --git a/packages/plugin-renderer-dragonbone/package.json b/packages/plugin-renderer-dragonbone/package.json index ada4ccc9..0022a35d 100644 --- a/packages/plugin-renderer-dragonbone/package.json +++ b/packages/plugin-renderer-dragonbone/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-renderer-dragonbone", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-renderer-dragonbone", "main": "index.js", "module": "dist/plugin-renderer-dragonbone.esm.js", @@ -18,9 +18,9 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/inspector-decorator": "^0.0.5", - "@eva/plugin-renderer": "1.2.7", - "@eva/eva.js": "1.2.7", + "@eva/inspector-decorator": "0.1.0-alpha.3", + "@eva/plugin-renderer": "1.2.7-editor.12", + "@eva/eva.js": "1.2.7-editor.12", "pixi.js": "^4.8.7" } } diff --git a/packages/plugin-renderer-event/package.json b/packages/plugin-renderer-event/package.json index a8186a3e..41e10491 100644 --- a/packages/plugin-renderer-event/package.json +++ b/packages/plugin-renderer-event/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-renderer-event", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-renderer-event", "main": "index.js", "module": "dist/plugin-renderer-event.esm.js", @@ -18,8 +18,8 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/plugin-renderer": "1.2.7", - "@eva/eva.js": "1.2.7", + "@eva/plugin-renderer": "1.2.7-editor.12", + "@eva/eva.js": "1.2.7-editor.12", "pixi.js": "^4.8.7" } } diff --git a/packages/plugin-renderer-graphics/package.json b/packages/plugin-renderer-graphics/package.json index dd22c051..46c46bcd 100644 --- a/packages/plugin-renderer-graphics/package.json +++ b/packages/plugin-renderer-graphics/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-renderer-graphics", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-renderer-graphics", "main": "index.js", "module": "dist/plugin-renderer-graphics.esm.js", @@ -18,7 +18,7 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/plugin-renderer": "1.2.7", - "@eva/eva.js": "1.2.7" + "@eva/plugin-renderer": "1.2.7-editor.12", + "@eva/eva.js": "1.2.7-editor.12" } } diff --git a/packages/plugin-renderer-img/lib/component.ts b/packages/plugin-renderer-img/lib/component.ts index 8a78b093..c86ca2e9 100644 --- a/packages/plugin-renderer-img/lib/component.ts +++ b/packages/plugin-renderer-img/lib/component.ts @@ -1,4 +1,4 @@ -import { type } from '@eva/inspector-decorator'; +import { Field } from '@eva/inspector-decorator'; import { Component } from '@eva/eva.js'; export interface ImgParams { @@ -7,7 +7,7 @@ export interface ImgParams { export default class Img extends Component { static componentName: string = 'Img'; - @type('string') resource: string = ''; + @Field({ type: 'resource' }) resource: string = ''; init(obj?: ImgParams) { if (obj && obj.resource) { this.resource = obj.resource; diff --git a/packages/plugin-renderer-img/package.json b/packages/plugin-renderer-img/package.json index 29a3f777..86864ca0 100644 --- a/packages/plugin-renderer-img/package.json +++ b/packages/plugin-renderer-img/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-renderer-img", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-renderer-img", "main": "index.js", "module": "dist/plugin-renderer-img.esm.js", @@ -18,10 +18,10 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/inspector-decorator": "^0.0.5", - "@eva/plugin-renderer": "1.2.7", - "@eva/renderer-adapter": "1.2.7", - "@eva/eva.js": "1.2.7", + "@eva/inspector-decorator": "0.1.0-alpha.3", + "@eva/plugin-renderer": "1.2.7-editor.12", + "@eva/renderer-adapter": "1.2.7-editor.12", + "@eva/eva.js": "1.2.7-editor.12", "pixi.js": "^4.8.7" } } diff --git a/packages/plugin-renderer-lottie/lib/Lottie.ts b/packages/plugin-renderer-lottie/lib/Lottie.ts index 0d941fa0..f827b352 100644 --- a/packages/plugin-renderer-lottie/lib/Lottie.ts +++ b/packages/plugin-renderer-lottie/lib/Lottie.ts @@ -1,6 +1,7 @@ import { Component } from '@eva/eva.js'; import { IExpandOpts, IOptions } from './types'; import { Sprite, Text, TextStyle, Graphics } from 'pixi.js'; +import { Field } from '@eva/inspector-decorator'; interface ExtendOptions extends IOptions { autoStart: boolean; @@ -8,9 +9,12 @@ interface ExtendOptions extends IOptions { export default class Lottie extends Component { // @decorators.IDEProp 复杂编辑后续添加 - slot: { [key: string]: string } + slot: { [key: string]: string }; static componentName: string = 'Lottie'; + + @Field({ type: 'resource', required: true }) + public resource: string; public anim: any; public options: ExtendOptions; public loadStatus: boolean = false; diff --git a/packages/plugin-renderer-lottie/package.json b/packages/plugin-renderer-lottie/package.json index 6db263fd..90313402 100644 --- a/packages/plugin-renderer-lottie/package.json +++ b/packages/plugin-renderer-lottie/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-renderer-lottie", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-renderer-lottie", "main": "index.js", "module": "dist/plugin-renderer-lottie.esm.js", @@ -18,8 +18,9 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/eva.js": "1.2.7", - "@eva/plugin-renderer": "1.2.7", + "@eva/eva.js": "1.2.7-editor.12", + "@eva/plugin-renderer": "1.2.7-editor.12", + "@eva/inspector-decorator": "^0.1.0-alpha.3", "ios-version": "^1.0.1", "pixi.js": "^4.8.9" } diff --git a/packages/plugin-renderer-mask/lib/component.ts b/packages/plugin-renderer-mask/lib/component.ts index b7cd99bc..1913a0b9 100644 --- a/packages/plugin-renderer-mask/lib/component.ts +++ b/packages/plugin-renderer-mask/lib/component.ts @@ -1,5 +1,4 @@ import { Component } from '@eva/eva.js'; -import {type } from '@eva/inspector-decorator' export enum MASK_TYPE { Circle = 'Circle', @@ -27,12 +26,16 @@ export interface MaskParams { export default class Mask extends Component { static componentName: string = 'Mask'; - // @decorators.IDEProp 复杂编辑后续添加 + _lastType: MaskParams['type']; + + mask_type: string; type: MaskParams['type']; - // @decorators.IDEProp 复杂编辑后续添加 + style?: MaskParams['style'] = {}; - @type('string') resource?: string = ''; - @type('string') spriteName?: string = ''; + + resource?: string = ''; + // 暂时不支持sprite + spriteName?: string = ''; init(obj?: MaskParams) { Object.assign(this, obj); diff --git a/packages/plugin-renderer-mask/lib/system.ts b/packages/plugin-renderer-mask/lib/system.ts index 7b2fad2a..ffb8532d 100644 --- a/packages/plugin-renderer-mask/lib/system.ts +++ b/packages/plugin-renderer-mask/lib/system.ts @@ -115,9 +115,13 @@ export default class Mask extends Renderer { const component = changed.component as MaskComponent; if (changed.prop.prop[0] === 'type') { this.changedCache[changed.gameObject.id] = true; - if ([MASK_TYPE.Sprite, MASK_TYPE.Img].indexOf(component.type) > -1) { + if ( + [MASK_TYPE.Sprite, MASK_TYPE.Img].indexOf(component.type) > -1 || + component._lastType !== component.type + ) { this.remove(changed); this.add(changed); + component._lastType = component.type } else { this.redrawGraphics(changed); } diff --git a/packages/plugin-renderer-mask/package.json b/packages/plugin-renderer-mask/package.json index 0eeaccd5..294b5ba9 100644 --- a/packages/plugin-renderer-mask/package.json +++ b/packages/plugin-renderer-mask/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-renderer-mask", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-renderer-mask", "main": "index.js", "module": "dist/plugin-renderer-mask.esm.js", @@ -18,10 +18,10 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/inspector-decorator": "^0.0.5", - "@eva/plugin-renderer": "1.2.7", - "@eva/renderer-adapter": "1.2.7", - "@eva/eva.js": "1.2.7", + "@eva/inspector-decorator": "0.1.0-alpha.3", + "@eva/plugin-renderer": "1.2.7-editor.12", + "@eva/renderer-adapter": "1.2.7-editor.12", + "@eva/eva.js": "1.2.7-editor.12", "pixi.js": "^4.8.7" } } diff --git a/packages/plugin-renderer-nine-patch/lib/component.ts b/packages/plugin-renderer-nine-patch/lib/component.ts index 849aa089..9db97a97 100644 --- a/packages/plugin-renderer-nine-patch/lib/component.ts +++ b/packages/plugin-renderer-nine-patch/lib/component.ts @@ -1,6 +1,6 @@ import { Component } from '@eva/eva.js'; -import { type, step } from '@eva/inspector-decorator'; -import { NinePatch as NinePatchSprite } from "@eva/renderer-adapter"; +import { Field } from '@eva/inspector-decorator'; +import { NinePatch as NinePatchSprite } from '@eva/renderer-adapter'; export interface NinePatchParams { resource: string; @@ -14,13 +14,13 @@ export interface NinePatchParams { export default class NinePatch extends Component { static componentName: string = 'NinePatch'; ninePatch: NinePatchSprite; - @type('string') resource: string = ''; - @type('string') spriteName: string = ''; + @Field({ type: 'resource' }) resource: string = ''; + @Field() spriteName: string = ''; - @type('number') @step(1) leftWidth: number = 0; - @type('number') @step(1) topHeight: number = 0; - @type('number') @step(1) rightWidth: number = 0; - @type('number') @step(1) bottomHeight: number = 0; + @Field({ step: 1 }) leftWidth: number = 0; + @Field({ step: 1 }) topHeight: number = 0; + @Field({ step: 1 }) rightWidth: number = 0; + @Field({ step: 1 }) bottomHeight: number = 0; init(obj?: NinePatchParams) { this.resource = obj.resource; this.spriteName = obj.spriteName; diff --git a/packages/plugin-renderer-nine-patch/package.json b/packages/plugin-renderer-nine-patch/package.json index d4f867ef..19c68400 100644 --- a/packages/plugin-renderer-nine-patch/package.json +++ b/packages/plugin-renderer-nine-patch/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-renderer-nine-patch", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-renderer-nine-patch", "main": "index.js", "module": "dist/plugin-renderer-nine-patch.esm.js", @@ -18,10 +18,10 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/inspector-decorator": "^0.0.5", - "@eva/plugin-renderer": "1.2.7", - "@eva/renderer-adapter": "1.2.7", - "@eva/eva.js": "1.2.7", + "@eva/inspector-decorator": "0.1.0-alpha.3", + "@eva/plugin-renderer": "1.2.7-editor.12", + "@eva/renderer-adapter": "1.2.7-editor.12", + "@eva/eva.js": "1.2.7-editor.12", "@types/pixi.js": "^4.8.9" } } diff --git a/packages/plugin-renderer-render/lib/component.ts b/packages/plugin-renderer-render/lib/component.ts index 52ff67e4..7d78f971 100644 --- a/packages/plugin-renderer-render/lib/component.ts +++ b/packages/plugin-renderer-render/lib/component.ts @@ -1,5 +1,5 @@ -import {Component} from '@eva/eva.js'; -import {type, step} from '@eva/inspector-decorator'; +import { Component } from '@eva/eva.js'; +import { Field } from '@eva/inspector-decorator'; export interface RenderParams { alpha?: number; zIndex?: number; @@ -9,10 +9,10 @@ export interface RenderParams { export default class Render extends Component { static componentName: string = 'Render'; sortDirty: boolean = false; - @type('boolean') visible: boolean = true; - @type('number') @step(0.1) alpha: number = 1; - @type('number') @step(1) zIndex: number = 0; - @type('boolean') sortableChildren: boolean = false; + @Field() visible: boolean = true; + @Field({ step: 0.1 }) alpha: number = 1; + @Field({ step: 1 }) zIndex: number = 0; + @Field() sortableChildren: boolean = false; init(obj?: RenderParams) { obj && Object.assign(this, obj); } diff --git a/packages/plugin-renderer-render/package.json b/packages/plugin-renderer-render/package.json index 42322692..e40102eb 100644 --- a/packages/plugin-renderer-render/package.json +++ b/packages/plugin-renderer-render/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-renderer-render", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-renderer-render", "main": "index.js", "module": "dist/plugin-renderer-render.esm.js", @@ -18,10 +18,10 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/inspector-decorator": "^0.0.5", - "@eva/plugin-renderer": "1.2.7", - "@eva/renderer-adapter": "1.2.7", - "@eva/eva.js": "1.2.7", + "@eva/inspector-decorator": "0.1.0-alpha.3", + "@eva/plugin-renderer": "1.2.7-editor.12", + "@eva/renderer-adapter": "1.2.7-editor.12", + "@eva/eva.js": "1.2.7-editor.12", "pixi.js": "^4.8.7" } } diff --git a/packages/plugin-renderer-spine/package.json b/packages/plugin-renderer-spine/package.json index ede148a6..d46265fa 100644 --- a/packages/plugin-renderer-spine/package.json +++ b/packages/plugin-renderer-spine/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-renderer-spine", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-renderer-spine", "main": "index.js", "module": "dist/plugin-renderer-spine.esm.js", @@ -18,10 +18,10 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/inspector-decorator": "^0.0.5", - "@eva/plugin-renderer": "1.2.7", - "@eva/eva.js": "1.2.7", - "@eva/spine-base": "1.2.7", + "@eva/inspector-decorator": "0.1.0-alpha.3", + "@eva/plugin-renderer": "1.2.7-editor.12", + "@eva/eva.js": "1.2.7-editor.12", + "@eva/spine-base": "1.2.7-editor.12", "pixi.js": "^4.8.7" } } diff --git a/packages/plugin-renderer-spine38/package.json b/packages/plugin-renderer-spine38/package.json index 5a7a1505..d75cefd7 100644 --- a/packages/plugin-renderer-spine38/package.json +++ b/packages/plugin-renderer-spine38/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-renderer-spine38", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-renderer-spine38", "main": "index.js", "module": "dist/plugin-renderer-spine38.esm.js", @@ -18,10 +18,10 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/eva.js": "1.2.7", - "@eva/inspector-decorator": "^0.0.5", - "@eva/plugin-renderer": "1.2.7", - "@eva/spine-base": "1.2.7", + "@eva/eva.js": "1.2.7-editor.12", + "@eva/inspector-decorator": "0.1.0-alpha.3", + "@eva/plugin-renderer": "1.2.7-editor.12", + "@eva/spine-base": "1.2.7-editor.12", "pixi.js": "^4.8.7" } } diff --git a/packages/plugin-renderer-spine40/package.json b/packages/plugin-renderer-spine40/package.json index d9bd61ed..401ec3ed 100644 --- a/packages/plugin-renderer-spine40/package.json +++ b/packages/plugin-renderer-spine40/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-renderer-spine40", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-renderer-spine40", "main": "index.js", "module": "dist/plugin-renderer-spine40.esm.js", @@ -18,10 +18,10 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/eva.js": "1.2.7", - "@eva/inspector-decorator": "^0.0.5", - "@eva/plugin-renderer": "1.2.7", - "@eva/spine-base": "1.2.7", + "@eva/eva.js": "1.2.7-editor.12", + "@eva/inspector-decorator": "0.1.0-alpha.3", + "@eva/plugin-renderer": "1.2.7-editor.12", + "@eva/spine-base": "1.2.7-editor.12", "pixi.js": "^4.8.7" } } diff --git a/packages/plugin-renderer-sprite-animation/lib/component.ts b/packages/plugin-renderer-sprite-animation/lib/component.ts index 7d4e9fea..ef67b5b6 100644 --- a/packages/plugin-renderer-sprite-animation/lib/component.ts +++ b/packages/plugin-renderer-sprite-animation/lib/component.ts @@ -1,5 +1,5 @@ import { Component } from '@eva/eva.js'; -import { type, step } from '@eva/inspector-decorator'; +import { Field } from '@eva/inspector-decorator'; import { SpriteAnimation as SpriteAnimationEngine } from '@eva/renderer-adapter'; export interface SpriteAnimationParams { @@ -12,10 +12,10 @@ export interface SpriteAnimationParams { export default class SpriteAnimation extends Component { static componentName: string = 'SpriteAnimation'; - @type('string') resource: string = ''; - @type('boolean') autoPlay: boolean = true; - @type('number') @step(10) speed: number = 100; - @type('boolean') forwards: boolean = false; + @Field() resource: string = ''; + @Field() autoPlay: boolean = true; + @Field({ step: 10 }) speed: number = 100; + @Field() forwards: boolean = false; _animate: SpriteAnimationEngine; private waitPlay: boolean = false; private waitStop: boolean = false; @@ -27,11 +27,11 @@ export default class SpriteAnimation extends Component { this.on('loop', () => { if (++this.count >= this.times) { if (this.forwards) { - this.gotoAndStop(this.totalFrames - 1) + this.gotoAndStop(this.totalFrames - 1); } else { this.animate.stop(); } - this.complete = true + this.complete = true; this.emit('complete'); } }); @@ -45,11 +45,11 @@ export default class SpriteAnimation extends Component { this.waitPlay = true; } else { if (this.complete) { - this.gotoAndStop(0) + this.gotoAndStop(0); } this.animate.play(); this.count = 0; - this.complete = false + this.complete = false; } } stop() { @@ -80,9 +80,9 @@ export default class SpriteAnimation extends Component { this.animate.gotoAndStop(frameNumber); } get currentFrame() { - return this.animate?.animatedSprite?.currentFrame + return this.animate?.animatedSprite?.currentFrame; } get totalFrames() { - return this.animate?.animatedSprite?.totalFrames + return this.animate?.animatedSprite?.totalFrames; } } diff --git a/packages/plugin-renderer-sprite-animation/package.json b/packages/plugin-renderer-sprite-animation/package.json index 264e1808..07935c63 100644 --- a/packages/plugin-renderer-sprite-animation/package.json +++ b/packages/plugin-renderer-sprite-animation/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-renderer-sprite-animation", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-renderer-sprite-animation", "main": "index.js", "module": "dist/plugin-renderer-sprite-animation.esm.js", @@ -18,10 +18,10 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/inspector-decorator": "^0.0.5", - "@eva/plugin-renderer": "1.2.7", - "@eva/renderer-adapter": "1.2.7", - "@eva/eva.js": "1.2.7", + "@eva/inspector-decorator": "0.1.0-alpha.3", + "@eva/plugin-renderer": "1.2.7-editor.12", + "@eva/renderer-adapter": "1.2.7-editor.12", + "@eva/eva.js": "1.2.7-editor.12", "pixi.js": "^4.8.7" } } diff --git a/packages/plugin-renderer-sprite/lib/component.ts b/packages/plugin-renderer-sprite/lib/component.ts index acd5630a..f0931c68 100644 --- a/packages/plugin-renderer-sprite/lib/component.ts +++ b/packages/plugin-renderer-sprite/lib/component.ts @@ -1,5 +1,4 @@ import { Component } from '@eva/eva.js'; -import { type } from '@eva/inspector-decorator'; export interface SpriteParams { resource: string; @@ -8,8 +7,10 @@ export interface SpriteParams { export default class Sprite extends Component { static componentName: string = 'Sprite'; - @type('string') resource: string = ''; - @type('string') spriteName: string = ''; + + resource: string = ''; + spriteName: string = ''; + init(obj?: SpriteParams) { if (obj && obj.resource) { this.resource = obj.resource; diff --git a/packages/plugin-renderer-sprite/package.json b/packages/plugin-renderer-sprite/package.json index 6b2defd8..c451328f 100644 --- a/packages/plugin-renderer-sprite/package.json +++ b/packages/plugin-renderer-sprite/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-renderer-sprite", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-renderer-sprite", "main": "index.js", "module": "dist/plugin-renderer-sprite.esm.js", @@ -18,9 +18,9 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/inspector-decorator": "^0.0.5", - "@eva/plugin-renderer": "1.2.7", - "@eva/eva.js": "1.2.7", + "@eva/inspector-decorator": "0.1.0-alpha.3", + "@eva/plugin-renderer": "1.2.7-editor.12", + "@eva/eva.js": "1.2.7-editor.12", "pixi.js": "^4.8.7" } } diff --git a/packages/plugin-renderer-test/package.json b/packages/plugin-renderer-test/package.json index 27214939..54dc1a92 100644 --- a/packages/plugin-renderer-test/package.json +++ b/packages/plugin-renderer-test/package.json @@ -1,6 +1,6 @@ { "name": "plugin-renderer-test", - "version": "1.2.7", + "version": "1.2.7-editor.12", "private": true, "description": "test plugin", "keywords": [ @@ -21,6 +21,6 @@ "test": "echo \"Error: run tests from root\" && exit 1" }, "dependencies": { - "@eva/inspector-decorator": "^0.0.4" + "@eva/inspector-decorator": "^0.1.0-alpha.3" } } diff --git a/packages/plugin-renderer-text/lib/component.ts b/packages/plugin-renderer-text/lib/component.ts index e6ed13f0..0fca0de6 100644 --- a/packages/plugin-renderer-text/lib/component.ts +++ b/packages/plugin-renderer-text/lib/component.ts @@ -1,47 +1,161 @@ import { TextStyle } from 'pixi.js'; import { Component } from '@eva/eva.js'; -import { type } from '@eva/inspector-decorator'; +import { Field } from '@eva/inspector-decorator'; + +class Style { + @Field({ + type: 'select', + options: [ + { key: 'center', value: 'center' }, + { key: 'left', value: 'left' }, + { key: 'right', value: 'right' }, + ], + default: 'left', + }) + align?: string; + @Field() + breakWords?: boolean; + @Field() + dropShadow?: boolean; + @Field({ default: 1 }) + dropShadowAlpha?: number; + @Field({ default: Math.PI / 6 }) + dropShadowAngle?: number; + @Field({ default: 0 }) + dropShadowBlur?: number; + @Field({ type: 'color', default: '#000000' }) + dropShadowColor?: string | number; + @Field({ default: 5 }) + dropShadowDistance?: number; + + @Field({ type: 'color', default: ['#000000'], isArray: true }) + fill?: string | string[] | number | number[] | CanvasGradient | CanvasPattern; + + @Field({ + type: 'select', + options: [ + { key: 1, value: 'vertical' }, + { key: 0, value: 'horizontal' }, + ], + default: 1, + }) + fillGradientType?: number; + + @Field(() => Number, { step: 0.1, min: 0, max: 1 }) + fillGradientStops?: number[]; + @Field(() => String, { default: 'Arial' }) + fontFamily?: string | string[]; + + @Field(() => Number, { min: 5, default: 26 }) + fontSize?: number | string; + + @Field({ + type: 'select', + options: [ + { key: 'normal', value: 'normal' }, + { key: 'italic', value: 'italic' }, + { key: 'oblique', value: 'oblique' }, + ], + default: 'normal', + }) + fontStyle?: string; + + @Field({ + type: 'select', + options: [ + { key: 'normal', value: 'normal' }, + { key: 'small-caps', value: 'small-caps' }, + ], + default: 'normal', + }) + fontVariant?: string; + + @Field({ + type: 'select', + options: [ + { key: 'normal', value: 'normal' }, + { key: 'bold', value: 'bold' }, + { key: 'bolder', value: 'bolder' }, + { key: 'lighter', value: 'lighter' }, + { key: '100', value: '100' }, + { key: '200', value: '200' }, + { key: '300', value: '300' }, + { key: '400', value: '400' }, + { key: '500', value: '500' }, + { key: '600', value: '600' }, + { key: '700', value: '700' }, + { key: '800', value: '800' }, + { key: '900', value: '900' }, + ], + default: 'normal', + }) + fontWeight?: string; + + @Field({ default: 0 }) + letterSpacing?: number; + @Field({ default: 0 }) + lineHeight?: number; + @Field({ + type: 'select', + options: [ + { key: 'miter', value: 'miter' }, + { key: 'round', value: 'round' }, + { key: 'bevel', value: 'bevel' }, + ], + default: 'miter', + }) + lineJoin?: string; + + @Field({ default: 10 }) + miterLimit?: number; + + @Field({ default: 0 }) + padding?: number; + + @Field({ type: 'color', default: '#000000' }) + stroke?: string | number; + + @Field({ default: 0, min: 0 }) + strokeThickness?: number; + + @Field({ default: 'alphabetic' }) + textBaseline?: string; + + @Field() + trim?: boolean; + + @Field({ + default: 'pre', + type: 'select', + options: [ + { key: 'normal', value: 'normal' }, + { key: 'pre', value: 'pre' }, + { key: 'pre-line', value: 'pre-line' }, + ], + }) + whiteSpace?: string; + + @Field() + wordWrap?: boolean; + + @Field({ default: 100 }) + wordWrapWidth?: number; + @Field() + leading?: number; +} export interface TextParams { text: string; - style?: { - align?: string; - breakWords?: boolean; - dropShadow?: boolean; - dropShadowAlpha?: number; - dropShadowAngle?: number; - dropShadowBlur?: number; - dropShadowColor?: string | number; - dropShadowDistance?: number; - fill?: string | string[] | number | number[] | CanvasGradient | CanvasPattern; - fillGradientType?: number; - fillGradientStops?: number[]; - fontFamily?: string | string[]; - fontSize?: number | string; - fontStyle?: string; - fontVariant?: string; - fontWeight?: string; - letterSpacing?: number; - lineHeight?: number; - lineJoin?: string; - miterLimit?: number; - padding?: number; - stroke?: string | number; - strokeThickness?: number; - textBaseline?: string; - trim?: boolean; - whiteSpace?: string; - wordWrap?: boolean; - wordWrapWidth?: number; - leading?: number; - }; + style?: Style; } export default class Text extends Component { static componentName: string = 'Text'; - @type('string') text: string = ''; + @Field() + text: string = ''; // @decorators.IDEProp 复杂编辑后续添加 - style: TextParams['style'] = {}; + @Field() + style: Style = {}; init(obj?: TextParams) { const style = new TextStyle({ fontSize: 20, diff --git a/packages/plugin-renderer-text/package.json b/packages/plugin-renderer-text/package.json index 4d9a56b8..198054d8 100644 --- a/packages/plugin-renderer-text/package.json +++ b/packages/plugin-renderer-text/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-renderer-text", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-renderer-text", "main": "index.js", "module": "dist/plugin-renderer-text.esm.js", @@ -18,10 +18,10 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/inspector-decorator": "^0.0.5", - "@eva/plugin-renderer": "1.2.7", - "@eva/renderer-adapter": "1.2.7", - "@eva/eva.js": "1.2.7", + "@eva/inspector-decorator": "0.1.0-alpha.3", + "@eva/plugin-renderer": "1.2.7-editor.12", + "@eva/renderer-adapter": "1.2.7-editor.12", + "@eva/eva.js": "1.2.7-editor.12", "pixi.js": "^4.8.7" } } diff --git a/packages/plugin-renderer-tiling-sprite/lib/component.ts b/packages/plugin-renderer-tiling-sprite/lib/component.ts index a85f8d55..8bfba08d 100644 --- a/packages/plugin-renderer-tiling-sprite/lib/component.ts +++ b/packages/plugin-renderer-tiling-sprite/lib/component.ts @@ -1,5 +1,5 @@ -import {Component} from '@eva/eva.js'; -import {type, step} from '@eva/inspector-decorator'; +import { Component } from '@eva/eva.js'; +import { Field } from '@eva/inspector-decorator'; export interface TilingSpriteParams { resource: string; @@ -9,12 +9,12 @@ export interface TilingSpriteParams { export default class TilingSprite extends Component { static componentName: string = 'TilingSprite'; - @type('string') resource: string = ''; - @type('vector2') @step(0.1) tileScale: TilingSpriteParams['tileScale'] = { + @Field({ type: 'resource' }) resource: string = ''; + @Field({ type: 'vector2', step: 0.01 }) tileScale: TilingSpriteParams['tileScale'] = { x: 1, y: 1, }; - @type('vector2') @step(1) tilePosition: TilingSpriteParams['tilePosition'] = { + @Field({ type: 'vector2', step: 0.01 }) tilePosition: TilingSpriteParams['tilePosition'] = { x: 0, y: 0, }; diff --git a/packages/plugin-renderer-tiling-sprite/package.json b/packages/plugin-renderer-tiling-sprite/package.json index 317d2501..3ddb9d79 100644 --- a/packages/plugin-renderer-tiling-sprite/package.json +++ b/packages/plugin-renderer-tiling-sprite/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-renderer-tiling-sprite", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-renderer-tiling-sprite", "main": "index.js", "module": "dist/plugin-renderer-tiling-sprite.esm.js", @@ -18,10 +18,10 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/inspector-decorator": "^0.0.5", - "@eva/plugin-renderer": "1.2.7", - "@eva/renderer-adapter": "1.2.7", - "@eva/eva.js": "1.2.7", + "@eva/inspector-decorator": "0.1.0-alpha.3", + "@eva/plugin-renderer": "1.2.7-editor.12", + "@eva/renderer-adapter": "1.2.7-editor.12", + "@eva/eva.js": "1.2.7-editor.12", "@types/pixi.js": "^4.8.9" } } diff --git a/packages/plugin-renderer/lib/Transform.ts b/packages/plugin-renderer/lib/Transform.ts index 4e66fdfa..1093d3ce 100644 --- a/packages/plugin-renderer/lib/Transform.ts +++ b/packages/plugin-renderer/lib/Transform.ts @@ -75,7 +75,18 @@ export default class Transform extends EventEmitter { const transform = changed.component as Trans; if (transform.parent) { const parentContainer = this.containerManager.getContainer(transform.parent.gameObject.id); - parentContainer.addChild(this.containerManager.getContainer(changed.gameObject.id)); + + if (transform.childIndex > -1) { + parentContainer.addChildAt(this.containerManager.getContainer(changed.gameObject.id), transform.childIndex); + + + // packages/eva.js/lib/core/GameObject.ts > addChildAt + // packages/plugin-renderer/lib/Transform.ts > change + // packages/eva.js/lib/core/Transform.ts > addChild + transform.childIndex = -1 + } else { + parentContainer.addChild(this.containerManager.getContainer(changed.gameObject.id)); + } const render = changed.gameObject.transform.parent && diff --git a/packages/plugin-renderer/package.json b/packages/plugin-renderer/package.json index 99e78000..b5bd5588 100644 --- a/packages/plugin-renderer/package.json +++ b/packages/plugin-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-renderer", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-renderer", "main": "index.js", "module": "dist/plugin-renderer.esm.js", @@ -18,8 +18,8 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/eva.js": "1.2.7", - "@eva/renderer-adapter": "1.2.7", + "@eva/eva.js": "1.2.7-editor.12", + "@eva/renderer-adapter": "1.2.7-editor.12", "@types/pixi.js": "^4.8.9", "eventemitter3": "^3.1.2", "lodash-es": "^4.17.21", diff --git a/packages/plugin-sound/package.json b/packages/plugin-sound/package.json index 02b31c4d..c2ecf4f7 100644 --- a/packages/plugin-sound/package.json +++ b/packages/plugin-sound/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-sound", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-sound", "main": "index.js", "module": "dist/plugin-sound.esm.js", @@ -18,7 +18,7 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/eva.js": "1.2.7", + "@eva/eva.js": "1.2.7-editor.12", "eventemitter3": "^3.1.2" } } diff --git a/packages/plugin-stats/package.json b/packages/plugin-stats/package.json index 5790e686..ee7ec69e 100644 --- a/packages/plugin-stats/package.json +++ b/packages/plugin-stats/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-stats", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-stats", "main": "index.js", "module": "dist/plugin-stats.esm.js", @@ -18,7 +18,7 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/eva.js": "1.2.7", + "@eva/eva.js": "1.2.7-editor.12", "lodash-es": "^4.17.21" } } diff --git a/packages/plugin-transition/package.json b/packages/plugin-transition/package.json index d0dcb373..54fcd438 100644 --- a/packages/plugin-transition/package.json +++ b/packages/plugin-transition/package.json @@ -1,6 +1,6 @@ { "name": "@eva/plugin-transition", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/plugin-transition", "main": "index.js", "module": "dist/plugin-transition.esm.js", @@ -18,7 +18,7 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/eva.js": "1.2.7", + "@eva/eva.js": "1.2.7-editor.12", "@tweenjs/tween.js": "^18.6.4", "sprite-timeline": "^1.10.2" } diff --git a/packages/renderer-adapter/package.json b/packages/renderer-adapter/package.json index 829791c1..52483130 100644 --- a/packages/renderer-adapter/package.json +++ b/packages/renderer-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@eva/renderer-adapter", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/renderer-adapter", "main": "index.js", "module": "dist/renderer-adapter.esm.js", diff --git a/packages/spine-base/lib/Spine.ts b/packages/spine-base/lib/Spine.ts index 967833ad..57477ef2 100644 --- a/packages/spine-base/lib/Spine.ts +++ b/packages/spine-base/lib/Spine.ts @@ -1,5 +1,4 @@ import { Component } from '@eva/eva.js'; -import { type } from '@eva/inspector-decorator'; export interface SpineParams { resource: string; @@ -10,18 +9,15 @@ export interface SpineParams { export default class Spine extends Component { static componentName: string = 'Spine'; - @type('string') resource: string = ''; - @type('string') animationName: string = ''; - @type('boolean') autoPlay: boolean = true; private _armature: any; - private waitExecuteInfos: { playType: boolean, track?: number, name?: string, loop?: boolean }[] = [] + private waitExecuteInfos: { playType: boolean; track?: number; name?: string; loop?: boolean }[] = []; set armature(val) { this._armature = val; @@ -71,8 +67,8 @@ export default class Spine extends Component { * 为了解决这个问题,在 autoPlay 的情况下,未加载完之前调用 play ,默认循环播放,除非设置不循环参数 */ loop: loop ?? this.autoPlay, - track - }) + track, + }); } else { if (track === undefined) { track = 0; @@ -88,8 +84,8 @@ export default class Spine extends Component { if (!this.armature) { this.waitExecuteInfos.push({ playType: false, - track - }) + track, + }); return; } if (track === undefined) { diff --git a/packages/spine-base/package.json b/packages/spine-base/package.json index 49a87d23..2a9fa0a6 100644 --- a/packages/spine-base/package.json +++ b/packages/spine-base/package.json @@ -1,6 +1,6 @@ { "name": "@eva/spine-base", - "version": "1.2.7", + "version": "1.2.7-editor.12", "description": "@eva/spine-base", "main": "index.js", "module": "dist/spine-base.esm.js", @@ -18,9 +18,9 @@ "license": "MIT", "homepage": "https://eva.js.org", "dependencies": { - "@eva/eva.js": "1.2.7", - "@eva/plugin-renderer": "1.2.7", - "@eva/inspector-decorator": "^0.0.5", + "@eva/eva.js": "1.2.7-editor.12", + "@eva/plugin-renderer": "1.2.7-editor.12", + "@eva/inspector-decorator": "0.1.0-alpha.3", "pixi.js": "^4.8.9" } } diff --git a/scripts/link.js b/scripts/link.js new file mode 100644 index 00000000..8071cd15 --- /dev/null +++ b/scripts/link.js @@ -0,0 +1,14 @@ +const { targets: allTargets } = require('./utils'); +const path = require('path'); +const execa = require('execa'); + +function run() { + for (const target of allTargets) { + const pkgDir = path.resolve(__dirname, `../packages/${target}`); + process.chdir(pkgDir); + execa.sync('pnpm', ['link', '--global']); + console.log('success -->', pkgDir); + } +} + +run(); diff --git a/scripts/setupJestEnv.ts b/scripts/setupJestEnv.ts index 72761ca7..75afd2c5 100644 --- a/scripts/setupJestEnv.ts +++ b/scripts/setupJestEnv.ts @@ -1,96 +1,89 @@ +import 'reflect-metadata'; + expect.extend({ toHaveBeenWarned(received: string) { - asserted.add(received) - const passed = warn.mock.calls.some(args => args[0].indexOf(received) > -1) + asserted.add(received); + const passed = warn.mock.calls.some(args => args[0].indexOf(received) > -1); if (passed) { return { pass: true, - message: () => `expected "${received}" not to have been warned.` - } + message: () => `expected "${received}" not to have been warned.`, + }; } else { - const msgs = warn.mock.calls.map(args => args[0]).join('\n - ') + const msgs = warn.mock.calls.map(args => args[0]).join('\n - '); return { pass: false, message: () => `expected "${received}" to have been warned` + - (msgs.length - ? `.\n\nActual messages:\n\n - ${msgs}` - : 'but no warning was recorded.') - } + (msgs.length ? `.\n\nActual messages:\n\n - ${msgs}` : 'but no warning was recorded.'), + }; } }, toHaveBeenWarnedLast(received: string) { - asserted.add(received) - const passed = - warn.mock.calls[warn.mock.calls.length - 1][0].indexOf(received) > -1 + asserted.add(received); + const passed = warn.mock.calls[warn.mock.calls.length - 1][0].indexOf(received) > -1; if (passed) { return { pass: true, - message: () => `expected "${received}" not to have been warned last.` - } + message: () => `expected "${received}" not to have been warned last.`, + }; } else { - const msgs = warn.mock.calls.map(args => args[0]).join('\n - ') + const msgs = warn.mock.calls.map(args => args[0]).join('\n - '); return { pass: false, - message: () => - `expected "${received}" to have been warned last.\n\nActual messages:\n\n - ${msgs}` - } + message: () => `expected "${received}" to have been warned last.\n\nActual messages:\n\n - ${msgs}`, + }; } }, toHaveBeenWarnedTimes(received: string, n: number) { - asserted.add(received) - let found = 0 + asserted.add(received); + let found = 0; warn.mock.calls.forEach(args => { if (args[0].indexOf(received) > -1) { - found++ + found++; } - }) + }); if (found === n) { return { pass: true, - message: () => `expected "${received}" to have been warned ${n} times.` - } + message: () => `expected "${received}" to have been warned ${n} times.`, + }; } else { return { pass: false, - message: () => - `expected "${received}" to have been warned ${n} times but got ${found}.` - } + message: () => `expected "${received}" to have been warned ${n} times but got ${found}.`, + }; } - } -}) + }, +}); -let warn: jest.SpyInstance -const asserted: Set = new Set() +let warn: jest.SpyInstance; +const asserted: Set = new Set(); beforeEach(() => { - asserted.clear() - warn = jest.spyOn(console, 'warn') - warn.mockImplementation(() => { }) -}) + asserted.clear(); + warn = jest.spyOn(console, 'warn'); + warn.mockImplementation(() => {}); +}); afterEach(() => { - const assertedArray = Array.from(asserted) + const assertedArray = Array.from(asserted); const nonAssertedWarnings = warn.mock.calls .map(args => args[0]) .filter(received => { return !assertedArray.some(assertedMsg => { - return received.indexOf(assertedMsg) > -1 - }) - }) - warn.mockRestore() + return received.indexOf(assertedMsg) > -1; + }); + }); + warn.mockRestore(); if (nonAssertedWarnings.length) { - throw new Error( - `test case threw unexpected warnings:\n - ${nonAssertedWarnings.join( - '\n - ' - )}` - ) + throw new Error(`test case threw unexpected warnings:\n - ${nonAssertedWarnings.join('\n - ')}`); } -}) +}); // dont remove this line, cause of typescript TS1208 error. // https://github.com/Microsoft/TypeScript/blob/main/src/compiler/diagnosticMessages.json#L662 -export { }; +export {}; diff --git a/tsconfig.json b/tsconfig.json index 4bd9eada..1a492e95 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,6 +9,7 @@ "allowJs": true, "noUnusedLocals": true, "experimentalDecorators": true, + "emitDecoratorMetadata": true, "resolveJsonModule": true, "esModuleInterop": true, "removeComments": true, @@ -20,36 +21,15 @@ "noUnusedParameters": true, "allowSyntheticDefaultImports": true, "isolatedModules": false, - "lib": [ - "esnext", - "dom" - ], - "types": [ - "jest", - "node" - ], + "lib": ["esnext", "dom"], + "types": ["jest", "node"], "paths": { - "@eva/miniprogram-*": [ - "packages/miniprogram-*/lib" - ], - "@eva/plugin-*": [ - "packages/plugin-*/lib" - ], - "@eva/eva.js": [ - "packages/eva.js/lib" - ], - "@eva/renderer-adapter": [ - "packages/renderer-adapter/lib" - ], - "@eva/spine-base": [ - "packages/spine-base/lib" - ] + "@eva/miniprogram-*": ["packages/miniprogram-*/lib"], + "@eva/plugin-*": ["packages/plugin-*/lib"], + "@eva/eva.js": ["packages/eva.js/lib"], + "@eva/renderer-adapter": ["packages/renderer-adapter/lib"], + "@eva/spine-base": ["packages/spine-base/lib"] } }, - "include": [ - "packages/global.d.ts", - "packages/*/global.d.ts", - "packages/*/lib", - "packages/*/__tests__" - ] -} \ No newline at end of file + "include": ["packages/global.d.ts", "packages/*/global.d.ts", "packages/*/lib", "packages/*/__tests__"] +}