loading.ts 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import * as audio from '../audio';
  2. import * as level from '../level';
  3. import * as util from '../util';
  4. import { GameContext, Screen } from './common';
  5. import { SelectScreen } from './select';
  6. export class LoadingScreen implements Screen {
  7. readonly name: string = 'loading';
  8. constructor(private context: GameContext, private configUrl: string) {}
  9. enter(): void {
  10. console.log('Loading assets...');
  11. let configPromise;
  12. if (this.configUrl.endsWith('.json')) {
  13. configPromise = level.loadFromJson(this.configUrl);
  14. } else {
  15. configPromise = level.loadFromTM(this.configUrl);
  16. }
  17. configPromise.then((config) => {
  18. this.context.config = config;
  19. this.loadAssets();
  20. });
  21. }
  22. loadAssets(): void {
  23. let config = this.context.config!;
  24. Promise.all([
  25. util.loadBackground(config.background),
  26. this.loadTrack(config.selectSound),
  27. this.loadTrack(config.decideSound),
  28. ]).then((v) => {
  29. console.log('Loaded assets.');
  30. let [background, selectSound, decideSound] = v;
  31. this.context.assets = {
  32. selectSound,
  33. decideSound,
  34. };
  35. this.finishLoading();
  36. });
  37. }
  38. finishLoading(): void {
  39. let loadingElement: HTMLElement = util.getElement(
  40. this.context.container,
  41. '#loading'
  42. );
  43. loadingElement.addEventListener('transitionend', (event) => {
  44. loadingElement.style.display = 'none';
  45. this.switchToSelect();
  46. });
  47. loadingElement.classList.add('finished');
  48. }
  49. loadTrack(url: string): Promise<audio.Track | null> {
  50. if (url == null) {
  51. return Promise.resolve(null);
  52. } else {
  53. return this.context.audioManager.loadTrack(url);
  54. }
  55. }
  56. switchToSelect(): void {
  57. let selectScreen = new SelectScreen(this.context);
  58. this.context.switchScreen(selectScreen);
  59. }
  60. handleInput(key: string): void {}
  61. exit(): void {
  62. let config = this.context.config!;
  63. let containerStyle = this.context.container.style;
  64. containerStyle.setProperty('--base-color', config.baseColor);
  65. containerStyle.setProperty('--highlight-color', config.highlightColor);
  66. containerStyle.setProperty('--contrast-color', config.contrastColor);
  67. }
  68. transitionExit(): void {}
  69. }