feedbackDirector.ts 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { DEFAULT_GAME_AUDIO_CONFIG, type GameAudioConfig } from '../audio/audioConfig'
  2. import { SoundDirector } from '../audio/soundDirector'
  3. import { type GameEffect } from '../core/gameResult'
  4. import { type AnimationLevel } from '../../utils/animationLevel'
  5. import {
  6. DEFAULT_GAME_HAPTICS_CONFIG,
  7. DEFAULT_GAME_UI_EFFECTS_CONFIG,
  8. type GameHapticsConfig,
  9. type GameUiEffectsConfig,
  10. } from './feedbackConfig'
  11. import { HapticsDirector } from './hapticsDirector'
  12. import { UiEffectDirector, type UiEffectHost } from './uiEffectDirector'
  13. export interface FeedbackHost extends UiEffectHost {
  14. stopLocationTracking: () => void
  15. }
  16. export interface FeedbackConfigBundle {
  17. audioConfig?: GameAudioConfig
  18. hapticsConfig?: GameHapticsConfig
  19. uiEffectsConfig?: GameUiEffectsConfig
  20. }
  21. export class FeedbackDirector {
  22. soundDirector: SoundDirector
  23. hapticsDirector: HapticsDirector
  24. uiEffectDirector: UiEffectDirector
  25. host: FeedbackHost
  26. constructor(host: FeedbackHost, config?: FeedbackConfigBundle) {
  27. this.host = host
  28. this.soundDirector = new SoundDirector(config && config.audioConfig ? config.audioConfig : DEFAULT_GAME_AUDIO_CONFIG)
  29. this.hapticsDirector = new HapticsDirector(config && config.hapticsConfig ? config.hapticsConfig : DEFAULT_GAME_HAPTICS_CONFIG)
  30. this.uiEffectDirector = new UiEffectDirector(host, config && config.uiEffectsConfig ? config.uiEffectsConfig : DEFAULT_GAME_UI_EFFECTS_CONFIG)
  31. }
  32. configure(config: FeedbackConfigBundle): void {
  33. this.soundDirector.configure(config.audioConfig || DEFAULT_GAME_AUDIO_CONFIG)
  34. this.hapticsDirector.configure(config.hapticsConfig || DEFAULT_GAME_HAPTICS_CONFIG)
  35. this.uiEffectDirector.configure(config.uiEffectsConfig || DEFAULT_GAME_UI_EFFECTS_CONFIG)
  36. }
  37. reset(): void {
  38. this.soundDirector.resetContexts()
  39. this.uiEffectDirector.clearPunchButtonMotion()
  40. this.uiEffectDirector.clearHudProgressMotion()
  41. this.uiEffectDirector.clearHudDistanceMotion()
  42. }
  43. destroy(): void {
  44. this.soundDirector.destroy()
  45. this.hapticsDirector.destroy()
  46. this.uiEffectDirector.destroy()
  47. }
  48. setAnimationLevel(level: AnimationLevel): void {
  49. this.uiEffectDirector.setAnimationLevel(level)
  50. }
  51. setAppAudioMode(mode: 'foreground' | 'background'): void {
  52. this.soundDirector.setAppAudioMode(mode)
  53. }
  54. handleEffects(effects: GameEffect[]): void {
  55. this.soundDirector.handleEffects(effects)
  56. this.hapticsDirector.handleEffects(effects)
  57. this.uiEffectDirector.handleEffects(effects)
  58. if (effects.some((effect) => effect.type === 'session_finished')) {
  59. this.host.stopLocationTracking()
  60. }
  61. }
  62. }