![Børre Stenseth](http://www.it.hiof.no/~borres/allround/selfimages/bs.gif)
? Browser Support ?
HTML
>
Canvas
>
Processing
>Multi
Kommuniksajon mellom skisser
De to canvas-elementene har identisk processing kode.
_multiDraw.pde
/* Drawing simple lines with width and color lines are arranged in strokes */ // thin and black int strokeWidth=2; color strokeColor=color(255, 204, 0); // recorded pontvalues int lastX=0; int lastY=0; // idetifier so it can present itself int myIdentifier=-1; // all strokes ArrayList<pstroke> strokes; // and the one we are working on pstroke currentStroke=null; void setup() { size(300, 200); smooth(); frameRate(60); strokes=new ArrayList<pstroke>(); currentStroke=null; clearCanvas(); } void clearCanvas() { background(255, 255, 180); } //------------------------------------- // mousing only active when canDraw == true // pressed mouse and we start a new stroke void mousePressed() { addStroke(strokeWidth, strokeColor); currentStroke.addpt(new pt(mouseX, mouseY)); } // dragged and we add a point void mouseDragged() { if (currentStroke!=null){ if((Math.abs(lastX-mouseX)>3) || (Math.abs(lastY-mouseY)>3)){ currentStroke.addpt(new pt(mouseX, mouseY)); lastX=mouseX; lastY=mouseY; } } } void draw() { clearCanvas(); for (int ix=0;ix < strokes.size();ix++) ((pstroke)strokes.get(ix)).drawStroke(); } // add a new stroke void addStroke(int strokeWidth, int strokeColor) { currentStroke=new pstroke(strokeWidth, strokeColor); strokes.add(currentStroke); } // add a new point to current stroke void addPoint(int x, int y) { currentStroke.addpt(new pt(x, y)); } //------------------------ void clearLast(){ if(strokes.size() >0) strokes.remove(strokes.size()-1); } // this is the finnish of a stroke // tell ths surrounding about this event void mouseReleased(){ shareStroke(myIdentifier,currentStroke); } void setIdentifier(int id){ myIdentifier=id; } void setInitColor(int r,int g, int b){ strokeColor=color(r, g, b); } int getIdentifier(){ return myIdentifier; } void addStrokeFromPage(int strokeWidth, int strokeColor){ currentStroke=new pstroke(strokeWidth, strokeColor); strokes.add(currentStroke); }
_pstroke.pde
// hold a stroke with: // color, width, type, timeused and a series of points class pstroke { private int pwidth; private color pcolor; // all the points in the stroke private ArrayList<pt> pts; // constructor public pstroke(int pwidth, color pcolor) { this.pwidth=pwidth; this.pcolor=pcolor; this.pts=new ArrayList<pt>(); } // add a point (no difflimit) public void addpt(pt p) { pts.add(p); } // draw this stroke with all lines public void drawStroke() { // set color and width strokeWeight(this.pwidth); stroke(this.pcolor); // loop points int ix=1; while (ix < pts.size ()) { line( pts.get(ix-1).x, pts.get(ix-1).y, pts.get(ix).x, pts.get(ix).y); ix++; } } }
_pt.pde
// hold a single point class pt { public int x, y; // constructor public pt(int x, int y) { this.x=x; this.y=y; } public String toString() { return ""+x+","+y; } }
Javascriptet som setter opp de to skissene og handterer datautvekslingen mellom dem slik ut:
_index.js
var CanvasList=new Array(); // clear all function clearDrawing(id){ var pjs = Processing.getInstanceById(id); pjs.setup(); } // clear last stroke function clearLastStroke(id){ var pjs = Processing.getInstanceById(id); pjs.clearLast(); } // called from sketch for sharing a stroke to other sketch function shareStroke(senderId,strokeObj){ for( var ix=0;ix < CanvasList.length;ix++){ var pjs = CanvasList[ix]; var currentId=pjs.getIdentifier(); if( currentId!=senderId){ // we cannot copy the stroke blindly. We must let // javascript identify the components and // simulate a drawing action by adding points pjs.addStrokeFromPage(strokeObj.pwidth,strokeObj.pcolor); // mirror each point when adding points to the new stroke for(var pix=0; pix < strokeObj.pts.size();pix++){ pjs.addPoint(300-strokeObj.pts.get(pix).x, strokeObj.pts.get(pix).y); } } } } // set up sketches function identifyPObj(){ // show them document.getElementById("wrapper1").style.display="block"; document.getElementById("wrapper2").style.display="block"; // hide the startup button document.getElementById("starter").style.display="none"; // give each processing instance an id so it can identify // itself when it reports, and give it a basic drawing color var pjs = Processing.getInstanceById('draw0'); pjs.setIdentifier(0); pjs.setInitColor(0,0,0); CanvasList[0]=pjs; pjs = Processing.getInstanceById('draw1'); pjs.setIdentifier(1); pjs.setInitColor(255,0,0); CanvasList[1]=pjs; }