|
import { createTerminal } from './terminal.js'; |
|
import { createInputHandler } from './input.js'; |
|
import { Scene } from './scene.js'; |
|
import { LayerType } from './layer.js'; |
|
import { mergeConfig, getConfig } from './config.js'; |
|
import { state } from './state.js'; |
|
import { Time } from './time.js'; |
|
import { Physics } from './physics.js'; |
|
|
|
function start(userConfig) { |
|
if (state.engineStarted) { |
|
console.error("Engine.start() called more than once!"); |
|
return; |
|
} |
|
|
|
|
|
mergeConfig(userConfig); |
|
state.engineStarted = true; |
|
|
|
|
|
const canvas = document.createElement('canvas'); |
|
document.body.appendChild(canvas); |
|
state.ctx = canvas.getContext('2d'); |
|
|
|
|
|
state.scene = new Scene(); |
|
state.scene.start(); |
|
|
|
|
|
const resizeCanvas = () => { |
|
state.canvasWidth = canvas.width = window.innerWidth; |
|
state.canvasHeight = canvas.height = window.innerHeight; |
|
|
|
state.scene.camera.setViewport(state.canvasWidth, state.canvasHeight); |
|
}; |
|
resizeCanvas(); |
|
|
|
|
|
state.inputHandler = createInputHandler(canvas, state.scene); |
|
|
|
|
|
const terminalLayer = state.scene.getLayer(LayerType.TERMINAL); |
|
state.terminal = createTerminal(canvas, state.ctx, state.inputHandler); |
|
terminalLayer.addEntity(state.terminal); |
|
|
|
const config = getConfig(); |
|
|
|
|
|
window.addEventListener('resize', resizeCanvas); |
|
} |
|
|
|
export function run(userConfig) { |
|
state.currentConfig = userConfig; |
|
if (!state.engineStarted) { |
|
start(userConfig); |
|
} |
|
|
|
const config = getConfig(); |
|
state.angularSpeed = config.initialAngularSpeed; |
|
state.physics = new Physics(config); |
|
|
|
|
|
function Update(deltaTime) { |
|
|
|
state.ctx.clearRect(0, 0, state.canvasWidth, state.canvasHeight); |
|
|
|
|
|
state.scene.camera.update(deltaTime); |
|
|
|
|
|
state.scene.update(deltaTime); |
|
|
|
|
|
state.fps = Math.round(1 / deltaTime); |
|
|
|
|
|
state.scene.draw(state.ctx); |
|
|
|
|
|
state.terminal.drawText(); |
|
} |
|
|
|
function FixedUpdate(deltaTime) { |
|
state.physics.update(deltaTime); |
|
} |
|
|
|
|
|
function gameLoop() { |
|
state.animationFrameId = requestAnimationFrame(gameLoop); |
|
|
|
Time.update(); |
|
|
|
while (Time.accumulatedTime >= Time.fixedDeltaTime) { |
|
FixedUpdate(Time.fixedDeltaTime); |
|
Time.resetAccumulator(); |
|
} |
|
|
|
Update(Time.deltaTime); |
|
} |
|
|
|
|
|
gameLoop(); |
|
} |
|
|