11import { Part } from "./Part" ;
2- import { Camera } from "./Camera" ;
32import { Transform } from "./Children/Transform" ;
43import { Vector } from "../Math/Vector" ;
4+ import type { Follow } from "./Follow" ;
55
66export class CameraShake extends Part {
77 intensity : number ;
88 duration : number ;
9+ initialized : boolean = false ;
910 private shakeTimer : number = 0 ;
1011 private originalCameraPosition : Vector | null = null ;
1112
12- constructor ( { name , intensity = 5 , duration = 60 } : { name ?: string , intensity ?: number , duration ?: number } ) {
13- super ( { name : name || 'CameraShake' } ) ;
13+ constructor ( { intensity = 5 , duration = 60 } : { intensity ?: number , duration ?: number } ) {
14+ super ( { name :'CameraShake' } ) ;
1415 this . intensity = intensity ;
1516 this . duration = duration ;
1617 this . debugEmoji = " tremors" ;
18+ this . type = "CameraShake" ;
1719 }
1820
19- onMount ( parent : Part ) {
20- super . onMount ( parent ) ;
21+ initialize ( ) {
22+ this . initialized = true ;
2123 // Find the camera in the scene and store its original position
2224 const camera = this . top ?. currentScene ?. activeCamera ;
2325 if ( camera ) {
24- const cameraTransform = camera . children [ " Transform" ] as Transform | undefined ;
26+ const cameraTransform = camera . child < Transform > ( " Transform" ) ;
2527 if ( cameraTransform ) {
2628 this . originalCameraPosition = cameraTransform . position . clone ( ) ;
2729 }
2830 }
2931 }
30-
3132 shake ( ) {
3233 this . shakeTimer = this . duration ;
3334 }
3435
3536 act ( delta : number ) {
3637 super . act ( delta ) ;
38+ if ( ! this . initialized ) {
39+ this . initialize ( ) ;
40+ }
41+
42+ const camera = this . top ?. currentScene ?. activeCamera ;
43+ const follow = camera ?. child < Follow > ( "Follow" ) ;
44+ const transform = camera ?. child < Transform > ( "Transform" ) ;
45+
3746 if ( this . shakeTimer > 0 ) {
38- const camera = this . top ?. currentScene ?. activeCamera ;
39- if ( camera ) {
40- const cameraTransform = camera . children [ "Transform" ] as Transform | undefined ;
41- if ( cameraTransform ) {
42- const offsetX = ( Math . random ( ) - 0.5 ) * this . intensity ;
43- const offsetY = ( Math . random ( ) - 0.5 ) * this . intensity ;
44- cameraTransform . moveTo ( this . originalCameraPosition ! . add ( new Vector ( offsetX , offsetY ) ) ) ;
45- }
47+ const offsetX = ( Math . random ( ) - 0.5 ) * this . intensity ;
48+ const offsetY = ( Math . random ( ) - 0.5 ) * this . intensity ;
49+
50+ if ( follow ) {
51+ follow . externalOffset . set ( offsetX , offsetY ) ;
52+ } else if ( transform && this . originalCameraPosition ) {
53+ transform . moveTo ( this . originalCameraPosition . add ( new Vector ( offsetX , offsetY ) ) ) ;
4654 }
55+
4756 this . shakeTimer -- ;
48- } else if ( this . originalCameraPosition ) {
49- // Reset camera position after shake
50- const camera = this . top ?. currentScene ?. activeCamera ;
51- if ( camera ) {
52- const cameraTransform = camera . children [ "Transform" ] as Transform | undefined ;
53- if ( cameraTransform ) {
54- cameraTransform . moveTo ( this . originalCameraPosition ) ;
55- }
57+ } else {
58+ if ( follow ) {
59+ follow . externalOffset . set ( 0 , 0 ) ;
60+ } else if ( transform && this . originalCameraPosition ) {
61+ transform . moveTo ( this . originalCameraPosition ) ;
5662 }
5763 }
64+
5865 this . hoverbug = `Shaking: ${ this . shakeTimer > 0 ? "✅" : "❌" } ` ;
5966 }
67+
6068}
0 commit comments