1+ import EngineEvent from "../event/engineevent.js" ;
2+ import EngineEventHandler from "../event/engineventhandler.js" ;
13import AssetVerifier from "./assetverifier.js" ;
24
35class AssetLoader {
46 private _images : Map < string , HTMLImageElement > ;
57 private _audio : Map < string , HTMLAudioElement > ;
68
7- constructor ( ) {
9+ private _imagesLoadedEvent : EngineEventHandler < boolean , EngineEvent < boolean > > ;
10+ private _audiosLoadedEvent : EngineEventHandler < boolean , EngineEvent < boolean > > ;
11+ private _assetsLoadedEvent : EngineEventHandler < boolean , EngineEvent < boolean > > ;
12+
13+ private _imageLoadTrackerTask : number | undefined ;
14+ private _audioLoadTrackerTask : number | undefined ;
15+ private _assetLoadTrackerTask : number | undefined ;
16+
17+ public get imagesLoadedEvent ( ) : EngineEventHandler <
18+ boolean ,
19+ EngineEvent < boolean >
20+ > {
21+ return this . _imagesLoadedEvent ;
22+ }
23+
24+ public get audiosLoadedEvent ( ) : EngineEventHandler <
25+ boolean ,
26+ EngineEvent < boolean >
27+ > {
28+ return this . _audiosLoadedEvent ;
29+ }
30+
31+ public get assetsLoadedEvent ( ) : EngineEventHandler <
32+ boolean ,
33+ EngineEvent < boolean >
34+ > {
35+ return this . _assetsLoadedEvent ;
36+ }
37+
38+ public constructor ( ) {
839 this . _images = new Map < string , HTMLImageElement > ( ) ;
940 this . _audio = new Map < string , HTMLAudioElement > ( ) ;
10- }
1141
12- hasImage ( key : string ) : boolean {
42+ this . _imagesLoadedEvent = new EngineEventHandler <
43+ boolean ,
44+ EngineEvent < boolean >
45+ > ( ) ;
46+ this . _audiosLoadedEvent = new EngineEventHandler <
47+ boolean ,
48+ EngineEvent < boolean >
49+ > ( ) ;
50+ this . _assetsLoadedEvent = new EngineEventHandler <
51+ boolean ,
52+ EngineEvent < boolean >
53+ > ( ) ;
54+ }
55+
56+ public hasImage ( key : string ) : boolean {
1357 return this . _images . has ( key ) ;
1458 }
1559
16- getImage ( key : string ) : HTMLImageElement {
60+ public getImage ( key : string ) : HTMLImageElement {
1761 if ( ! this . hasImage ( key ) ) {
1862 throw new Error ( `Image with key ${ key } does not exist!` ) ;
1963 }
2064
2165 return this . _images . get ( key ) as HTMLImageElement ;
2266 }
2367
24- getImagesCount ( ) : number {
68+ public getImagesCount ( ) : number {
2569 return this . _images . size ;
2670 }
2771
28- getImagesReadyCount ( ) : number {
72+ public getImagesReadyCount ( ) : number {
2973 return Array . from ( this . _images . values ( ) )
3074 . map ( ( image ) => AssetVerifier . verifyImage ( image ) )
3175 . filter ( ( status ) => status === true ) . length ;
3276 }
3377
34- areImagesReady ( ) : boolean {
78+ public areImagesReady ( ) : boolean {
3579 return this . getImagesCount ( ) === this . getImagesReadyCount ( ) ;
3680 }
3781
38- hasAudio ( key : string ) : boolean {
82+ public hasAudio ( key : string ) : boolean {
3983 return this . _audio . has ( key ) ;
4084 }
4185
42- getAudio ( key : string ) : HTMLAudioElement {
86+ public getAudio ( key : string ) : HTMLAudioElement {
4387 if ( ! this . hasAudio ( key ) ) {
4488 throw new Error ( `Audio with key ${ key } does not exist!` ) ;
4589 }
4690 return this . _audio . get ( key ) as HTMLAudioElement ;
4791 }
4892
49- getAudiosCount ( ) : number {
93+ public getAudiosCount ( ) : number {
5094 return this . _audio . size ;
5195 }
5296
53- getAudiosReadyCount ( ) : number {
97+ public getAudiosReadyCount ( ) : number {
5498 return Array . from ( this . _audio . values ( ) )
5599 . map ( ( audio ) => AssetVerifier . verifyAudio ( audio ) )
56100 . filter ( ( status ) => status === true ) . length ;
57101 }
58102
59- areAudiosReady ( ) : boolean {
103+ public areAudiosReady ( ) : boolean {
60104 return this . getAudiosCount ( ) === this . getAudiosReadyCount ( ) ;
61105 }
62106
63- getAssetsCount ( ) : number {
107+ public getAssetsCount ( ) : number {
64108 return this . getImagesCount ( ) + this . getAudiosCount ( ) ;
65109 }
66110
67- getAssetsReadyCount ( ) : number {
111+ public getAssetsReadyCount ( ) : number {
68112 return this . getImagesReadyCount ( ) + this . getAudiosReadyCount ( ) ;
69113 }
70114
71- areAssetsReady ( ) : boolean {
115+ public areAssetsReady ( ) : boolean {
72116 return this . getAssetsCount ( ) === this . getAssetsReadyCount ( ) ;
73117 }
74118
75- registerImages ( className : string ) {
119+ public registerImages ( className : string ) {
76120 let images = document . getElementsByClassName ( className ) ;
77121 if ( images . length == 0 ) {
78122 console . warn ( `No images found for class ${ className } ` ) ;
@@ -92,7 +136,7 @@ class AssetLoader {
92136 }
93137 }
94138
95- registerAudios ( className : string ) {
139+ public registerAudios ( className : string ) {
96140 let audio = document . getElementsByClassName ( className ) ;
97141 if ( audio . length == 0 ) {
98142 console . warn ( `No audios found for class ${ className } ` ) ;
@@ -111,6 +155,35 @@ class AssetLoader {
111155 this . _audio . set ( audioElement . id , audioElement ) ;
112156 }
113157 }
158+
159+ public startTracking ( ) {
160+ this . _imageLoadTrackerTask = setInterval ( ( ) => {
161+ let imagesReady = this . areImagesReady ( ) ;
162+ this . _imagesLoadedEvent . dispatch ( new EngineEvent < boolean > ( imagesReady ) ) ;
163+
164+ if ( imagesReady ) {
165+ clearInterval ( this . _imageLoadTrackerTask ) ;
166+ }
167+ } , 500 ) ;
168+
169+ this . _audioLoadTrackerTask = setInterval ( ( ) => {
170+ let audiosReady = this . areAudiosReady ( ) ;
171+ this . _audiosLoadedEvent . dispatch ( new EngineEvent < boolean > ( audiosReady ) ) ;
172+
173+ if ( audiosReady ) {
174+ clearInterval ( this . _audioLoadTrackerTask ) ;
175+ }
176+ } , 500 ) ;
177+
178+ this . _assetLoadTrackerTask = setInterval ( ( ) => {
179+ let assetsReady = this . areAssetsReady ( ) ;
180+ this . _assetsLoadedEvent . dispatch ( new EngineEvent < boolean > ( assetsReady ) ) ;
181+
182+ if ( assetsReady ) {
183+ clearInterval ( this . _assetLoadTrackerTask ) ;
184+ }
185+ } , 500 ) ;
186+ }
114187}
115188
116189export default AssetLoader ;
0 commit comments