game.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import * as audio from './audio';
  2. import * as background from './background';
  3. import * as util from './util';
  4. import * as polyfill from './polyfill';
  5. import { GameContext, Screen, ScreenManager } from './game/common';
  6. import { LoadingScreen } from './game/loading';
  7. export class MainController extends ScreenManager {
  8. loadingScreen: Screen;
  9. constructor(container: HTMLElement, configUrl: string, fromEditor: boolean) {
  10. super(container);
  11. container.appendChild(util.loadTemplate(container, 'base'));
  12. let self = this;
  13. let bgLayer: HTMLElement = util.getElement(container, '#background');
  14. let gameContext: GameContext = {
  15. container: container,
  16. audioManager: new audio.AudioManager(),
  17. bgManager: new background.BackgroundManager(bgLayer),
  18. loadTemplate: (id: string) => util.loadTemplate(container, id),
  19. assets: null,
  20. config: null,
  21. switchScreen(screen: Screen): void {
  22. self.switchScreen(screen);
  23. },
  24. };
  25. this.loadingScreen = new LoadingScreen(gameContext, configUrl, fromEditor);
  26. document.addEventListener('keydown', (event) => {
  27. if (event.key === 'Tab') {
  28. // prevent losing focus
  29. event.preventDefault();
  30. }
  31. if (event.altKey && event.key === 'Enter') {
  32. polyfill.fullscreen.request(this.container);
  33. }
  34. if (this.activeScreen !== null && !event.ctrlKey && !event.metaKey) {
  35. this.activeScreen.handleInput(event.key);
  36. }
  37. });
  38. polyfill.fullscreen.addEventListener(() => {
  39. this.onResize();
  40. });
  41. }
  42. start(): void {
  43. this.switchScreen(this.loadingScreen);
  44. }
  45. onResize(): void {
  46. const fontSize = this.container.offsetHeight / 28.125;
  47. this.container.style.setProperty('--base-font-size', `${fontSize}px`);
  48. }
  49. }