• Jump To … +
    ./demo/canvas-001.js ./demo/canvas-002.js ./demo/canvas-003.js ./demo/canvas-004.js ./demo/canvas-005.js ./demo/canvas-006.js ./demo/canvas-007.js ./demo/canvas-008.js ./demo/canvas-009.js ./demo/canvas-010.js ./demo/canvas-011.js ./demo/canvas-012.js ./demo/canvas-013.js ./demo/canvas-014.js ./demo/canvas-015.js ./demo/canvas-016.js ./demo/canvas-017.js ./demo/canvas-018.js ./demo/canvas-019.js ./demo/canvas-020.js ./demo/canvas-021.js ./demo/canvas-022.js ./demo/canvas-023.js ./demo/canvas-024.js ./demo/canvas-025.js ./demo/canvas-026.js ./demo/canvas-027.js ./demo/canvas-028.js ./demo/canvas-029.js ./demo/canvas-030.js ./demo/canvas-031.js ./demo/canvas-032.js ./demo/canvas-033.js ./demo/canvas-034.js ./demo/canvas-035.js ./demo/canvas-036.js ./demo/canvas-037.js ./demo/canvas-038.js ./demo/canvas-039.js ./demo/canvas-040.js ./demo/canvas-041.js ./demo/canvas-042.js ./demo/canvas-043.js ./demo/canvas-044.js ./demo/canvas-045.js ./demo/canvas-046.js ./demo/canvas-047.js ./demo/component-001.js ./demo/component-002.js ./demo/component-003.js ./demo/component-004.js ./demo/component-005.js ./demo/component-006.js ./demo/component-007.js ./demo/core-001.js ./demo/dom-001.js ./demo/dom-002.js ./demo/dom-003.js ./demo/dom-004.js ./demo/dom-005.js ./demo/dom-006.js ./demo/dom-007.js ./demo/dom-008.js ./demo/dom-009.js ./demo/dom-010.js ./demo/dom-011.js ./demo/dom-012.js ./demo/dom-013.js ./demo/dom-014a.js ./demo/dom-014b.js ./demo/dom-014c.js ./demo/dom-015.js ./demo/dom-016.js ./demo/filters-001.js ./demo/filters-002.js ./demo/filters-003.js ./demo/filters-004.js ./demo/filters-005.js ./demo/filters-006.js ./demo/filters-007.js ./demo/filters-008.js ./demo/filters-009.js ./demo/filters-010.js ./demo/filters-011.js ./demo/filters-012.js ./demo/filters-013.js ./demo/filters-014.js ./demo/filters-015.js ./demo/filters-016.js ./demo/filters-017.js ./demo/filters-018.js ./demo/filters-019.js ./demo/filters-020.js ./demo/filters-501.js ./demo/filters-502.js ./demo/filters-503.js ./demo/filters-504.js ./demo/filters-505.js ./demo/particles-001.js ./demo/particles-002.js ./demo/particles-003.js ./demo/particles-004.js ./demo/particles-005.js ./demo/particles-006.js ./demo/particles-007.js ./demo/particles-008.js ./demo/particles-009.js ./demo/particles-010.js ./demo/particles-011.js ./demo/particles-012.js ./demo/particles-013.js ./demo/particles-014.js ./demo/particles-015.js ./demo/particles-016.js ./demo/temp-001.js ./demo/temp-inkscapeSvgFilters.js
  • ¶

    Demo Canvas 006

    Canvas tween stress test

  • ¶

    Run code

    import scrawl from '../source/scrawl.js'
  • ¶

    Scene setup

    let porthole = scrawl.library.artefact.porthole;
    
    porthole.set({
        backgroundColor: 'black',
        css: {
            borderRadius: '50%'
        }
    });
  • ¶
    Star generation functionality
  • ¶

    We use this entity as a template for cloning new stars

    let starling = scrawl.makeWheel({
    
        name: 'starling',
    
        radius: 3,
        handleX: 'center',
        handleY: 'center',
    
        method: 'fill',
        fillStyle: 'white',
  • ¶

    Adding in some flags to help speed up the Display cycle

        noDeltaUpdates: true,
        noPositionDependencies: true,
        noFilters: true,
        noUserInteraction: true,
    
        purge: 'all',
    });
    
    let starCount = 0,
        addNumber = 100;
  • ¶

    makeStar function

    let makeStars = function (buildNumber) {
  • ¶

    We use a Vector for calculating the new star’s direction

        let v = scrawl.requestVector(),
            star, i, myRandom;
    
        for (i = 0; i < buildNumber; i++) {
    
            starCount++;
  • ¶

    Clone the entity template

            star = starling.clone({
    
                name: `star_${starCount}`,
  • ¶

    Additional flags for speeding up the Display cycle

                noCanvasEngineUpdates: true,
  • ¶

    All cloned stars will share the template star’s State object - to save on memory

                sharedState: true,
            });
    
            myRandom = Math.random();
    
            v.setXY(1, 0).rotate(Math.random() * 360).scalarMultiply(300);
  • ¶

    Every star gets its own Tween object

    • And each Tween generates its own Ticker timeline object
            scrawl.makeTween({
    
                name: star.name,
    
                targets: star,
                duration: Math.round((myRandom * 3000) + 2000),
                cycles: 0,
  • ¶

    We will animate the star’s start Coordinate (using startX and startY pseudo-attributes)

                definitions: [{
                    attribute: 'startX',
  • ¶

    integer: true,

                    start: 300,
                    end: 300 + v.x
                }, {
                    attribute: 'startY',
  • ¶

    integer: true,

                    start: 300,
                    end: 300 + v.y
                }, {
  • ¶

    We will also animate the star’s scale value to make the animation look more 3D

                    attribute: 'scale',
                    start: 0.5,
                    end: Math.round((1 - myRandom) * 0.9) + 0.6,
                }]
  • ¶

    We start the Tween running immediately after it has been created.

            }).run();
    
        }
  • ¶

    We need to release our Vector back to its vector pool

    • Failure to release pool objects can lead to memory leaks.
        scrawl.releaseVector(v);
  • ¶

    Change the color of the stars each time the user clicks on the porthole

        starling.set({
            fillStyle: `rgb(${Math.floor(Math.random() * 55) + 200}, ${Math.floor(Math.random() * 55) + 200}, ${Math.floor(Math.random() * 55) + 200})`
        });
    };
  • ¶

    Generate the initial stars

    makeStars(100);
  • ¶

    Scene animation

    Function to display frames-per-second data, and other information relevant to the demo

    let report = function () {
    
        let testTicker = Date.now(),
            testTime, testNow, dragging,
            testMessage = document.querySelector('#reportmessage');
    
        return function () {
    
            testNow = Date.now();
            testTime = testNow - testTicker;
            testTicker = testNow;
    
            testMessage.textContent = `Screen refresh: ${Math.ceil(testTime)}ms; fps: ${Math.floor(1000 / testTime)}
    Stars: ${starCount}`;
        };
    }();
  • ¶

    Create the Display cycle animation

    scrawl.makeRender({
    
        name: 'demo-animation',
        target: porthole,
        afterShow: report,
    });
  • ¶

    User interaction

    Event listeners

    let addStars = (e) => {
    
        e.preventDefault();
        e.returnValue = false;
    
        makeStars(addNumber);
    };
    scrawl.addNativeListener('click', addStars, porthole.domElement);