const { ccclass , property } = cc . _decorator ; @ ccclass export default class Moving_ghost extends cc . Component { @ property ( [ cc . Sprite ] ) ghostCanvasList : cc . Sprite [ ] = [ ] ; @ property ( cc . Node ) role : cc . Node = null ; @ property ( cc . Camera ) roleCamera : cc . Camera = null ; onLoad ( ) { const roleZindex = 10 ; this . role . zIndex = roleZindex ; const texture = new cc . RenderTexture ( ) ; texture . initWithSize ( this . node . width , this . node . height ) ; const spriteFrame = new cc . SpriteFrame ( ) ; spriteFrame . setTexture ( texture ) ; this . roleCamera . targetTexture = texture ; this . ghostCanvasList . forEach ( ( ghost , idx ) => { ghost . node . scaleY = - 1 ; ghost . node . zIndex = roleZindex - idx ; ghost . node . opacity = 100 - idx * 15 ; ghost . spriteFrame = spriteFrame ; } ) ; this . schedule ( this . ghostFollow , 0.1 , cc . macro . REPEAT_FOREVER ) ; this . node . on ( cc . Node . EventType . TOUCH_MOVE , this . touchMoveEvent , this ) ; } touchMoveEvent ( evt ) { this . role . x += evt . getDeltaX ( ) ; this . role . y += evt . getDeltaY ( ) ; } beforeDestroy ( ) { this . unschedule ( this . ghostFollow ) ; } ghostFollow ( ) { this . ghostCanvasList . forEach ( ( ghost , i ) => { const dis = ( ghost . node . position as any ) . sub ( this . role . position ) . mag ( ) ; if ( dis < 0.5 ) return ; ghost . node . stopAllActions ( ) ; ghost . node . runAction ( cc . moveTo ( i * 0.04 + 0.02 , this . role . x , this . role . y ) ) ; } ) ; } }