Skip to content
Snippets Groups Projects
Select Git revision
  • 420c5ab273467e443e4f863cf9c016593fcc1303
  • master default protected
2 results

text.js

Blame
  • text.js 2.04 KiB
    // draws text to the screen by splicing a font sheet.
    
    class TextRenderer {
        constructor(canvas, fontimg) {
            this.fontimg = fontimg; // MUST BE AN IMAGE OBJECT
            this.fontWidth = 5;
            this.fontHeight = 5;
            this.spacing = 1;
            this.charWidth = this.fontWidth + this.spacing;
            this.charHeight = this.fontHeight + this.spacing;
            this.fontChars = "abcdefghijklmnopqrstuvwxyz1234567890.,!?:;)(~>_-";
            this.canvas = canvas;
        }
    
        drawLetter(letter, x, y, substituteOK=1) {
            let { canvas, fontWidth, fontHeight } = this;
    
            let index = this.fontChars.indexOf(letter.toLowerCase());
            if (index === -1) {
                if (!substituteOK) return;
                canvas.drawText(letter, x+canvas.cX, y+ canvas.cY, "#ffffff", 5, "monospace");
            }
            let sx = index * fontWidth;
            let sy = 0;
            // draw image to context
            let yOffset = 0;
            // if the letter is ",", offset it by -1
            if (letter === ",") yOffset = 1;
            canvas.sliceImage(this.fontimg, x+canvas.cX, y + yOffset + canvas.cY, fontWidth, fontHeight, sx, sy, fontWidth, fontHeight); 
                // canvas.cX and canvas.cY are the camera offsets. we don't want to have text flying off the screen.
                // you can counteract this by specifying x-cX and x-cY when calling this.
        }
    
        render(text, x, y) {
            let heightOffset = 0;
            let xOffset = 0;
            for (let i = 0; i < text.length; i++) {
                if (text[i] === "\n") {
                    heightOffset++;
                    xOffset = 0;
                    continue;
                }
                this.drawLetter(text[i], (x + (xOffset * (this.fontWidth + this.spacing))), y + (heightOffset * this.fontHeight));
                xOffset++;
            }
        }
    
        throwPanic = (err) => {
            // This function is called when an error is caught but unhandled.
            // It'll show the error on-screen.
        
            this.canvas.fill("#00000080") // 50% black
            
            this.render(err, 0, 0);
            throw err;
        }
    }
    
    export { TextRenderer };