p5.js 和 Processing 的恩怨情仇

序卷

p5.j​​s 看起来与 Processing 非常相似,但有一些变化:

  • 因为 size() 已经被 createCanvas() 代替,所以我们的草图不仅仅是画布,还能创建其他元素。
  • frameRate(num) 设置帧速率,但该 frameRate 变量已被删除。要获取当前帧速率,请用 frameRate() 不带参数调用。
  • JavaScript 并不总能同步加载,下面有几个方法可解决这个问题:
    ① 所有的加载方法都有一个可选的回调参数。也就是在文件加载完后调用的函数。
    ② 另外,我们可以将加载调用放在 preload() 函数中,其发生在 setup() 之前。如果存在 preload() 函数,则 setup() 函数会等待,直到加载完所有内容为止,请参阅此图像示例
  • 变量 mousePressed 已替换成 mouseIsPressed 。
  • 除鼠标事件外,还有触摸事件,映射如下所示:
    ① mouseX 〜 touchX
    ② mouseY 〜 touchY
    ③ mousePressed() 〜 touchStarted()
    ④ mouseDragged() 〜 touchMoved()
    ⑤ mouseReleased() 〜 touchEnded()
    ⑥ 有一个 touches[] 数组包含一系列对象,其中 x 和 y 属性对应于每个手指的位置。
  • push/popMatrix() 、push/popStyle() 已替换为 push() 和 pop() ,这相当于同时调用 matrix 和 style 方法。
  • 默认情况下,所有内容都处于全局命名空间中,并且你可以像在 Processing 中一样创建草图。我们称之为 “instance mode” ,用于创建一个 p5 草图,其可与你网页上运行的其他代码一起播放。请参阅实例模式示例以及全局与实例模式教程
  • 在全局模式下,p5 变量和函数名不可用于 setup(),draw(),mousePressed(),等之外(除非它们被放置在由这些方法之一调用的函数内)。这意味着如果你想使用 p5 函数,当在 setup() 之前声明变量时,你需要在 setup() 里面赋值。例如:
    这里写图片描述
  • 函数 println() 在 p5.js 中不可用。而使用 print() 或 console.log() 代替。
  • WEBGL模式的原点(0,0,0)位于画布的中心,而不是左上角。
  • Processing 并非所有内容都在 p5.js 中实现,但我们正在努力!现在没有PShape 的等价物。p5.js 中的相机模型还非常基本,只有眼睛的位置,没有“看”或轴的方向。

前因

  • 在 JavaScript 中,变量没有类型。使用 var 而不是 float、int、double、long、char、String、Array 等。我们不需要为函数指定返回类型或参数类型。
  • var 可以是任何东西——任何提到的类型,也可以是函数。
  • 数组的构造非常简单(不再需要 Processing 中的 ArrayList)并且具有许多内置功能,请参阅数组示例以及更多关于 JS 数组的信息
  • JavaScript 使用称为原型的东西来形成类似于 Java 类对象的东西。在这里看到这个对象的例子和更多关于 JS 对象

风云

基本草图

这是 Processing 和 p5.js 草图的基本设置。 请注意,p5.js 还需要一个空的 HTML 文件,该文件链接到标题中的 p5.js 库和草图文件。

void setup() {
  // setup stuff
}

void draw() {
  // draw stuff
}
function setup() {
  // setup stuff
}

function draw() {
  // draw stuff
}
Processing 转换 p5.js

以下是已从 Processing 转换为 p5.js 的两个示例。 所做的更改显示在注释中,其他行保持不变。

/**
 * This example can be found in the Processing examples package
 * that comes with the Processing PDE.
 * Processing > Examples > Basics > Form > Bezier
 * Adapted by Evelyn Eastmond
 */

function setup() {           // **change** void setup() to function setup()
  createCanvas(640, 360);    // **change** size() to createCanvas()
  stroke(255);               // stroke() is the same
  noFill();                  // noFill() is the same
}

function draw() {                         // **change** void draw() to function draw()
  background(0);                          // background() is the same
  for (var i = 0; i < 200; i += 20) {     // **change** int i to var i
    bezier(mouseX-(i/2.0), 40+i, 410, 20, 440, 300, 240-(i/16.0), 300+(i/8.0)); // bezier() is the same
  }
}
/**
 * This example can be found in the Processing examples package
 * that comes with the Processing PDE.
 * Processing > Examples > Topics > Interaction > Follow3
 * Adapted by Evelyn Eastmond
 */

var x = new Array(20);  // **change** float[] x = new float[20] to new Array(20)
var y = new Array(20);  // **change** float[] y = new float[20] to new Array(20)
var segLength = 18;                                 // **change** float to var

function setup() {                          // **change** void setup() to function setup()
  createCanvas(640, 360);                   // **change** size() to createCanvas()
  strokeWeight(9);                          // strokeWeight() is the same
  stroke(255, 100);                         // stroke() is the same
  for(var i=0; i<x.length; i++) {         // initialize the array
    x[i]=0;
    y[i]=0;
  }
}

function draw() {                           // **change** void draw() to function draw()
  background(0);                            // background() is the same
  drawSegment(0, mouseX, mouseY);           // functions calls, mouseX and mouseY are the same
  for(var i=0; i<x.length-1; i++) {         // **change** int i to var i
    drawSegment(i+1, x[i], y[i]);           // function calls are the same
  }
}

function drawSegment(i, xin, yin) {         // **change** void drawSegment() to function drawSegment(), remove type declarations
  var dx = xin - x[i];                      // **change** float to var
  var dy = yin - y[i];                      // **change** float to var
  var angle = atan2(dy, dx);                // **change** float to var, atan2() is the same
  x[i] = xin - cos(angle) * segLength;      // cos() is the same
  y[i] = yin - sin(angle) * segLength;      // sin() is the same
  segment(x[i], y[i], angle);               // function calls are the same
}

function segment(x, y, a) {                 // **change** void segment() to function segment(), remove type declarations
  push();                                   // pushMatrix() becomes push()
  translate(x, y);                          // translate() is the same
  rotate(a);                                // rotate() is the same
  line(0, 0, segLength, 0);                 // line() is the same
  pop();                                    // popMatrix() becomes pop()
}
p5.js 转换 Processing

以下是已从 p5.js 转换为 Processing 的两个示例。 所做的更改显示在注释中,其他行保持不变。

/**
 * This example can be found in the Processing examples package
 * that comes with the Processing PDE.
 * Processing > Examples > Basics > Form > Bezier
 */

void setup() {                         // **change** function setup() to void setup()
  size(640, 360);                      // **change** createCanvas() to size()
  stroke(255);
  noFill();
}

void draw() {                          // **change** function draw() to void draw()
  background(0);
  for (int i = 0; i < 200; i += 20) {  // **change** var i to int i
    bezier(mouseX-(i/2.0), 40+i, 410, 20, 440, 300, 240-(i/16.0), 300+(i/8.0));
  }
}
/**
 * This example can be found in the Processing examples package
 * that comes with the Processing PDE.
 * Processing > Examples > Topics > Interaction > Follow3
 * Based on code from Keith Peters. 
 */

float[] x = new float[20];                       // **change** array of 0's to be float[] x = new float[20]
float[] y = new float[20];                       // **change** array of 0's to be float[] x = new float[20]
float segLength = 18;                            // **change** var to float

void setup() {                                   // **change** function setup() to void setup() 
  size(640, 360);                                // **change** createCanvas() to size()
  strokeWeight(9);
  stroke(255, 100);
}

void draw() {                                    // **change** function draw() void draw()
  background(0);
  dragSegment(0, mouseX, mouseY);
  for(int i=0; i<x.length-1; i++) {              // **change** var i to int i
    dragSegment(i+1, x[i], y[i]);
  }
}

void dragSegment(int i, float xin, float yin) {  // **change** function drawSegment() to void drawSegment(). add type declarations.
  float dx = xin - x[i];                         // **change** var to float
  float dy = yin - y[i];                         // **change** var to float
  float angle = atan2(dy, dx);                   // **change** var to float
  x[i] = xin - cos(angle) * segLength;
  y[i] = yin - sin(angle) * segLength;
  segment(x[i], y[i], angle);
}

void segment(float x, float y, float a) {        // **change** function segment() to void segment(). add type declarations.
  pushMatrix();
  translate(x, y);
  rotate(a);
  line(0, 0, segLength, 0);
  popMatrix();
}

事实

在 p5.js 中,所有变量(无论它们是数字、字符串、数组、函数、对象,还是什么)都使用符号 “var” 声明。在 Processing 中,您必须指定变量类型。
例如,不是:

boolean button = false;

而是:

var button = false;

或,不是:

float x = 100.3;

而是:

var x = 100.3;

以下是支持的 Processing 数据类型的摘要:

名称描述值的范围
int整数值-2,147,483,648至2,147,483,647
float浮点值-3.40282347E+38 到 3.40282347E+38
boolean布尔值true 或 false
char单个字符A-z,0-9和符号
String字符串任何字母,单词,句子等
PImagePNG,JPG或GIF图像N / A
PFontVLW字体; 使用创建字体工具来制作N / A
PShapeSVG文件N / A

尾语

原文链接:https://github.com/processing/p5.js/wiki/Processing-transition
当你在 p5.js 和 Processing 转换过程中,遇到问题,欢迎 @Hewes。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值