Color Twiddle

Color Twiddle is a simple little program which demonstrates a few fundamental MC Engine functions. Namely:

  • How to Initialise the MC Engine with a canvas
  • The MC.Color object
  • Creation of a “Game Controller” type object
  • Use of an Object Factory, to create and return …
  • … MC.Sprite Objects, with customised behaviour
  • Handled by a MC.SpriteBin object
  • Responding to user mouse input
  • Use of the Gameloop() method to update and then render items

Code

// MC Library
// Color Twiddle
// Jan 2019
// Purely an Alpha


window.onload = (function() {

// AQUIRE HTML DOM CANVAS REFERENCE
//     HTML has to have a HTML5 canvas element tagged as "canvas"
var c=document.getElementById("canvas");

//////////////////////////
// INITIALISE MC Engine //
//////////////////////////
// CHOOSE 1 // 

// CHOICE 1: Canvas Size fixed by HTML
MC.init(c);

// CHOICE 2: Full Window Option (Canvas will be resized to fit window)
//MC.init(c,"fullWindow");

///////////////////////////
// END OF Initialisation //
///////////////////////////
//-----------------------------------------------------------------------------
//////////////////////////
// VARIABLE DECLARATION //
//////////////////////////

// screenset up .. 900x700 canvas
MC.canvas.setSize(900,700);

    var CF = {
        master: new MC.utils.randomColor(),
        edge: new MC.utils.randomColor(),
        boxes: new MC.SpriteBin(),
        dr: MC.maths.randBetween(-10,10),
        dg: MC.maths.randBetween(-10,10),
        db: MC.maths.randBetween(-10,10),
        timer: 0,
        update: function() {          
            if (this.timer == 0) {
                var r = this.master.r + this.dr;
                var g = this.master.g + this.dg;
                var b = this.master.b + this.db;
                if (r <= 0 || r >= 255) {
                    this.dr *= -1;
                    r += this.dr;
                }
                if (g < 0 || g >= 255) {
                    this.dg *= -1;
                    g += this.dg;
                }
                if (b < 0 || b >= 255) {
                    this.db *= -1;
                    b += this.db;
                }
                this.master.set(r,g,b,1);
                this.timer = 1;
            }
            else {
                this.timer = MC.maths.maxOf(0,this.timer - MC.game.deltaTime);
            }

        }
    };

    
    
    function getBox(x, y) {
        var ret = new MC.Sprite({
            type: "rect",
            size1: 30,
            size2: 30,
            fillColor: CF.master.clone(),
            edgeColor: CF.edge.clone(),
            edgeWidth: 3,
            pos: new MC.Point(x,y)
        });
        ret.dev.timer = 0;
        ret.dev.maxTimer = 2;
        ret.dev.oldColor = new MC.Color();
        ret.dev.update = function () {
            if (ret.dev.timer > 0) {
                ret.dev.timer = MC.maths.maxOf(ret.dev.timer - MC.game.deltaTime, 0);
                if (ret.dev.timer == 0) {
                    ret.dev.stopTimer();
                    ret.scale = 1;
                }
            }
            if (ret.dev.timer == 0 && ret.hit(MC.game.mouse)) {
                ret.fillColor.invert();
                //ret.fillColor.set(255,0,0,1);
                ret.dev.startTimer();
            }
            if (ret.dev.timer == 0) {
                ret.fillColor.set(CF.master);
            }
            else {
                var ratio = (ret.dev.maxTimer - ret.dev.timer)/ ret.dev.maxTimer;
                ret.fillColor = MC.utils.mix(ret.dev.oldColor,CF.master, ratio);
                ret.scale = 1 + (1-ratio)*2;
            } 
            
        };
        ret.dev.startTimer = function () {
            ret.angleVel = 90 / ret.dev.maxTimer;
            ret.dev.oldColor = ret.fillColor.clone();
            ret.dev.timer = ret.dev.maxTimer;
        };
        ret.dev.stopTimer = function () {
            ret.angle = 0;
            ret.angleVel = 0;
        };

        return ret;
    }

    for (var x = 0; x < 900 / 35; x++) {
        for (var y = 0; y < 700 / 35; y++) {
            CF.boxes.push(getBox((x * 35) + 20, (y * 35) + 20));
        }
    }

//////////////////////////
// END OF declarations  //
//////////////////////////
//-----------------------------------------------------------------------------
//////////////////////////
//      GAME LOOP       //
//////////////////////////
// first call, request subsequently made within
gameLoop(); 

    function gameLoop() {

        requestAnimationFrame(gameLoop);
        // Essential to update MC.game to ensure MC.game.deltaTime is available
        MC.game.update();

        // physicsUpdate Loop
        for (var z = 0; z < MC.game.physicsUpdates; z++) {

        }
        CF.boxes.update();
        CF.update();

        // Add Render / Draw Code here
        MC.draw.clearCanvas("Black");   // All canvas to "Olive"
        CF.boxes.render();
        //console.log(CF.boxes);

    }

}); // EoF