bubbles / files / src / levels / ILevel.ts
ILevel.ts
775e32f9 2026-04-09 Pavel Safronov | 1 | import { Vector2 } from '../physics/Vector2.js'; |
| 2 | ||
| 3 | /** | |
| 4 | * Interface every level must implement. | |
| 5 | * | |
| 6 | * The App game loop calls step() and draw() every tick/frame. | |
| 7 | * Levels own all simulation state; App just drives the clock. | |
| 8 | */ | |
| 9 | export interface ILevel { | |
| 10 | readonly name: string; | |
| 11 | ||
| 12 | /** Advance simulation by dt seconds. gravity is the device gravity vector. */ | |
| 13 | step(dt: number, gravity: Vector2): void; | |
| 14 | ||
| 15 | /** Render everything into ctx for this frame. */ | |
| 16 | draw( | |
| 17 | ctx: CanvasRenderingContext2D, | |
| 18 | /** Left edge X of glass interior, canvas px */ | |
| 19 | glassX: number, | |
| 20 | /** Top edge Y of glass interior, canvas px */ | |
| 21 | glassY: number, | |
| 22 | /** Glass interior width, canvas px */ | |
| 23 | glassW: number, | |
| 24 | /** Glass interior height, canvas px */ | |
| 25 | glassH: number, | |
| 26 | ): void; | |
| 27 | ||
| 28 | /** Called when user taps inside the container. localX/Y are glass-space coords. */ | |
| 29 | onTouch(localX: number, localY: number, gravity: Vector2): void; | |
| 30 | ||
| 31 | /** Called whenever the canvas / container is resized. */ | |
| 32 | resize(glassW: number, glassH: number): void; | |
| 33 | ||
| 34 | /** Reset simulation to initial state. */ | |
| 35 | reset(): void; | |
| 36 | } |