@eva/plugin-renderer-sprite 2.1.0-beta.3 → 2.1.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,336 @@
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
+ globalThis.EVA = globalThis.EVA || {};
3
+ globalThis.EVA.plugin = globalThis.EVA.plugin || {};
4
+ globalThis.EVA.plugin.renderer = globalThis.EVA.plugin.renderer || {};
5
+ var _EVA_IIFE_sprite = function (exports, eva_js, pluginRenderer, pixi_js) {
6
+ 'use strict';
7
+ function __decorate(decorators, target, key, desc) {
8
+ var c = arguments.length,
9
+ r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,
10
+ d;
11
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
12
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
13
+ }
14
+ function __metadata(metadataKey, metadataValue) {
15
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
16
+ }
17
+ function __awaiter(thisArg, _arguments, P, generator) {
18
+ function adopt(value) {
19
+ return value instanceof P ? value : new P(function (resolve) {
20
+ resolve(value);
21
+ });
22
+ }
23
+ return new (P || (P = Promise))(function (resolve, reject) {
24
+ function fulfilled(value) {
25
+ try {
26
+ step(generator.next(value));
27
+ } catch (e) {
28
+ reject(e);
29
+ }
30
+ }
31
+ function rejected(value) {
32
+ try {
33
+ step(generator["throw"](value));
34
+ } catch (e) {
35
+ reject(e);
36
+ }
37
+ }
38
+ function step(result) {
39
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
40
+ }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ }
44
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
45
+ var e = new Error(message);
46
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
47
+ };
48
+ function __rest(s, e) {
49
+ var t = {};
50
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
51
+ if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
52
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
53
+ }
54
+ return t;
55
+ }
56
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
57
+ var e = new Error(message);
58
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
59
+ };
60
+ class SymbolKeysNotSupportedError extends Error {
61
+ constructor() {
62
+ super('Symbol keys are not supported yet!');
63
+ Object.setPrototypeOf(this, new.target.prototype);
64
+ }
65
+ }
66
+ const IDE_PROPERTY_METADATA = 'IDE_PROPERTY_METADATA';
67
+ function transformBasicType(type) {
68
+ if (type === String) {
69
+ return 'string';
70
+ }
71
+ if (type === Number) {
72
+ return 'number';
73
+ }
74
+ if (type === Boolean) {
75
+ return 'boolean';
76
+ }
77
+ return 'unknown';
78
+ }
79
+ function defineLegacyIDEProp(target, propertyKey, patch) {
80
+ const constructor = target.constructor;
81
+ const current = constructor.IDEProps || {};
82
+ current[propertyKey] = _extends(_extends({
83
+ key: propertyKey
84
+ }, current[propertyKey]), patch);
85
+ constructor.IDEProps = current;
86
+ }
87
+ function defineTypes(target, key, options, returnTypeFunction) {
88
+ let type = Reflect.getMetadata('design:type', target, key);
89
+ let isArray = type === Array;
90
+ const str = transformBasicType(type);
91
+ if (str !== 'unknown') {
92
+ type = str;
93
+ }
94
+ if (returnTypeFunction) {
95
+ const returnType = returnTypeFunction();
96
+ if (Array.isArray(returnType)) {
97
+ isArray = true;
98
+ type = returnType[0];
99
+ } else {
100
+ type = returnType;
101
+ }
102
+ }
103
+ const properties = Reflect.getMetadata(IDE_PROPERTY_METADATA, target.constructor) || {};
104
+ const current = properties[key] || {};
105
+ const property = _extends(_extends(_extends({}, current), {
106
+ type,
107
+ isArray: isArray
108
+ }), options);
109
+ properties[key] = property;
110
+ Reflect.defineMetadata(IDE_PROPERTY_METADATA, properties, target.constructor);
111
+ const legacyProperty = __rest(property, ["isArray"]);
112
+ defineLegacyIDEProp(target, key, legacyProperty);
113
+ }
114
+ function type(type) {
115
+ return Field({
116
+ type
117
+ });
118
+ }
119
+ function getTypeDecoratorParams(returnTypeFuncOrOptions, maybeOptions) {
120
+ if (typeof returnTypeFuncOrOptions === 'function') {
121
+ return {
122
+ returnTypeFunc: returnTypeFuncOrOptions,
123
+ options: maybeOptions || {}
124
+ };
125
+ }
126
+ return {
127
+ options: returnTypeFuncOrOptions || {}
128
+ };
129
+ }
130
+ function Field(returnTypeFunction, maybeOptions) {
131
+ return (target, propertyKey) => {
132
+ if (typeof propertyKey === 'symbol') {
133
+ throw new SymbolKeysNotSupportedError();
134
+ }
135
+ const {
136
+ options,
137
+ returnTypeFunc
138
+ } = getTypeDecoratorParams(returnTypeFunction, maybeOptions);
139
+ defineTypes(target, propertyKey, options, returnTypeFunc);
140
+ };
141
+ }
142
+ var ExecuteMode;
143
+ (function (ExecuteMode) {
144
+ ExecuteMode[ExecuteMode["Edit"] = 2] = "Edit";
145
+ ExecuteMode[ExecuteMode["Game"] = 4] = "Game";
146
+ ExecuteMode[ExecuteMode["All"] = 6] = "All";
147
+ })(ExecuteMode || (ExecuteMode = {}));
148
+ class Sprite$3 extends eva_js.Component {
149
+ constructor(params) {
150
+ super(params);
151
+ this.resource = '';
152
+ this.spriteName = '';
153
+ this.init(params);
154
+ }
155
+ init(obj) {
156
+ if (obj && obj.resource) {
157
+ this.resource = obj.resource;
158
+ this.spriteName = obj.spriteName;
159
+ }
160
+ }
161
+ setSprite(spriteName) {
162
+ this.spriteName = spriteName;
163
+ return this;
164
+ }
165
+ }
166
+ Sprite$3.componentName = 'Sprite';
167
+ __decorate([type('string'), __metadata("design:type", String)], Sprite$3.prototype, "resource", void 0);
168
+ __decorate([type('string'), __metadata("design:type", String)], Sprite$3.prototype, "spriteName", void 0);
169
+ class Sprite$2 {
170
+ constructor(image) {
171
+ this._image = null;
172
+ this._image = image;
173
+ if (image) {
174
+ if (typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement) {
175
+ this.sprite = pixi_js.Sprite.from(image);
176
+ } else if (image instanceof pixi_js.Texture) {
177
+ this.sprite = new pixi_js.Sprite(image);
178
+ }
179
+ } else {
180
+ this.sprite = new pixi_js.Sprite();
181
+ }
182
+ }
183
+ set image(val) {
184
+ if (this._image === val) {
185
+ return;
186
+ }
187
+ if (typeof HTMLImageElement !== 'undefined' && val instanceof HTMLImageElement) {
188
+ this.sprite.texture && this.sprite.texture.destroy(false);
189
+ this.sprite.texture = pixi_js.Texture.from(val);
190
+ } else if (val instanceof pixi_js.Texture) {
191
+ this.sprite.texture = val;
192
+ }
193
+ this._image = val;
194
+ }
195
+ get image() {
196
+ return this._image;
197
+ }
198
+ }
199
+ const resourceKeySplit = '_s|r|c_';
200
+ eva_js.resource.registerInstance(eva_js.RESOURCE_TYPE.SPRITE, ({
201
+ name,
202
+ data
203
+ }) => {
204
+ return new Promise(r => {
205
+ var _a;
206
+ const textureObj = data.json.data;
207
+ const texture = data.image instanceof pixi_js.Texture ? data.image : pixi_js.Texture.from(data.image);
208
+ let frames = textureObj.frames || {};
209
+ if (Array.isArray(frames)) {
210
+ const hashFrames = {};
211
+ for (const f of frames) {
212
+ const key = (_a = f.filename) !== null && _a !== void 0 ? _a : f.name;
213
+ if (key) hashFrames[key] = f;
214
+ }
215
+ frames = hashFrames;
216
+ } else {
217
+ const sample = Object.values(frames)[0];
218
+ if (sample && typeof sample.filename === 'string') {
219
+ const remapped = {};
220
+ for (const k in frames) {
221
+ const f = frames[k];
222
+ remapped[f.filename || k] = f;
223
+ }
224
+ frames = remapped;
225
+ }
226
+ }
227
+ const animations = textureObj.animations || {};
228
+ const newAnimations = {};
229
+ const newFrames = {};
230
+ for (const key in frames) {
231
+ const newKey = name + resourceKeySplit + key;
232
+ newFrames[newKey] = frames[key];
233
+ }
234
+ for (const key in animations) {
235
+ const spriteList = [];
236
+ if (animations[key] && animations[key].length >= 0) {
237
+ for (const spriteName of animations[key]) {
238
+ const newSpriteName = name + resourceKeySplit + spriteName;
239
+ spriteList.push(newSpriteName);
240
+ }
241
+ }
242
+ newAnimations[key] = spriteList;
243
+ }
244
+ const spriteSheet = new pixi_js.Spritesheet(texture, _extends(_extends({}, textureObj), {
245
+ frames: newFrames,
246
+ animations: newAnimations
247
+ }));
248
+ spriteSheet.parse().then(() => {
249
+ r(spriteSheet.textures);
250
+ });
251
+ });
252
+ });
253
+ eva_js.resource.registerDestroy(eva_js.RESOURCE_TYPE.SPRITE, ({
254
+ instance
255
+ }) => {
256
+ if (!instance) return;
257
+ for (const key in instance) {
258
+ instance[key].destroy(true);
259
+ }
260
+ });
261
+ let Sprite = class Sprite extends pluginRenderer.Renderer {
262
+ constructor() {
263
+ super(...arguments);
264
+ this.name = 'SpriteSystem';
265
+ this.sprites = {};
266
+ }
267
+ init() {
268
+ this.renderSystem = this.game.getSystem(pluginRenderer.RendererSystem);
269
+ this.renderSystem.rendererManager.register(this);
270
+ }
271
+ rendererUpdate(gameObject) {
272
+ const {
273
+ width,
274
+ height
275
+ } = gameObject.transform.size;
276
+ if (this.sprites[gameObject.id]) {
277
+ this.sprites[gameObject.id].sprite.width = width;
278
+ this.sprites[gameObject.id].sprite.height = height;
279
+ }
280
+ }
281
+ componentChanged(changed) {
282
+ return __awaiter(this, void 0, void 0, function* () {
283
+ if (changed.componentName === 'Sprite') {
284
+ const gameObjectId = changed.gameObject.id;
285
+ const component = changed.component;
286
+ if (changed.type === eva_js.OBSERVER_TYPE.ADD) {
287
+ const sprite = new Sprite$2(null);
288
+ this.sprites[changed.gameObject.id] = sprite;
289
+ this.containerManager.getContainer(changed.gameObject.id).addChildAt(sprite.sprite, 0);
290
+ const asyncId = this.increaseAsyncId(gameObjectId);
291
+ const {
292
+ instance
293
+ } = yield eva_js.resource.getResource(component.resource);
294
+ if (!this.validateAsyncId(gameObjectId, asyncId)) return;
295
+ if (!instance) {
296
+ console.error(`GameObject:${changed.gameObject.name}'s Sprite resource load error`);
297
+ return;
298
+ }
299
+ sprite.image = instance[component.resource + resourceKeySplit + component.spriteName];
300
+ } else if (changed.type === eva_js.OBSERVER_TYPE.CHANGE) {
301
+ const asyncId = this.increaseAsyncId(gameObjectId);
302
+ const {
303
+ instance
304
+ } = yield eva_js.resource.getResource(component.resource);
305
+ if (!this.validateAsyncId(gameObjectId, asyncId)) return;
306
+ if (!instance) {
307
+ console.error(`GameObject:${changed.gameObject.name}'s Sprite resource load error`);
308
+ return;
309
+ }
310
+ this.sprites[changed.gameObject.id].image = instance[component.resource + resourceKeySplit + component.spriteName];
311
+ } else if (changed.type === eva_js.OBSERVER_TYPE.REMOVE) {
312
+ this.increaseAsyncId(gameObjectId);
313
+ const sprite = this.sprites[changed.gameObject.id];
314
+ this.containerManager.getContainer(changed.gameObject.id).removeChild(sprite.sprite);
315
+ sprite.sprite.destroy({
316
+ children: true
317
+ });
318
+ delete this.sprites[changed.gameObject.id];
319
+ }
320
+ }
321
+ });
322
+ }
323
+ };
324
+ Sprite.systemName = 'SpriteSystem';
325
+ Sprite = __decorate([eva_js.decorators.componentObserver({
326
+ Sprite: ['spriteName']
327
+ })], Sprite);
328
+ var Sprite$1 = Sprite;
329
+ exports.Sprite = Sprite$3;
330
+ exports.SpriteSystem = Sprite$1;
331
+ Object.defineProperty(exports, '__esModule', {
332
+ value: true
333
+ });
334
+ return exports;
335
+ }({}, EVA, EVA.plugin.renderer, PIXI);
336
+ globalThis.EVA.plugin.renderer.sprite = globalThis.EVA.plugin.renderer.sprite || _EVA_IIFE_sprite;
@@ -0,0 +1 @@
1
+ function _extends(){return _extends=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},_extends.apply(null,arguments)}globalThis.EVA=globalThis.EVA||{},globalThis.EVA.plugin=globalThis.EVA.plugin||{},globalThis.EVA.plugin.renderer=globalThis.EVA.plugin.renderer||{};var _EVA_IIFE_sprite=function(e,t,r,n){"use strict";function s(e,t,r,n){var s,i=arguments.length,o=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,n);else for(var c=e.length-1;c>=0;c--)(s=e[c])&&(o=(i<3?s(o):i>3?s(t,r,o):s(t,r))||o);return i>3&&o&&Object.defineProperty(t,r,o),o}function i(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function o(e,t,r,n){return new(r||(r=Promise))(function(s,i){function o(e){try{a(n.next(e))}catch(e){i(e)}}function c(e){try{a(n.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?s(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(o,c)}a((n=n.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError,"function"==typeof SuppressedError&&SuppressedError;class c extends Error{constructor(){super("Symbol keys are not supported yet!"),Object.setPrototypeOf(this,new.target.prototype)}}const a="IDE_PROPERTY_METADATA";function p(e,t,r,n){let s=Reflect.getMetadata("design:type",e,t),i=s===Array;const o=function(e){return e===String?"string":e===Number?"number":e===Boolean?"boolean":"unknown"}(s);if("unknown"!==o&&(s=o),n){const e=n();Array.isArray(e)?(i=!0,s=e[0]):s=e}const c=Reflect.getMetadata(a,e.constructor)||{},p=_extends(_extends(_extends({},c[t]||{}),{type:s,isArray:i}),r);c[t]=p,Reflect.defineMetadata(a,c,e.constructor);!function(e,t,r){const n=e.constructor,s=n.IDEProps||{};s[t]=_extends(_extends({key:t},s[t]),r),n.IDEProps=s}(e,t,function(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var s=0;for(n=Object.getOwnPropertySymbols(e);s<n.length;s++)t.indexOf(n[s])<0&&Object.prototype.propertyIsEnumerable.call(e,n[s])&&(r[n[s]]=e[n[s]])}return r}(p,["isArray"]))}function u(e){return t={type:e},(e,n)=>{if("symbol"==typeof n)throw new c;const{options:s,returnTypeFunc:i}=function(e,t){return"function"==typeof e?{returnTypeFunc:e,options:t||{}}:{options:e||{}}}(t,r);p(e,n,s,i)};var t,r}var l;!function(e){e[e.Edit=2]="Edit",e[e.Game=4]="Game",e[e.All=6]="All"}(l||(l={}));class f extends t.Component{constructor(e){super(e),this.resource="",this.spriteName="",this.init(e)}init(e){e&&e.resource&&(this.resource=e.resource,this.spriteName=e.spriteName)}setSprite(e){return this.spriteName=e,this}}f.componentName="Sprite",s([u("string"),i("design:type",String)],f.prototype,"resource",void 0),s([u("string"),i("design:type",String)],f.prototype,"spriteName",void 0);class d{constructor(e){this._image=null,this._image=e,e?"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement?this.sprite=n.Sprite.from(e):e instanceof n.Texture&&(this.sprite=new n.Sprite(e)):this.sprite=new n.Sprite}set image(e){this._image!==e&&("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement?(this.sprite.texture&&this.sprite.texture.destroy(!1),this.sprite.texture=n.Texture.from(e)):e instanceof n.Texture&&(this.sprite.texture=e),this._image=e)}get image(){return this._image}}const m="_s|r|c_";t.resource.registerInstance(t.RESOURCE_TYPE.SPRITE,({name:e,data:t})=>new Promise(r=>{var s;const i=t.json.data,o=t.image instanceof n.Texture?t.image:n.Texture.from(t.image);let c=i.frames||{};if(Array.isArray(c)){const e={};for(const t of c){const r=null!==(s=t.filename)&&void 0!==s?s:t.name;r&&(e[r]=t)}c=e}else{const e=Object.values(c)[0];if(e&&"string"==typeof e.filename){const e={};for(const t in c){const r=c[t];e[r.filename||t]=r}c=e}}const a=i.animations||{},p={},u={};for(const t in c){u[e+m+t]=c[t]}for(const t in a){const r=[];if(a[t]&&a[t].length>=0)for(const n of a[t]){const t=e+m+n;r.push(t)}p[t]=r}const l=new n.Spritesheet(o,_extends(_extends({},i),{frames:u,animations:p}));l.parse().then(()=>{r(l.textures)})})),t.resource.registerDestroy(t.RESOURCE_TYPE.SPRITE,({instance:e})=>{if(e)for(const t in e)e[t].destroy(!0)});let g=class extends r.Renderer{constructor(){super(...arguments),this.name="SpriteSystem",this.sprites={}}init(){this.renderSystem=this.game.getSystem(r.RendererSystem),this.renderSystem.rendererManager.register(this)}rendererUpdate(e){const{width:t,height:r}=e.transform.size;this.sprites[e.id]&&(this.sprites[e.id].sprite.width=t,this.sprites[e.id].sprite.height=r)}componentChanged(e){return o(this,void 0,void 0,function*(){if("Sprite"===e.componentName){const r=e.gameObject.id,n=e.component;if(e.type===t.OBSERVER_TYPE.ADD){const s=new d(null);this.sprites[e.gameObject.id]=s,this.containerManager.getContainer(e.gameObject.id).addChildAt(s.sprite,0);const i=this.increaseAsyncId(r),{instance:o}=yield t.resource.getResource(n.resource);if(!this.validateAsyncId(r,i))return;if(!o)return void console.error(`GameObject:${e.gameObject.name}'s Sprite resource load error`);s.image=o[n.resource+m+n.spriteName]}else if(e.type===t.OBSERVER_TYPE.CHANGE){const s=this.increaseAsyncId(r),{instance:i}=yield t.resource.getResource(n.resource);if(!this.validateAsyncId(r,s))return;if(!i)return void console.error(`GameObject:${e.gameObject.name}'s Sprite resource load error`);this.sprites[e.gameObject.id].image=i[n.resource+m+n.spriteName]}else if(e.type===t.OBSERVER_TYPE.REMOVE){this.increaseAsyncId(r);const t=this.sprites[e.gameObject.id];this.containerManager.getContainer(e.gameObject.id).removeChild(t.sprite),t.sprite.destroy({children:!0}),delete this.sprites[e.gameObject.id]}}})}};g.systemName="SpriteSystem",g=s([t.decorators.componentObserver({Sprite:["spriteName"]})],g);var h=g;return e.Sprite=f,e.SpriteSystem=h,Object.defineProperty(e,"__esModule",{value:!0}),e}({},EVA,EVA.plugin.renderer,PIXI);globalThis.EVA.plugin.renderer.sprite=globalThis.EVA.plugin.renderer.sprite||_EVA_IIFE_sprite;
@@ -0,0 +1,275 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var eva_js = require('@eva/eva.js');
6
+ var inspectorDecorator = require('@eva/inspector-decorator');
7
+ var pluginRenderer = require('@eva/plugin-renderer');
8
+ var pixi_js = require('pixi.js');
9
+
10
+ /******************************************************************************
11
+ Copyright (c) Microsoft Corporation.
12
+
13
+ Permission to use, copy, modify, and/or distribute this software for any
14
+ purpose with or without fee is hereby granted.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
17
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
18
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
19
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
20
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
21
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22
+ PERFORMANCE OF THIS SOFTWARE.
23
+ ***************************************************************************** */
24
+
25
+ function __decorate(decorators, target, key, desc) {
26
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
27
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
28
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
29
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
30
+ }
31
+
32
+ function __metadata(metadataKey, metadataValue) {
33
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
34
+ }
35
+
36
+ function __awaiter(thisArg, _arguments, P, generator) {
37
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
38
+ return new (P || (P = Promise))(function (resolve, reject) {
39
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
40
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
41
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
42
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
43
+ });
44
+ }
45
+
46
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
47
+ var e = new Error(message);
48
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
49
+ };
50
+
51
+ /**
52
+ * 精灵图组件
53
+ *
54
+ * Sprite 组件用于渲染精灵图集(Sprite Sheet)中的单个精灵。
55
+ * 它从一个包含多个小图的大图资源中提取指定的子图进行渲染,
56
+ * 这种方式可以减少纹理切换,提高渲染性能。
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * // 渲染精灵图集中的某个精灵
61
+ * const player = new GameObject('player');
62
+ * player.addComponent(new Sprite({
63
+ * resource: 'playerAtlas', // 资源名称
64
+ * spriteName: 'player_idle_01.png' // 精灵图集中的子图名称
65
+ * }));
66
+ * ```
67
+ */
68
+ class Sprite$3 extends eva_js.Component {
69
+ constructor(params) {
70
+ super(params);
71
+ /** 精灵图集资源名称 */
72
+ this.resource = '';
73
+ /** 精灵图集中的子图名称 */
74
+ this.spriteName = '';
75
+ this.init(params);
76
+ }
77
+ /**
78
+ * 初始化组件
79
+ * @param obj - 初始化参数
80
+ *
81
+ * 配置项包括 resource 和 spriteName。
82
+ */
83
+ init(obj) {
84
+ if (obj && obj.resource) {
85
+ this.resource = obj.resource;
86
+ this.spriteName = obj.spriteName;
87
+ }
88
+ }
89
+ /**
90
+ * 切换当前精灵图集帧。
91
+ *
92
+ * SpriteSystem 会监听 spriteName 变化并刷新渲染纹理。
93
+ *
94
+ * @param spriteName - 精灵图集中的子图名称
95
+ */
96
+ setSprite(spriteName) {
97
+ this.spriteName = spriteName;
98
+ return this;
99
+ }
100
+ }
101
+ /** 组件名称 */
102
+ Sprite$3.componentName = 'Sprite';
103
+ __decorate([
104
+ inspectorDecorator.type('string'),
105
+ __metadata("design:type", String)
106
+ ], Sprite$3.prototype, "resource", void 0);
107
+ __decorate([
108
+ inspectorDecorator.type('string'),
109
+ __metadata("design:type", String)
110
+ ], Sprite$3.prototype, "spriteName", void 0);
111
+
112
+ class Sprite$2 {
113
+ constructor(image) {
114
+ this._image = null;
115
+ this._image = image;
116
+ if (image) {
117
+ if (typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement) {
118
+ this.sprite = pixi_js.Sprite.from(image);
119
+ }
120
+ else if (image instanceof pixi_js.Texture) {
121
+ this.sprite = new pixi_js.Sprite(image);
122
+ }
123
+ }
124
+ else {
125
+ this.sprite = new pixi_js.Sprite();
126
+ }
127
+ }
128
+ set image(val) {
129
+ if (this._image === val) {
130
+ return;
131
+ }
132
+ if (typeof HTMLImageElement !== 'undefined' && val instanceof HTMLImageElement) {
133
+ this.sprite.texture && this.sprite.texture.destroy(false);
134
+ this.sprite.texture = pixi_js.Texture.from(val);
135
+ }
136
+ else if (val instanceof pixi_js.Texture) {
137
+ this.sprite.texture = val;
138
+ }
139
+ this._image = val;
140
+ }
141
+ get image() {
142
+ return this._image;
143
+ }
144
+ }
145
+
146
+ const resourceKeySplit = '_s|r|c_'; // Notice: This key be used in ninepatch system.
147
+ eva_js.resource.registerInstance(eva_js.RESOURCE_TYPE.SPRITE, ({ name, data }) => {
148
+ return new Promise(r => {
149
+ var _a;
150
+ const textureObj = data.json.data;
151
+ const texture = data.image instanceof pixi_js.Texture ? data.image : pixi_js.Texture.from(data.image);
152
+ // Phaser-style atlas JSON often ships frames as an array (`frames: [{ filename, frame, ... }]`)
153
+ // while PixiJS Spritesheet expects a hash (`frames: { name: { frame, ... } }`).
154
+ // TexturePacker "Hash" exports use numeric keys but carry the real name in `filename`.
155
+ // Normalize all three so DSL spawn `texture: "atlas#name"` resolves correctly.
156
+ let frames = textureObj.frames || {};
157
+ if (Array.isArray(frames)) {
158
+ const hashFrames = {};
159
+ for (const f of frames) {
160
+ const key = (_a = f.filename) !== null && _a !== void 0 ? _a : f.name;
161
+ if (key)
162
+ hashFrames[key] = f;
163
+ }
164
+ frames = hashFrames;
165
+ }
166
+ else {
167
+ const sample = Object.values(frames)[0];
168
+ if (sample && typeof sample.filename === 'string') {
169
+ const remapped = {};
170
+ for (const k in frames) {
171
+ const f = frames[k];
172
+ remapped[f.filename || k] = f;
173
+ }
174
+ frames = remapped;
175
+ }
176
+ }
177
+ const animations = textureObj.animations || {};
178
+ const newAnimations = {};
179
+ const newFrames = {};
180
+ for (const key in frames) {
181
+ const newKey = name + resourceKeySplit + key;
182
+ newFrames[newKey] = frames[key];
183
+ }
184
+ for (const key in animations) {
185
+ const spriteList = [];
186
+ if (animations[key] && animations[key].length >= 0) {
187
+ for (const spriteName of animations[key]) {
188
+ const newSpriteName = name + resourceKeySplit + spriteName;
189
+ spriteList.push(newSpriteName);
190
+ }
191
+ }
192
+ newAnimations[key] = spriteList;
193
+ }
194
+ const spriteSheet = new pixi_js.Spritesheet(texture, Object.assign(Object.assign({}, textureObj), { frames: newFrames, animations: newAnimations }));
195
+ spriteSheet.parse().then(() => {
196
+ r(spriteSheet.textures);
197
+ });
198
+ });
199
+ });
200
+ eva_js.resource.registerDestroy(eva_js.RESOURCE_TYPE.SPRITE, ({ instance }) => {
201
+ if (!instance)
202
+ return;
203
+ for (const key in instance) {
204
+ instance[key].destroy(true);
205
+ }
206
+ });
207
+ let Sprite = class Sprite extends pluginRenderer.Renderer {
208
+ constructor() {
209
+ super(...arguments);
210
+ this.name = 'SpriteSystem';
211
+ this.sprites = {};
212
+ }
213
+ init() {
214
+ this.renderSystem = this.game.getSystem(pluginRenderer.RendererSystem);
215
+ this.renderSystem.rendererManager.register(this);
216
+ }
217
+ rendererUpdate(gameObject) {
218
+ const { width, height } = gameObject.transform.size;
219
+ if (this.sprites[gameObject.id]) {
220
+ this.sprites[gameObject.id].sprite.width = width;
221
+ this.sprites[gameObject.id].sprite.height = height;
222
+ }
223
+ }
224
+ componentChanged(changed) {
225
+ return __awaiter(this, void 0, void 0, function* () {
226
+ if (changed.componentName === 'Sprite') {
227
+ const gameObjectId = changed.gameObject.id;
228
+ const component = changed.component;
229
+ if (changed.type === eva_js.OBSERVER_TYPE.ADD) {
230
+ const sprite = new Sprite$2(null);
231
+ this.sprites[changed.gameObject.id] = sprite;
232
+ this.containerManager.getContainer(changed.gameObject.id).addChildAt(sprite.sprite, 0);
233
+ const asyncId = this.increaseAsyncId(gameObjectId);
234
+ const { instance } = yield eva_js.resource.getResource(component.resource);
235
+ if (!this.validateAsyncId(gameObjectId, asyncId))
236
+ return;
237
+ if (!instance) {
238
+ console.error(`GameObject:${changed.gameObject.name}'s Sprite resource load error`);
239
+ return;
240
+ }
241
+ sprite.image = instance[component.resource + resourceKeySplit + component.spriteName];
242
+ }
243
+ else if (changed.type === eva_js.OBSERVER_TYPE.CHANGE) {
244
+ const asyncId = this.increaseAsyncId(gameObjectId);
245
+ const { instance } = yield eva_js.resource.getResource(component.resource);
246
+ if (!this.validateAsyncId(gameObjectId, asyncId))
247
+ return;
248
+ if (!instance) {
249
+ console.error(`GameObject:${changed.gameObject.name}'s Sprite resource load error`);
250
+ return;
251
+ }
252
+ this.sprites[changed.gameObject.id].image =
253
+ instance[component.resource + resourceKeySplit + component.spriteName];
254
+ }
255
+ else if (changed.type === eva_js.OBSERVER_TYPE.REMOVE) {
256
+ this.increaseAsyncId(gameObjectId);
257
+ const sprite = this.sprites[changed.gameObject.id];
258
+ this.containerManager.getContainer(changed.gameObject.id).removeChild(sprite.sprite);
259
+ sprite.sprite.destroy({ children: true });
260
+ delete this.sprites[changed.gameObject.id];
261
+ }
262
+ }
263
+ });
264
+ }
265
+ };
266
+ Sprite.systemName = 'SpriteSystem';
267
+ Sprite = __decorate([
268
+ eva_js.decorators.componentObserver({
269
+ Sprite: ['spriteName'],
270
+ })
271
+ ], Sprite);
272
+ var Sprite$1 = Sprite;
273
+
274
+ exports.Sprite = Sprite$3;
275
+ exports.SpriteSystem = Sprite$1;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@eva/eva.js"),t=require("@eva/inspector-decorator"),r=require("@eva/plugin-renderer"),s=require("pixi.js");function i(e,t,r,s){var i,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,s);else for(var c=e.length-1;c>=0;c--)(i=e[c])&&(o=(n<3?i(o):n>3?i(t,r,o):i(t,r))||o);return n>3&&o&&Object.defineProperty(t,r,o),o}function n(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function o(e,t,r,s){return new(r||(r=Promise))(function(i,n){function o(e){try{a(s.next(e))}catch(e){n(e)}}function c(e){try{a(s.throw(e))}catch(e){n(e)}}function a(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(o,c)}a((s=s.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;class c extends e.Component{constructor(e){super(e),this.resource="",this.spriteName="",this.init(e)}init(e){e&&e.resource&&(this.resource=e.resource,this.spriteName=e.spriteName)}setSprite(e){return this.spriteName=e,this}}c.componentName="Sprite",i([t.type("string"),n("design:type",String)],c.prototype,"resource",void 0),i([t.type("string"),n("design:type",String)],c.prototype,"spriteName",void 0);class a{constructor(e){this._image=null,this._image=e,e?"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement?this.sprite=s.Sprite.from(e):e instanceof s.Texture&&(this.sprite=new s.Sprite(e)):this.sprite=new s.Sprite}set image(e){this._image!==e&&("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement?(this.sprite.texture&&this.sprite.texture.destroy(!1),this.sprite.texture=s.Texture.from(e)):e instanceof s.Texture&&(this.sprite.texture=e),this._image=e)}get image(){return this._image}}const p="_s|r|c_";e.resource.registerInstance(e.RESOURCE_TYPE.SPRITE,({name:e,data:t})=>new Promise(r=>{var i;const n=t.json.data,o=t.image instanceof s.Texture?t.image:s.Texture.from(t.image);let c=n.frames||{};if(Array.isArray(c)){const e={};for(const t of c){const r=null!==(i=t.filename)&&void 0!==i?i:t.name;r&&(e[r]=t)}c=e}else{const e=Object.values(c)[0];if(e&&"string"==typeof e.filename){const e={};for(const t in c){const r=c[t];e[r.filename||t]=r}c=e}}const a=n.animations||{},m={},u={};for(const t in c){u[e+p+t]=c[t]}for(const t in a){const r=[];if(a[t]&&a[t].length>=0)for(const s of a[t]){const t=e+p+s;r.push(t)}m[t]=r}const d=new s.Spritesheet(o,Object.assign(Object.assign({},n),{frames:u,animations:m}));d.parse().then(()=>{r(d.textures)})})),e.resource.registerDestroy(e.RESOURCE_TYPE.SPRITE,({instance:e})=>{if(e)for(const t in e)e[t].destroy(!0)});let m=class extends r.Renderer{constructor(){super(...arguments),this.name="SpriteSystem",this.sprites={}}init(){this.renderSystem=this.game.getSystem(r.RendererSystem),this.renderSystem.rendererManager.register(this)}rendererUpdate(e){const{width:t,height:r}=e.transform.size;this.sprites[e.id]&&(this.sprites[e.id].sprite.width=t,this.sprites[e.id].sprite.height=r)}componentChanged(t){return o(this,void 0,void 0,function*(){if("Sprite"===t.componentName){const r=t.gameObject.id,s=t.component;if(t.type===e.OBSERVER_TYPE.ADD){const i=new a(null);this.sprites[t.gameObject.id]=i,this.containerManager.getContainer(t.gameObject.id).addChildAt(i.sprite,0);const n=this.increaseAsyncId(r),{instance:o}=yield e.resource.getResource(s.resource);if(!this.validateAsyncId(r,n))return;if(!o)return void console.error(`GameObject:${t.gameObject.name}'s Sprite resource load error`);i.image=o[s.resource+p+s.spriteName]}else if(t.type===e.OBSERVER_TYPE.CHANGE){const i=this.increaseAsyncId(r),{instance:n}=yield e.resource.getResource(s.resource);if(!this.validateAsyncId(r,i))return;if(!n)return void console.error(`GameObject:${t.gameObject.name}'s Sprite resource load error`);this.sprites[t.gameObject.id].image=n[s.resource+p+s.spriteName]}else if(t.type===e.OBSERVER_TYPE.REMOVE){this.increaseAsyncId(r);const e=this.sprites[t.gameObject.id];this.containerManager.getContainer(t.gameObject.id).removeChild(e.sprite),e.sprite.destroy({children:!0}),delete this.sprites[t.gameObject.id]}}})}};m.systemName="SpriteSystem",m=i([e.decorators.componentObserver({Sprite:["spriteName"]})],m);var u=m;exports.Sprite=c,exports.SpriteSystem=u;
@@ -0,0 +1,71 @@
1
+ import { Component } from '@eva/eva.js';
2
+ import { ComponentChanged } from '@eva/eva.js';
3
+ import { ContainerManager } from '@eva/plugin-renderer';
4
+ import { GameObject } from '@eva/eva.js';
5
+ import { Renderer } from '@eva/plugin-renderer';
6
+ import { RendererManager } from '@eva/plugin-renderer';
7
+ import { RendererSystem } from '@eva/plugin-renderer';
8
+ import { Sprite as Sprite_2 } from '@eva/renderer-adapter';
9
+
10
+ /**
11
+ * 精灵图组件
12
+ *
13
+ * Sprite 组件用于渲染精灵图集(Sprite Sheet)中的单个精灵。
14
+ * 它从一个包含多个小图的大图资源中提取指定的子图进行渲染,
15
+ * 这种方式可以减少纹理切换,提高渲染性能。
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * // 渲染精灵图集中的某个精灵
20
+ * const player = new GameObject('player');
21
+ * player.addComponent(new Sprite({
22
+ * resource: 'playerAtlas', // 资源名称
23
+ * spriteName: 'player_idle_01.png' // 精灵图集中的子图名称
24
+ * }));
25
+ * ```
26
+ */
27
+ export declare class Sprite extends Component<SpriteParams> {
28
+ /** 组件名称 */
29
+ static componentName: string;
30
+ /** 精灵图集资源名称 */
31
+ resource: string;
32
+ /** 精灵图集中的子图名称 */
33
+ spriteName: string;
34
+ constructor(params?: SpriteParams);
35
+ /**
36
+ * 初始化组件
37
+ * @param obj - 初始化参数
38
+ *
39
+ * 配置项包括 resource 和 spriteName。
40
+ */
41
+ init(obj?: SpriteParams): void;
42
+ /**
43
+ * 切换当前精灵图集帧。
44
+ *
45
+ * SpriteSystem 会监听 spriteName 变化并刷新渲染纹理。
46
+ *
47
+ * @param spriteName - 精灵图集中的子图名称
48
+ */
49
+ setSprite(spriteName: string): this;
50
+ }
51
+
52
+ export declare interface SpriteParams {
53
+ resource: string;
54
+ spriteName: string;
55
+ }
56
+
57
+ export declare class SpriteSystem extends Renderer {
58
+ static systemName: string;
59
+ name: string;
60
+ sprites: {
61
+ [propName: number]: Sprite_2;
62
+ };
63
+ renderSystem: RendererSystem;
64
+ rendererManager: RendererManager;
65
+ containerManager: ContainerManager;
66
+ init(): void;
67
+ rendererUpdate(gameObject: GameObject): void;
68
+ componentChanged(changed: ComponentChanged): Promise<void>;
69
+ }
70
+
71
+ export { }
@@ -0,0 +1,270 @@
1
+ import { Component, resource, RESOURCE_TYPE, decorators, OBSERVER_TYPE } from '@eva/eva.js';
2
+ import { type } from '@eva/inspector-decorator';
3
+ import { Renderer, RendererSystem } from '@eva/plugin-renderer';
4
+ import { Sprite as Sprite$4, Texture, Spritesheet } from 'pixi.js';
5
+
6
+ /******************************************************************************
7
+ Copyright (c) Microsoft Corporation.
8
+
9
+ Permission to use, copy, modify, and/or distribute this software for any
10
+ purpose with or without fee is hereby granted.
11
+
12
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
13
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
14
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
15
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
16
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
17
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
18
+ PERFORMANCE OF THIS SOFTWARE.
19
+ ***************************************************************************** */
20
+
21
+ function __decorate(decorators, target, key, desc) {
22
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
23
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
24
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
25
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
26
+ }
27
+
28
+ function __metadata(metadataKey, metadataValue) {
29
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
30
+ }
31
+
32
+ function __awaiter(thisArg, _arguments, P, generator) {
33
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
34
+ return new (P || (P = Promise))(function (resolve, reject) {
35
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
36
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
37
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
38
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
39
+ });
40
+ }
41
+
42
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
43
+ var e = new Error(message);
44
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
45
+ };
46
+
47
+ /**
48
+ * 精灵图组件
49
+ *
50
+ * Sprite 组件用于渲染精灵图集(Sprite Sheet)中的单个精灵。
51
+ * 它从一个包含多个小图的大图资源中提取指定的子图进行渲染,
52
+ * 这种方式可以减少纹理切换,提高渲染性能。
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * // 渲染精灵图集中的某个精灵
57
+ * const player = new GameObject('player');
58
+ * player.addComponent(new Sprite({
59
+ * resource: 'playerAtlas', // 资源名称
60
+ * spriteName: 'player_idle_01.png' // 精灵图集中的子图名称
61
+ * }));
62
+ * ```
63
+ */
64
+ class Sprite$3 extends Component {
65
+ constructor(params) {
66
+ super(params);
67
+ /** 精灵图集资源名称 */
68
+ this.resource = '';
69
+ /** 精灵图集中的子图名称 */
70
+ this.spriteName = '';
71
+ this.init(params);
72
+ }
73
+ /**
74
+ * 初始化组件
75
+ * @param obj - 初始化参数
76
+ *
77
+ * 配置项包括 resource 和 spriteName。
78
+ */
79
+ init(obj) {
80
+ if (obj && obj.resource) {
81
+ this.resource = obj.resource;
82
+ this.spriteName = obj.spriteName;
83
+ }
84
+ }
85
+ /**
86
+ * 切换当前精灵图集帧。
87
+ *
88
+ * SpriteSystem 会监听 spriteName 变化并刷新渲染纹理。
89
+ *
90
+ * @param spriteName - 精灵图集中的子图名称
91
+ */
92
+ setSprite(spriteName) {
93
+ this.spriteName = spriteName;
94
+ return this;
95
+ }
96
+ }
97
+ /** 组件名称 */
98
+ Sprite$3.componentName = 'Sprite';
99
+ __decorate([
100
+ type('string'),
101
+ __metadata("design:type", String)
102
+ ], Sprite$3.prototype, "resource", void 0);
103
+ __decorate([
104
+ type('string'),
105
+ __metadata("design:type", String)
106
+ ], Sprite$3.prototype, "spriteName", void 0);
107
+
108
+ class Sprite$2 {
109
+ constructor(image) {
110
+ this._image = null;
111
+ this._image = image;
112
+ if (image) {
113
+ if (typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement) {
114
+ this.sprite = Sprite$4.from(image);
115
+ }
116
+ else if (image instanceof Texture) {
117
+ this.sprite = new Sprite$4(image);
118
+ }
119
+ }
120
+ else {
121
+ this.sprite = new Sprite$4();
122
+ }
123
+ }
124
+ set image(val) {
125
+ if (this._image === val) {
126
+ return;
127
+ }
128
+ if (typeof HTMLImageElement !== 'undefined' && val instanceof HTMLImageElement) {
129
+ this.sprite.texture && this.sprite.texture.destroy(false);
130
+ this.sprite.texture = Texture.from(val);
131
+ }
132
+ else if (val instanceof Texture) {
133
+ this.sprite.texture = val;
134
+ }
135
+ this._image = val;
136
+ }
137
+ get image() {
138
+ return this._image;
139
+ }
140
+ }
141
+
142
+ const resourceKeySplit = '_s|r|c_'; // Notice: This key be used in ninepatch system.
143
+ resource.registerInstance(RESOURCE_TYPE.SPRITE, ({ name, data }) => {
144
+ return new Promise(r => {
145
+ var _a;
146
+ const textureObj = data.json.data;
147
+ const texture = data.image instanceof Texture ? data.image : Texture.from(data.image);
148
+ // Phaser-style atlas JSON often ships frames as an array (`frames: [{ filename, frame, ... }]`)
149
+ // while PixiJS Spritesheet expects a hash (`frames: { name: { frame, ... } }`).
150
+ // TexturePacker "Hash" exports use numeric keys but carry the real name in `filename`.
151
+ // Normalize all three so DSL spawn `texture: "atlas#name"` resolves correctly.
152
+ let frames = textureObj.frames || {};
153
+ if (Array.isArray(frames)) {
154
+ const hashFrames = {};
155
+ for (const f of frames) {
156
+ const key = (_a = f.filename) !== null && _a !== void 0 ? _a : f.name;
157
+ if (key)
158
+ hashFrames[key] = f;
159
+ }
160
+ frames = hashFrames;
161
+ }
162
+ else {
163
+ const sample = Object.values(frames)[0];
164
+ if (sample && typeof sample.filename === 'string') {
165
+ const remapped = {};
166
+ for (const k in frames) {
167
+ const f = frames[k];
168
+ remapped[f.filename || k] = f;
169
+ }
170
+ frames = remapped;
171
+ }
172
+ }
173
+ const animations = textureObj.animations || {};
174
+ const newAnimations = {};
175
+ const newFrames = {};
176
+ for (const key in frames) {
177
+ const newKey = name + resourceKeySplit + key;
178
+ newFrames[newKey] = frames[key];
179
+ }
180
+ for (const key in animations) {
181
+ const spriteList = [];
182
+ if (animations[key] && animations[key].length >= 0) {
183
+ for (const spriteName of animations[key]) {
184
+ const newSpriteName = name + resourceKeySplit + spriteName;
185
+ spriteList.push(newSpriteName);
186
+ }
187
+ }
188
+ newAnimations[key] = spriteList;
189
+ }
190
+ const spriteSheet = new Spritesheet(texture, Object.assign(Object.assign({}, textureObj), { frames: newFrames, animations: newAnimations }));
191
+ spriteSheet.parse().then(() => {
192
+ r(spriteSheet.textures);
193
+ });
194
+ });
195
+ });
196
+ resource.registerDestroy(RESOURCE_TYPE.SPRITE, ({ instance }) => {
197
+ if (!instance)
198
+ return;
199
+ for (const key in instance) {
200
+ instance[key].destroy(true);
201
+ }
202
+ });
203
+ let Sprite = class Sprite extends Renderer {
204
+ constructor() {
205
+ super(...arguments);
206
+ this.name = 'SpriteSystem';
207
+ this.sprites = {};
208
+ }
209
+ init() {
210
+ this.renderSystem = this.game.getSystem(RendererSystem);
211
+ this.renderSystem.rendererManager.register(this);
212
+ }
213
+ rendererUpdate(gameObject) {
214
+ const { width, height } = gameObject.transform.size;
215
+ if (this.sprites[gameObject.id]) {
216
+ this.sprites[gameObject.id].sprite.width = width;
217
+ this.sprites[gameObject.id].sprite.height = height;
218
+ }
219
+ }
220
+ componentChanged(changed) {
221
+ return __awaiter(this, void 0, void 0, function* () {
222
+ if (changed.componentName === 'Sprite') {
223
+ const gameObjectId = changed.gameObject.id;
224
+ const component = changed.component;
225
+ if (changed.type === OBSERVER_TYPE.ADD) {
226
+ const sprite = new Sprite$2(null);
227
+ this.sprites[changed.gameObject.id] = sprite;
228
+ this.containerManager.getContainer(changed.gameObject.id).addChildAt(sprite.sprite, 0);
229
+ const asyncId = this.increaseAsyncId(gameObjectId);
230
+ const { instance } = yield resource.getResource(component.resource);
231
+ if (!this.validateAsyncId(gameObjectId, asyncId))
232
+ return;
233
+ if (!instance) {
234
+ console.error(`GameObject:${changed.gameObject.name}'s Sprite resource load error`);
235
+ return;
236
+ }
237
+ sprite.image = instance[component.resource + resourceKeySplit + component.spriteName];
238
+ }
239
+ else if (changed.type === OBSERVER_TYPE.CHANGE) {
240
+ const asyncId = this.increaseAsyncId(gameObjectId);
241
+ const { instance } = yield resource.getResource(component.resource);
242
+ if (!this.validateAsyncId(gameObjectId, asyncId))
243
+ return;
244
+ if (!instance) {
245
+ console.error(`GameObject:${changed.gameObject.name}'s Sprite resource load error`);
246
+ return;
247
+ }
248
+ this.sprites[changed.gameObject.id].image =
249
+ instance[component.resource + resourceKeySplit + component.spriteName];
250
+ }
251
+ else if (changed.type === OBSERVER_TYPE.REMOVE) {
252
+ this.increaseAsyncId(gameObjectId);
253
+ const sprite = this.sprites[changed.gameObject.id];
254
+ this.containerManager.getContainer(changed.gameObject.id).removeChild(sprite.sprite);
255
+ sprite.sprite.destroy({ children: true });
256
+ delete this.sprites[changed.gameObject.id];
257
+ }
258
+ }
259
+ });
260
+ }
261
+ };
262
+ Sprite.systemName = 'SpriteSystem';
263
+ Sprite = __decorate([
264
+ decorators.componentObserver({
265
+ Sprite: ['spriteName'],
266
+ })
267
+ ], Sprite);
268
+ var Sprite$1 = Sprite;
269
+
270
+ export { Sprite$3 as Sprite, Sprite$1 as SpriteSystem };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eva/plugin-renderer-sprite",
3
- "version": "2.1.0-beta.3",
3
+ "version": "2.1.0-beta.5",
4
4
  "description": "@eva/plugin-renderer-sprite",
5
5
  "main": "index.js",
6
6
  "module": "dist/plugin-renderer-sprite.esm.js",
@@ -19,8 +19,8 @@
19
19
  "homepage": "https://eva.js.org",
20
20
  "dependencies": {
21
21
  "@eva/inspector-decorator": "^2.0.0-beta.0",
22
- "@eva/plugin-renderer": "2.1.0-beta.3",
23
- "@eva/eva.js": "2.1.0-beta.3",
22
+ "@eva/plugin-renderer": "2.1.0-beta.5",
23
+ "@eva/eva.js": "2.1.0-beta.5",
24
24
  "pixi.js": "^8.17.0"
25
25
  }
26
26
  }