• 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 036

    Cell functionality (functionality and associated tests needs to be expanded)

  • ¶

    Run code

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

    Scene setup

    const canvas = scrawl.library.canvas.mycanvas;
    
    
    canvas.set({
    
        backgroundColor: 'honeydew',
  • ¶

    Make the Canvas adapt to changes in its container’s dimensions

        checkForResize: true,
  • ¶

    Cascade changes in the Canvas dimensions down to its base Cell

        isComponent: true,
    });
  • ¶

    Create a Cell on the canvas

    const cell1 = canvas.buildCell({
    
        name: 'cell-1',
    
        width: 200,
        height: 200,
    
        startX: 150,
        startY: 150,
    
        handleX: '40%',
        handleY: '40%',
    
        delta: {
            roll: -0.6,
        },
    
        backgroundColor: 'lightblue',
    });
  • ¶

    Cells cannot be cloned (yet - may introduce that functionality in a future update)

    const cell2 = canvas.buildCell({
    
        name: 'cell-2',
    
        width: '20%',
        height: '20%',
    
        startX: '60%',
        startY: '50%',
    
        handleX: 30,
        handleY: 50,
    
        delta: {
            roll: 0.4,
        },
    
        backgroundColor: 'lightblue',
    });
  • ¶

    Create a shape track along which we can animate a Cell

    scrawl.makeOval({
    
        name: 'mytrack',
    
        radiusX: '40%',
        radiusY: '40%',
    
        start: ['center', 'center'],
        handle: ['center', 'center'],
    
        strokeStyle: '#808080',
        lineWidth: 10,
        method: 'draw',
    
        useAsPath: true,
        precision: 0.1,
    });
  • ¶

    This Cell will animate along the track we created earlier

    const cell3 = canvas.buildCell({
    
        name: 'cell-3',
    
        width: 100,
        height: 50,
    
        handleX: 'center',
        handleY: 'bottom',
    
        path: 'mytrack',
        lockTo: 'path',
        addPathRotation: true,
        constantPathSpeed: true,
    
        delta: {
          pathPosition: -0.001,
        },
    
        backgroundColor: 'black',
    });
  • ¶

    Create some entitys to which we can pivot and mimic Cells

    • Cells cannot take part in artefact functionality such as drag-and-drop because they are assets who use positional mixins to gain artefact-like behaviour, but they can’t be included in Groups because they are limited to grouping Artefacts together
    • One way to get around this limitation is to use Block entitys for testing collision detection, and then route mouse hover functionality through to any Cells pivoting or mimicking them. This should also allow us to drag-and-drop Cells (by proxy)
    let myGroup = scrawl.makeGroup({
    
        name: 'target-group',
        host: canvas.base.name,
    });
    
    scrawl.makeBlock({
    
        name: 'block-1',
        group: 'target-group',
    
        start: ['80%', '10%'],
        handle: ['center', 'center'],
        dimensions: ['18%', '18%'],
    
        fillStyle: 'blue',
        strokeStyle: 'coral',
        lineWidth: 4,
    
        delta: {
            roll: -0.2,
        },
    
        method: 'fillThenDraw',
    
    }).clone({
    
        name: 'block-2',
        dimensions: [120, 100],
        handle: ['left', 'top'],
        startY: '80%',
    
        roll: 30,
    
        delta: {
            roll: 0,
        },
    });
  • ¶

    Create the drag-and-drop zone

    scrawl.makeDragZone({
    
        zone: canvas,
        collisionGroup: myGroup,
        endOn: ['up', 'leave'],
    });
  • ¶

    Check to see if a Cell will mimic on an entity

    let cell4 = canvas.buildCell({
    
        name: 'cell-4',
    
        mimic: 'block-1',
        lockTo: 'mimic',
    
        width: -20,
        height: -20,
    
        handleX: -10,
        handleY: -10,
    
        useMimicDimensions: true,
        useMimicScale: true,
        useMimicStart: true,
        useMimicHandle: true,
        useMimicOffset: false,
        useMimicRotation: true,
    
        addOwnDimensionsToMimic: true,
        addOwnScaleToMimic: false,
        addOwnStartToMimic: false,
        addOwnHandleToMimic: true,
        addOwnOffsetToMimic: false,
        addOwnRotationToMimic: false,
    
        backgroundColor: 'lavender',
    });
  • ¶

    Check to see if a Cell will pivot to an entity

    let cell5 = canvas.buildCell({
    
        name: 'cell-5',
    
        pivot: 'block-2',
        lockTo: 'pivot',
    
        dimensions: [110, 90],
        handle: [-5, -5],
    
        addPivotRotation: true,
    
        backgroundColor: 'lavender',
    });
  • ¶

    Add in a hover check

    scrawl.library.entity['block-1'].set({
    
        onEnter: function () {
    
            this.set({
                scale: 1.2,
            });
    
            cell4.set({
                backgroundColor: 'pink',
            });
        },
    
        onLeave: function () {
    
            this.set({
                scale: 1,
            });
    
            cell4.set({
                backgroundColor: 'lavender',
            });
        },
    });
    
    scrawl.library.entity['block-2'].set({
    
        onEnter: () => cell5.set({ backgroundColor: 'pink' }),
    
        onLeave: () => cell5.set({ backgroundColor: 'lavender' }),
    });
    
    scrawl.addListener('move', () => canvas.here.active && canvas.cascadeEventAction('move'), canvas.domElement);
  • ¶

    Add labels to Cells

    scrawl.makePhrase({
    
        name: 'label-1',
        group: 'cell-1',
    
        text: 'Cell 1',
        font: '20px sans-serif',
        fillStyle: 'red',
    
        start: [5, 5],
    
    }).clone({
    
        name: 'label-2',
        group: 'cell-2',
    
        text: 'Cell 2',
    
        start: ['center', 'center'],
        handle: ['center', 'center'],
    
    }).clone({
    
        name: 'label-3',
        group: 'cell-3',
    
        text: 'Cell 3',
        fillStyle: 'white',
    
    }).clone({
    
        name: 'label-4',
        group: 'cell-4',
    
        text: 'Cell 4',
        fillStyle: 'green',
    
    }).clone({
    
        name: 'label-5',
        group: 'cell-5',
    
        text: 'Cell 5',
    });
  • ¶

    .. Also add some other entitys to the Cells

    scrawl.makeWheel({
    
        name: 'wheel-1',
        group: 'cell-1',
    
        radius: 30,
    
        start: [100, 120],
    
        strokeStyle: 'red',
        lineWidth: 8,
        method: 'draw',
    
    }).clone({
    
        name: 'wheel-2',
        group: 'cell-2',
    
        radius: 40,
    
        start: ['center', 'center'],
        handle: ['center', 'center'],
    
    }).clone({
    
        name: 'wheel-3',
        group: canvas.base.name,
    
        strokeStyle: 'green',
    
        start: ['85%', '85%'],
        pivot: 'cell-3',
        lockTo: 'pivot',
    });
    
    scrawl.makeBlock({
    
        name: 'mimic-block',
    
        group: canvas.base.name,
    
        fillStyle: 'yellow',
        strokeStyle: 'green',
        lineWidth: 4,
        method: 'fillThenDraw',
    
        mimic: 'cell-2',
        lockTo: 'mimic',
    
        width: 30,
        height: 30,
    
        handleX: 15,
        handleY: 15,
    
        useMimicDimensions: true,
        useMimicScale: false,
        useMimicStart: true,
        useMimicHandle: true,
        useMimicOffset: false,
        useMimicRotation: true,
    
        addOwnDimensionsToMimic: true,
        addOwnScaleToMimic: false,
        addOwnStartToMimic: false,
        addOwnHandleToMimic: true,
        addOwnOffsetToMimic: false,
        addOwnRotationToMimic: false,
    });
  • ¶

    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,
            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)}
    Canvas dimensions: ${canvas.currentDimensions}
    Base dimensions: ${canvas.base.currentDimensions}
    Cell 1 dimensions: ${cell1.currentDimensions}
    Cell 2 dimensions: ${cell2.currentDimensions}`;
        };
    }();
  • ¶

    Create the Display cycle animation

    const demoAnimation = scrawl.makeRender({
    
        name: "demo-animation",
        target: canvas,
        afterShow: report,
    });
  • ¶

    Development and testing

    console.log(scrawl.library);