From ab831b7cdc5419b8a7874f90475d096b7f456e87 Mon Sep 17 00:00:00 2001 From: walker Date: Mon, 15 May 2023 15:34:15 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=B5=84=E6=BA=90=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E6=96=B9=E5=BC=8F=EF=BC=8C=E4=BD=BF=E7=94=A8spriteshe?= =?UTF-8?q?et=E6=9B=BF=E6=8D=A2=E4=B8=80=E4=B8=AA=E4=B8=AA=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=8A=A0=E8=BD=BD=20=E8=B0=83=E6=95=B4=E5=8A=A8?= =?UTF-8?q?=E7=94=BB=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=80=8D?= =?UTF-8?q?=E9=80=9F=E6=8E=A7=E5=88=B6=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/examples/app/index.ts | 5 +- src/graphics/iscs-fan/IscsFan.ts | 94 ++++++++++++------ src/graphics/iscs-fan/assets/fan-blue.png | Bin 5030 -> 0 bytes src/graphics/iscs-fan/assets/fan-border.png | Bin 3355 -> 0 bytes src/graphics/iscs-fan/assets/fan-gray.png | Bin 4764 -> 0 bytes src/graphics/iscs-fan/assets/fan-green.png | Bin 4304 -> 0 bytes src/graphics/iscs-fan/assets/fan-red.png | Bin 4980 -> 0 bytes src/graphics/iscs-fan/assets/fan-yellow.png | Bin 4245 -> 0 bytes src/graphics/iscs-fan/iscs-fan-data.json | 66 ++++++++++++ .../iscs-fan/iscs-fan-spritesheet.png | Bin 0 -> 15944 bytes src/jlgraphic/core/JlGraphic.ts | 22 +++- src/jlgraphic/plugins/KeyboardPlugin.ts | 2 +- 12 files changed, 153 insertions(+), 36 deletions(-) delete mode 100644 src/graphics/iscs-fan/assets/fan-blue.png delete mode 100644 src/graphics/iscs-fan/assets/fan-border.png delete mode 100644 src/graphics/iscs-fan/assets/fan-gray.png delete mode 100644 src/graphics/iscs-fan/assets/fan-green.png delete mode 100644 src/graphics/iscs-fan/assets/fan-red.png delete mode 100644 src/graphics/iscs-fan/assets/fan-yellow.png create mode 100644 src/graphics/iscs-fan/iscs-fan-data.json create mode 100644 src/graphics/iscs-fan/iscs-fan-spritesheet.png diff --git a/src/examples/app/index.ts b/src/examples/app/index.ts index 168a9cf..4fa4ac1 100644 --- a/src/examples/app/index.ts +++ b/src/examples/app/index.ts @@ -117,10 +117,11 @@ export function initDrawApp(app: JlDrawApp) { ); app.addKeyboardListener( new KeyListener({ - value: 'KeyR', + value: '1', onPress: () => { app.queryStore.queryByType(IscsFan.Type).forEach((fan) => { - fan._run = !fan._run; + fan.__state = fan.__state + 1; + fan.__state = fan.__state % 5; fan.repaint(); }); }, diff --git a/src/graphics/iscs-fan/IscsFan.ts b/src/graphics/iscs-fan/IscsFan.ts index e47bb8c..fdc71d5 100644 --- a/src/graphics/iscs-fan/IscsFan.ts +++ b/src/graphics/iscs-fan/IscsFan.ts @@ -4,13 +4,10 @@ import { JlGraphic, JlGraphicTemplate, } from 'src/jlgraphic'; -import fanBorder from './assets/fan-border.png'; -import fanBlue from './assets/fan-blue.png'; -import fanGray from './assets/fan-gray.png'; -import fanGreen from './assets/fan-green.png'; -import fanRed from './assets/fan-red.png'; -import fanYellow from './assets/fan-yellow.png'; -import { Assets, Sprite, Texture } from 'pixi.js'; +import ISCS_FAN_Assets from './iscs-fan-spritesheet.png'; +import ISCS_FAN_JSON from './iscs-fan-data.json'; + +import { Assets, Sprite, Spritesheet, Texture } from 'pixi.js'; interface FanTextures { border: Texture; @@ -31,7 +28,7 @@ export class IscsFan extends JlGraphic { _border: Sprite; _fan: Sprite; fanTextures: FanTextures; - _run = false; + __state = 0; constructor(fanTextures: FanTextures) { super(IscsFan.Type); @@ -46,21 +43,56 @@ export class IscsFan extends JlGraphic { this.addChild(this._fan); } doRepaint(): void { - if (this._run) { - this._fan.texture = this.fanTextures.green; - // 动画 - this.addAnimation( - GraphicAnimation.init({ - name: 'fan_run', - run: (dt: number) => { - this._fan.angle = (this._fan.angle + dt * 3) % 360; - }, - }).resume() - ); - } else { - this.removeAnimation('fan_run'); + if (this.__state === 0) { + // 停止 + this.stopFanRun(); this._fan.rotation = 0; this._fan.texture = this.fanTextures.gray; + } else if (this.__state === 1) { + // 正常运行 + this._fan.texture = this.fanTextures.green; + // 动画 + this.initFanRun(); + } else if (this.__state === 2) { + // 报警运行 + this._fan.texture = this.fanTextures.yellow; + // 动画 + this.initFanRun(); + } else if (this.__state === 3) { + // 故障 + this.stopFanRun(); + this._fan.rotation = 0; + this._fan.texture = this.fanTextures.red; + } else if (this.__state === 4) { + // 通信故障 + // 停止 + this.stopFanRun(); + this._fan.rotation = 0; + this._fan.texture = this.fanTextures.blue; + } + } + initFanRun() { + // 动画 + const name = 'fan_run'; + let fanRun = this.animation(name); + if (!fanRun) { + fanRun = GraphicAnimation.init({ + name: 'fan_run', + run: (dt: number) => { + this._fan.angle = (this._fan.angle + dt) % 360; + }, + }); + this.addAnimation(fanRun); + } + const speed = Math.round(Math.random() * 10) + 1; + fanRun.xSpeed = speed; + fanRun.resume(); + } + stopFanRun() { + const name = 'fan_run'; + const fanRun = this.animation(name); + if (fanRun) { + fanRun.pause(); } } } @@ -77,15 +109,17 @@ export class IscsFanTemplate extends JlGraphicTemplate { throw new Error('资源未加载/加载失败'); } async loadAssets(): Promise { - Assets.addBundle('iscsFan', { - border: fanBorder, - blue: fanBlue, - gray: fanGray, - green: fanGreen, - red: fanRed, - yellow: fanYellow, - }); - this.fanTextures = await Assets.loadBundle('iscsFan'); + const texture = await Assets.load(ISCS_FAN_Assets); + const iscsFanSheet = new Spritesheet(texture, ISCS_FAN_JSON); + const result = await iscsFanSheet.parse(); + this.fanTextures = { + border: result['fan-border.png'], + blue: result['fan-blue.png'], + gray: result['fan-gray.png'], + green: result['fan-green.png'], + red: result['fan-red.png'], + yellow: result['fan-yellow.png'], + }; return this.fanTextures as FanTextures; } } diff --git a/src/graphics/iscs-fan/assets/fan-blue.png b/src/graphics/iscs-fan/assets/fan-blue.png deleted file mode 100644 index 31bf36d6908437ce242c1f903f749be44ffa8db8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5030 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 Dm?E65 diff --git a/src/graphics/iscs-fan/assets/fan-border.png b/src/graphics/iscs-fan/assets/fan-border.png deleted file mode 100644 index 6d95a5886ad7b82161ee80f99084bda5115b0dc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3355 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 L=)tbA-<13t2M|Qr diff --git a/src/graphics/iscs-fan/assets/fan-gray.png b/src/graphics/iscs-fan/assets/fan-gray.png deleted file mode 100644 index 3677b8c7503f1dddf7bd198dbbf4132873d5f13a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4764 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 diff --git a/src/graphics/iscs-fan/assets/fan-green.png b/src/graphics/iscs-fan/assets/fan-green.png deleted file mode 100644 index 8f4da74be0a028d9b2210db66641e267410508a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4304 zcmcIoc{r49+nF5HY5fj^2uM}IK_fm$GaW+AeUsUr~bH@Mz@5@Wqr!Dta210=K2ZI5aSAA_=CVt)&hDKe{_$D-b~d z5es6NAV>hr$yhwm)RaUr1_&Sl#DV5GJcuC>C?JtyW&+Io(6BcVi%s#Q+0XcbdsH+> zA`wz>xQK`dY=j9`APU6c$z(DPB;W`H3~YfBNAV?$NDN=B{R4ppiJ2mDBEv3HaZ!g)esL70dM z*@eSlYD=>bQfx&KLn07)3j`rQHp=}+$N+(W1px!;-hd=L3CqLcK|En*uShsNi2|@m z1h%P(i8&E(2ml7YTs}(>AvXL48lo{I5ETt$m|#FN3`p_@$rMwNf;U?Mk|-ef-IOk1 zaoJJ-W{L-;QZOO@lPN4N7DK}LUyWHz3R@uJF<@%AJVqdd6Y>Mmz)!*{wt^6W2zCrd zXY%W~ldY}0NWkWXz!PFm2OGf2&X$NL6NwlC7C#*>olbG$izN&`6LO+a(J+lzE|*0i zK&BwXG$msQOah1jO-)TOWK+l-LxcxGh|M75&B#C2(*(>gsaT}zzt;^*z=SdWCp;4q zB8iDNV`Io9m^U)f6n>d72pA&6oB^4z13)&z><5~ghzpl4Bji_9X;ds2kq8plEEdrm z6F?vnF-*KE5kqE>Nf=XeJP`^2nWk(aNm?M&nxi;!#jqNpW=hTr3Y}?%aDi!=Q5Z~V z`B2eJscs+^dS;mW7kvCzo@draa3C1;Kd9upcd>viiC~Bz>p+;h|3kgv{x(ekKO7SM zlBkd&V!-DcBob56Y>|KmeAiYWmkme+GaaeW{uWWp2>;Kt{dY3@&d0ye_OBK5|4ZA< z<}o=8ejo(j7`W-QaniH(yL52>s;cR^U(R8e_vs<{aF;fJ-YRhC=e-2+VQ3M2>)5x| z?1C@25+|Cqx8JSze!=cOEsMHdZ&XOqGbp@)P*uUJ-gY0*OVSYI5-5$)Bu7)b^mO;&1pYp{`xQU~2#yDJ6F0XC;LSbQ{3IstxO=iJQM=
_o8sFc2^eZTLmDgUn@mzWNS`B^c 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 E1M9dm$c+2NdN#KO|m4C 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 diff --git a/src/graphics/iscs-fan/assets/fan-yellow.png b/src/graphics/iscs-fan/assets/fan-yellow.png deleted file mode 100644 index 668622af5b3365f80bf30d63e7a3fee965f5e63c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4245 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 jOTcyCEHyV0JQV this.toLocal(p)); -} +}; DisplayObject.prototype.localBoundsToCanvasPoints = function localBoundsToCanvasPoints() { @@ -522,10 +522,15 @@ export interface GraphicAnimationOptions { export class GraphicAnimation { options: GraphicAnimationOptions; _running: boolean; + /** + * 倍速 + */ + _xSpeed: number; _finish: boolean; constructor(options: GraphicAnimationOptions) { this.options = options; this._running = false; + this._xSpeed = 1; this._finish = false; } @@ -550,9 +555,17 @@ export class GraphicAnimation { return this._running; } + public get xSpeed(): number { + return this._xSpeed; + } + + public set xSpeed(v: number) { + this._xSpeed = v; + } + run(dt: number): GraphicAnimation { if (this.options.run) { - this.options.run(dt); + this.options.run(dt * this.xSpeed); } return this; } @@ -585,6 +598,9 @@ export abstract class JlGraphic extends Container { removeAnimation(name: string): void { this.animationMap.delete(name); } + animation(name: string): GraphicAnimation | undefined { + return this.animationMap.get(name); + } /** * 更新选中状态 diff --git a/src/jlgraphic/plugins/KeyboardPlugin.ts b/src/jlgraphic/plugins/KeyboardPlugin.ts index 676c9c6..31cd104 100644 --- a/src/jlgraphic/plugins/KeyboardPlugin.ts +++ b/src/jlgraphic/plugins/KeyboardPlugin.ts @@ -84,7 +84,7 @@ export class JlGraphicAppKeyboardPlugin { // console.log('Mousedown Event', node.nodeName, node.nodeType, node.nodeValue) }; const keydownHandle = (e: KeyboardEvent) => { - // console.log(e.key, e.code, e.keyCode); + console.debug(e.key, e.code, e.keyCode); if (target && target == this.app.dom.getElementsByTagName('canvas')[0]) { const listenerMap = this.getKeyListener(e); listenerMap?.forEach((listener) => {