Skip to content
Snippets Groups Projects
main.js 5.38 KiB
Newer Older
  • Learn to ignore specific revisions
  • Bye's avatar
    Bye committed
    
    import Canvas from "../../hampsterengine/src/canvas.js";
    import Engine from "../../hampsterengine/src/engine.js";
    
    Bye's avatar
    Bye committed
    import Keyboard from "../../hampsterengine/src/keyboard";
    import {FontRenderer, Stars} from "./objects";
    
    Bye's avatar
    Bye committed
    
    
    Bye's avatar
    Bye committed
    import SoundBox from "./sb-player-small";
    
    Bye's avatar
    Bye committed
    // import {mus_DEMOSONG} from "./songs/DEMOSONGDONOTCOMMIT";
    
    Bye's avatar
    Bye committed
    
    
    Bye's avatar
    Bye committed
    // dependencies used for debugging. comment out code that uses this and they won't be included
    
    Bye's avatar
    Bye committed
    import Stats from "stats.js";
    
    Bye's avatar
    Bye committed
    
    // Images
    import font from "../img/font.webp";
    
    Bye's avatar
    Bye committed
    
    
    Bye's avatar
    Bye committed
    // Rooms
    
    Bye's avatar
    Bye committed
    import {rm_mainMenu} from "./rooms/mainMenu";
    import {rm_game} from "./rooms/game";
    
    Bye's avatar
    Bye committed
    // import {rm_DEBUG_button} from "./rooms/debug_button";
    // import {rm_DEBUG_mouse} from "./rooms/debug_mouse";
    // import {rm_DEBUG_music} from "./rooms/debug_music";
    
    Bye's avatar
    Bye committed
    import {rm_DEBUG_INCURSION} from "./rooms/debug_incursion";
    
    Bye's avatar
    Bye committed
    import {rm_DEBUG_text} from "./rooms/debug_text";
    
    Bye's avatar
    Bye committed
    import {rm_DEBUG_stars} from "./rooms/debug_stars";
    import {rm_DEBUG_sprites} from "./rooms/debug_sprites";
    
    Bye's avatar
    Bye committed
    
    // Music
    
    Bye's avatar
    Bye committed
    // There is none
    
    Bye's avatar
    Bye committed
    
    
    // Parse query parameters
    const query = new URLSearchParams(window.location.search);
    
    Bye's avatar
    Bye committed
    window.query = query;
    
    Bye's avatar
    Bye committed
    // Init the engine and canvas
    
    Bye's avatar
    Bye committed
    const canvas = new Canvas(c);
    
    Bye's avatar
    Bye committed
    const engine = new Engine(canvas);
    const assets = engine.assetStore;
    
    Bye's avatar
    Bye committed
    const keyboard = new Keyboard();
    
    Bye's avatar
    Bye committed
    assets.addImage('font', font);
    
    
    Bye's avatar
    Bye committed
    const fontRenderer = new FontRenderer(assets.get`font`);
    
    Bye's avatar
    Bye committed
    window.fR = fontRenderer
    // const mouse = new Mouse(engine);
    // window.mouse = mouse;
    
    Bye's avatar
    Bye committed
    
    
    Bye's avatar
    Bye committed
    engine.debug = query.get`debug`;
    window.debug = engine.debug;
    
    canvas.width = 256;
    canvas.height = 240;
    
    canvas.setScale();
    
    Bye's avatar
    Bye committed
    canvas.ctx.imageSmoothingEnabled = false;
    
    
    Bye's avatar
    Bye committed
    const floor = Math.floor;
    const u = _=> {
        const w = innerWidth;
        const h = innerHeight;
        const wS = floor(w/256);
        const hS = floor(h/240);
        const s=Math.min(wS,hS);
        canvas.width = 256*s;
        canvas.height= 240*s;
        canvas.pixelRatio = s;
        canvas.setScale(canvas.scale);
        canvas.ctx.imageSmoothingEnabled = false;
    }
    u();addEventListener('resize', u, !0);
    
    
    Bye's avatar
    Bye committed
    engine.running = false; // Game uses this as a pause state actually
    
    Bye's avatar
    Bye committed
    
    
    Bye's avatar
    Bye committed
    // // Prerender the stars
    // const tempCanvasStars = document.createElement("canvas");
    // tempCanvasStars.width = 2560;
    // tempCanvasStars.height = 2400;
    // const stars = new Stars(tempCanvasStars);
    // window.starsTest = stars;
    // stars.draw(0, 0, 2560, 2400);
    // const createStarsObjectURL = blob => {
    //     assets.addImage('stars', URL.createObjectURL(blob));
    // }
    // tempCanvasStars.toBlob(createStarsObjectURL);
    
    assets.addMiniSprite('grass', 'IIIIIIQIQQQJZQZZRZRRZRZRSSRSRZZR');
    assets.renderMiniSprite('grass', ['#2a6', '#964', '#853']);
    
    
    Bye's avatar
    Bye committed
    engine.registerRoom(rm_mainMenu, 'mainMenu');
    engine.registerRoom(rm_game, 'game');
    
    Bye's avatar
    Bye committed
    
    
    Bye's avatar
    Bye committed
    // engine.registerRoom(rm_DEBUG_button, 'debug_button');
    // engine.registerRoom(rm_DEBUG_mouse, 'debug_mouse');
    
    Bye's avatar
    Bye committed
    // engine.registerRoom(rm_DEBUG_music, 'debug_music');
    engine.registerRoom(rm_DEBUG_INCURSION, 'debug_incursion');
    
    Bye's avatar
    Bye committed
    engine.registerRoom(rm_DEBUG_text, 'debug_text');
    
    Bye's avatar
    Bye committed
    engine.registerRoom(rm_DEBUG_stars, 'debug_stars');
    engine.registerRoom(rm_DEBUG_sprites, 'debug_sprites');
    
    Bye's avatar
    Bye committed
    
    // Init stats.js
    
    Bye's avatar
    Bye committed
    const stats = new Stats();
    stats.showPanel(0);
    document.body.appendChild( stats.dom );
    
    Bye's avatar
    Bye committed
    
    
    let physicsFrame=0;
    
    window.physicsFrame = physicsFrame;
    
    let readyTime = 0;
    
    Bye's avatar
    Bye committed
    function main() {
    
        // Draw things. no user interaction or physics here.
    
    
    Bye's avatar
    Bye committed
        try {
    
    Bye's avatar
    Bye committed
            stats.begin();
    
    Bye's avatar
    Bye committed
            engine.frames++;
            canvas.fill(engine.room.bgColor ?? 'black');
    
            engine.draw();
            engine.drawGui();
    
            // engine.drawCursor();
    
    
    Bye's avatar
    Bye committed
            stats.end();
    
    Bye's avatar
    Bye committed
    
    
    Bye's avatar
    Bye committed
            if (debug) {
                canvas.drawText(`physics ticks: ${engine.physicsFrames} (~${(engine.physicsFrames/60).toFixed(1)}sec)`, 0, 0,{textBaseline:'top'})
                canvas.drawText(`frames: ${engine.frames}`, 0, 8,{textBaseline:'top'})
    
                canvas.drawText(`run time: ${((performance.now()-readyTime)/1000).toFixed(1)}sec`, 0, 16, {textBaseline:'top'})
    
    Bye's avatar
    Bye committed
                canvas.drawText(`keys: ${JSON.stringify(keyboard.keys)}`, 0, 24, {textBaseline:'top'})
    
    Bye's avatar
    Bye committed
            // Ask to run at the next frame
            requestAnimationFrame(main);
        } catch (e) {
            engine.running = false;
    
    Bye's avatar
    Bye committed
    
    
    Bye's avatar
    Bye committed
            canvas.pixelRatio = 2;
            canvas.ctx.setTransform(canvas.pixelRatio, 0, 0, canvas.pixelRatio, 0, 0);
            canvas.fill('#a05555d0');
    
    
    Bye's avatar
    Bye committed
            const logo = assets.get`splash`
    
    Bye's avatar
    Bye committed
            canvas.drawImage(logo, 10, 10, logo.width, logo.height)
    
    
    Bye's avatar
    Bye committed
            canvas.setFillColor`black`;
    
    Bye's avatar
    Bye committed
            canvas.drawText(e, 5, canvas.height-5, {
                maxWidth: canvas.width-10,
    
    Bye's avatar
    Bye committed
                textBaseline: 'bottom'
            });
    
    Bye's avatar
    Bye committed
    
            throw e;
    
    Bye's avatar
    Bye committed
        }
    }
    
    function physicsTick() {
    
        // Runs 60 times a second regardless of frame rate.
    
    Bye's avatar
    Bye committed
        engine.physicsFrames++;
        engine.lastPhysicsFrame = performance.now();
    
    Bye's avatar
    Bye committed
    
        keyboard.keysThisFrame = [];
        keyboard.keysUpThisFrame = [];
    
    Bye's avatar
    Bye committed
    }
    
    
    Bye's avatar
    Bye committed
    console.debug(engine.rooms);
    
    
    Bye's avatar
    Bye committed
    if (query.get`room`) {
        console.log('Requesting room', query.get`room`);
    
    Bye's avatar
    Bye committed
        engine.loadDelay = 0;
    
    Bye's avatar
    Bye committed
        engine.room = engine.getRoomIndex(query.get`room`);
    
    Bye's avatar
    Bye committed
    } else {
    
    Bye's avatar
    Bye committed
        engine.room = engine.getRoomIndex`mainMenu`;
    
    Bye's avatar
    Bye committed
    }
    
    Bye's avatar
    Bye committed
    
    // Ensure assets are loaded.
    function load() {
        if (engine.loading) {
            engine.loadLoop();
    
    Bye's avatar
    Bye committed
            setTimeout(load, 1000/60);
    
    Bye's avatar
    Bye committed
        } else {
    
    Bye's avatar
    Bye committed
            engine.lastPhysicsFrame = performance.now();
    
    Bye's avatar
    Bye committed
            main();
    
    Bye's avatar
    Bye committed
            setInterval(physicsTick, (query.get`slowdown` ? 500 : 1000/60)); // Update physics 60 times a second
    
    Bye's avatar
    Bye committed
        }
    }
    
    load();