Dynamically “unload” a Processing JS sketch from canvas

前端 未结 3 1811
攒了一身酷
攒了一身酷 2021-01-02 15:28

I\'m using some javascript to allow users to dynamically load a sketch on click to a canvas element using:

Processing.loadSketchFromSources(\'canvas_i

相关标签:
3条回答
  • 2021-01-02 16:02

    As of processing.js 1.4.8, Andrew's accepted answer (and the other answers I've found in here) do not seem to work anymore.

    This is what worked for me:

        var pjs = Processing.getInstanceById('pjs');
        if (typeof pjs !== "undefined") {
          pjs.exit();
        }
    
        var canvas = document.getElementById('pjs')
        new Processing(canvas, scriptText);
    

    where pjs is the id of the canvas element where the scrips is being run.

    0 讨论(0)
  • 2021-01-02 16:05

    I'm not familiar with Processing.js, but the example code from the site has this:

    var canvas = document.getElementById("canvas1");
    // attaching the sketchProc function to the canvas
    var p = new Processing(canvas, sketchProc);
    // p.exit(); to detach it
    

    So in your case, you'll want to keep a handle to the first instance when you create it:

    var p1 = Processing.loadSketchFromSources('canvas_id', ['sketch.pde']);
    

    When you're ready to "unload" and load a new sketch, I'm guessing (but don't know) that you'll need to clear the canvas yourself:

    p1.exit();
    var canvas = document.getElementById('canvas_id'); 
    var context = canvas.getContext('2d');
    context.clearRect(0, 0, canvas.width, canvas.height);
    // Or context.fillRect(...) with white, or whatever clearing it means to you
    

    Then, from the sound of things, you're free to attach another sketch:

    var p2 = Processing.loadSketchFromSources('canvas_id', ['sketch2.pde']);
    

    Again, I'm not actually familiar with that library, but this appears straightforward from the documentation.

    0 讨论(0)
  • 2021-01-02 16:24

    In case someone else comes looking for the solution, here's what I did that worked. Note that this was placed inside a closure (not included here for brevity) -- hence the this.launch = function(), blah blah blah... YMMV.

    /**
     * Launches a specific sketch. Assumes files are stored in
     * the ./sketches subdirectory, and your canvas is named g_sketch_canvas
     * @param {String} item The name of the file (no extension)
     * @param {Array} sketchlist Array of sketches to choose from
     * @returns true
     * @type Boolean
     */
    this.launch = function (item, sketchlist) {
        var cvs = document.getElementById('g_sketch_canvas'),
            ctx = cvs.getContext('2d');
        if ($.inArray(item, sketchlist) !== -1) {
            // Unload the Processing script
            if (Processing.instances.length > 0) {
                // There should only be one, so no need to loop
                Processing.instances[0].exit();
                // If you may have more than one, then use this loop:
                 for (i=0; i < Processing.instances.length; (i++)) {
                //  Processing.instances[i].exit();
                //}
            }
            // Clear the context
            ctx.setTransform(1, 0, 0, 1, 0, 0);
            ctx.clearRect(0, 0, cvs.width, cvs.height);
            // Now, load the new Processing script
            Processing.loadSketchFromSources(cvs, ['sketches/' + item + '.pde']);
        }
        return true;
    };
    
    0 讨论(0)
提交回复
热议问题