types.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import { AssetDefinition } from '../backend/asset-loader';
  2. import { AnimationController } from '../game/lib';
  3. /**
  4. * Handler to react to player events.
  5. */
  6. export interface EngineEventHandler {
  7. onkeydown(state: PlayerState, e: KeyboardEvent): void;
  8. onkeyup(state: PlayerState, e: KeyboardEvent): void;
  9. }
  10. /**
  11. * Options for the game.
  12. */
  13. export interface EngineOptions {
  14. /**
  15. * Handler for player events
  16. */
  17. eventHandler: EngineEventHandler;
  18. /**
  19. * Handler called after each draw (gets also the draw context)
  20. */
  21. drawHandler(
  22. ctx: CanvasRenderingContext2D,
  23. state: PlayerState,
  24. sprites: SpriteState[]
  25. ): void;
  26. /**
  27. * Handler called once the simulation has stopped
  28. */
  29. stopHandler(): void;
  30. /**
  31. * Rendering options
  32. */
  33. backdrop: CanvasImageSource | null; // Backdrop image for game world
  34. // Game world dimensions
  35. screenWidth: number;
  36. screenHeight: number;
  37. // HTML elment dimensions (scaled if different from game world dimensions)
  38. screenElementWidth: number;
  39. screenElementHeight: number;
  40. // Game assets
  41. assets: Record<string, AssetDefinition>;
  42. }
  43. /**
  44. * State of a sprite in the world.
  45. */
  46. export interface SpriteState {
  47. id: string; // A unique ID
  48. x: number; // Sprite x position
  49. y: number; // Sprite y position
  50. kind: string; // Sprint kind
  51. owner?: string; // Owner of this sprite
  52. dim: number; // Dimensions of the sprite (box)
  53. isMoving: boolean; // Flag if the sprite is moving or static
  54. // Flag if the sprite is kept in the display or if it should be
  55. // destroyed once it is outside of the visible area
  56. displayLoop: boolean;
  57. dir: number; // Turning direction (-1 for left, 1 for right, 0 no turning)
  58. rot: number; // Angle of rotation
  59. rotSpeed: number; // Rotation speed for each step (in radians)
  60. speed: number; // Moving direction (1 forward, -1 backwards, 0 no movement)
  61. strafe: number; // Strafing direction of sprite (-1 left, 1 right, 0 no movement)
  62. moveSpeed: number; // Move speed for each step
  63. animation: AnimationController | null; // Animation controller for this sprite
  64. /**
  65. * Set the state from a given map structure.
  66. */
  67. setState(state: Record<string, any>): void;
  68. /**
  69. * Draw this sprite.
  70. */
  71. draw(
  72. ctx: CanvasRenderingContext2D,
  73. state: SpriteState,
  74. assets: Record<string, AssetDefinition>
  75. ): void;
  76. }
  77. /**
  78. * State of the player sprite in the world.
  79. */
  80. export interface PlayerState extends SpriteState {
  81. maxRotSpeed: number; // Max rotation speed
  82. minRotSpeed: number; // Min rotation speed
  83. /**
  84. * The player made some input and the object state has been updated. This
  85. * function is called to send these updates to the backend.
  86. */
  87. stateUpdate(action: String, hint?: string[]): void;
  88. /**
  89. * Function to increase rotation speed.
  90. */
  91. deltaRotSpeed(rotSpeed: number): number;
  92. }