@@ -17,6 +17,7 @@ export interface IAnimationObject {
1717 setEndState : Function ;
1818 tickerFunc : PIXI . TickerCallback < number > ;
1919 getEndStateEffect ?: Function ;
20+ forceStopWithoutSetEndState ?: Function ;
2021}
2122
2223interface IStageAnimationObject {
@@ -34,7 +35,7 @@ export interface IStageObject {
3435 uuid : string ;
3536 // 一般与作用目标有关
3637 key : string ;
37- pixiContainer : WebGALPixiContainer ;
38+ pixiContainer : WebGALPixiContainer | null ;
3839 // 相关的源 url
3940 sourceUrl : string ;
4041 sourceExt : string ;
@@ -235,7 +236,7 @@ export default class PixiStage {
235236 const targetPixiContainer = this . getStageObjByKey ( target ) ;
236237 if ( targetPixiContainer ) {
237238 const container = targetPixiContainer . pixiContainer ;
238- PixiStage . assignTransform ( container , effect . transform ) ;
239+ if ( container ) PixiStage . assignTransform ( container , effect . transform ) ;
239240 }
240241 return ;
241242 }
@@ -267,6 +268,19 @@ export default class PixiStage {
267268 }
268269 }
269270
271+ public removeAnimationWithoutSetEndState ( key : string ) {
272+ const index = this . stageAnimations . findIndex ( ( e ) => e . key === key ) ;
273+ if ( index >= 0 ) {
274+ const thisTickerFunc = this . stageAnimations [ index ] ;
275+ this . currentApp ?. ticker . remove ( thisTickerFunc . animationObject . tickerFunc ) ;
276+ if ( thisTickerFunc . animationObject . forceStopWithoutSetEndState ) {
277+ thisTickerFunc . animationObject . forceStopWithoutSetEndState ( ) ;
278+ }
279+ this . unlockStageObject ( thisTickerFunc . targetKey ?? 'default' ) ;
280+ this . stageAnimations . splice ( index , 1 ) ;
281+ }
282+ }
283+
270284 public removeAllAnimations ( ) {
271285 while ( this . stageAnimations . length > 0 ) {
272286 this . removeAnimationByIndex ( 0 ) ;
@@ -776,6 +790,7 @@ export default class PixiStage {
776790 const figureRecordTarget = this . live2dFigureRecorder . find ( ( e ) => e . target === key ) ;
777791 if ( target && figureRecordTarget ?. motion !== motion ) {
778792 const container = target . pixiContainer ;
793+ if ( ! container ) return ;
779794 const children = container . children ;
780795 for ( const model of children ) {
781796 let category_name = motion ;
@@ -799,6 +814,7 @@ export default class PixiStage {
799814 if ( target ?. sourceType !== 'spine' ) return ;
800815
801816 const container = target . pixiContainer ;
817+ if ( ! container ) return ;
802818 // Spine figure 结构: Container -> Sprite -> Spine
803819 const sprite = container . children [ 0 ] as PIXI . Container ;
804820 if ( sprite ?. children ?. [ 0 ] ) {
@@ -825,6 +841,7 @@ export default class PixiStage {
825841 const figureRecordTarget = this . live2dFigureRecorder . find ( ( e ) => e . target === key ) ;
826842 if ( target && figureRecordTarget ?. expression !== expression ) {
827843 const container = target . pixiContainer ;
844+ if ( ! container ) return ;
828845 const children = container . children ;
829846 for ( const model of children ) {
830847 // @ts -ignore
@@ -840,6 +857,7 @@ export default class PixiStage {
840857 const figureRecordTarget = this . live2dFigureRecorder . find ( ( e ) => e . target === key ) ;
841858 if ( target && ! isEqual ( figureRecordTarget ?. blink , blinkParam ) ) {
842859 const container = target . pixiContainer ;
860+ if ( ! container ) return ;
843861 const children = container . children ;
844862 let newBlinkParam : BlinkParam = { ...baseBlinkParam , ...blinkParam } ;
845863 // 继承现有 BlinkParam
@@ -860,6 +878,7 @@ export default class PixiStage {
860878 const figureRecordTarget = this . live2dFigureRecorder . find ( ( e ) => e . target === key ) ;
861879 if ( target && ! isEqual ( figureRecordTarget ?. focus , focusParam ) ) {
862880 const container = target . pixiContainer ;
881+ if ( ! container ) return ;
863882 const children = container . children ;
864883 let newFocusParam : FocusParam = { ...baseFocusParam , ...focusParam } ;
865884 // 继承现有 FocusParam
@@ -883,6 +902,7 @@ export default class PixiStage {
883902 const target = this . figureObjects . find ( ( e ) => e . key === key ) ;
884903 if ( target && target . sourceType === 'live2d' ) {
885904 const container = target . pixiContainer ;
905+ if ( ! container ) return ;
886906 const children = container . children ;
887907 for ( const model of children ) {
888908 // @ts -ignore
@@ -925,20 +945,28 @@ export default class PixiStage {
925945 const indexBg = this . backgroundObjects . findIndex ( ( e ) => e . key === key ) ;
926946 if ( indexFig >= 0 ) {
927947 const bgSprite = this . figureObjects [ indexFig ] ;
928- for ( const element of bgSprite . pixiContainer . children ) {
929- element . destroy ( ) ;
948+ if ( bgSprite . pixiContainer )
949+ for ( const element of bgSprite . pixiContainer . children ) {
950+ element . destroy ( ) ;
951+ }
952+ if ( bgSprite . pixiContainer ) {
953+ bgSprite . pixiContainer . destroy ( ) ;
954+ this . figureContainer . removeChild ( bgSprite . pixiContainer ) ;
930955 }
931- bgSprite . pixiContainer . destroy ( ) ;
932- this . figureContainer . removeChild ( bgSprite . pixiContainer ) ;
956+ bgSprite . pixiContainer = null ;
933957 this . figureObjects . splice ( indexFig , 1 ) ;
934958 }
935959 if ( indexBg >= 0 ) {
936960 const bgSprite = this . backgroundObjects [ indexBg ] ;
937- for ( const element of bgSprite . pixiContainer . children ) {
938- element . destroy ( ) ;
961+ if ( bgSprite . pixiContainer )
962+ for ( const element of bgSprite . pixiContainer . children ) {
963+ element . destroy ( ) ;
964+ }
965+ if ( bgSprite . pixiContainer ) {
966+ bgSprite . pixiContainer . destroy ( ) ;
967+ this . backgroundContainer . removeChild ( bgSprite . pixiContainer ) ;
939968 }
940- bgSprite . pixiContainer . destroy ( ) ;
941- this . backgroundContainer . removeChild ( bgSprite . pixiContainer ) ;
969+ bgSprite . pixiContainer = null ;
942970 this . backgroundObjects . splice ( indexBg , 1 ) ;
943971 }
944972 // /**
0 commit comments