我在mac上使用Processing 2.08。我正在尝试使用文档中给出的createShape函数创建一个PShape。
PShape s;
void setup(){
size(500,500);
s = createShape();
s.beginShape(QUADS);
s.fill(0);
s.vertex(100,100);
s.vertex(100,300);
s.vertex(300,300);
s.vertex(300,100);
s.endShape();
}
void draw(){
shape(s);
}
但是这个程序会抛出NullPointerException。在查看Processing.org论坛时,我发现一个帖子说新处理库存在问题。
参考:https://forum.processing.org/topic/changes-to-pshape-in-2-08
如何使这项工作?有没有解决方法? 感谢
答案 0 :(得分:3)
来自文档:
用于存储形状的数据类型。处理当前可以加载和显示 SVG(可缩放矢量图形)和OBJ形状。在使用形状之前, 它必须使用loadShape()函数加载。 shape()函数 用于将形状绘制到显示窗口。 PShape对象 包含一组方法,链接如下,可以操作 形状数据。只能使用P3D渲染器打开OBJ文件。
您可以在此处找到参考:http://processing.org/reference/PShape.html
简而言之,目前,如果没有先在其他地方创建形状,就无法使用PShape。
您可以单独创建图像,将其保存在文件中,然后使用PShape加载它。它是一个黑客,但它可以使用PShape至少,直到他们能够提出更适当的解决方案。
答案 1 :(得分:3)
除了nickecarlo的答案之外,你可以使用PGraphics:
PGraphics s;
void setup(){
size(500,500);
s = createGraphics(width,height);
s.beginDraw();
s.beginShape(QUADS);
s.fill(0);
s.vertex(100,100);
s.vertex(100,300);
s.vertex(300,300);
s.vertex(300,100);
s.endShape();
s.endDraw();
}
void draw(){
image(s,0,0);
}
或实现自己的Shape类。 这是一个非常粗略的例子:
Shape s = new Shape();
Shape s2 = new Shape();
void setup(){
size(500,500);
s.addVertex(100,100);
s.addVertex(100,300);
s.addVertex(300,300);
s.addVertex(300,100);
s2.addVertex(350,100);
s2.addVertex(450,100);
s2.addVertex(450,200);
s2.addVertex(350,200);
}
void draw(){
s.draw();
s2.draw();
}
class Shape{
ArrayList<PVector> vertices = new ArrayList<PVector>();
void addVertex(float x,float y){
vertices.add(new PVector(x,y));
}
void draw(){
pushStyle();
beginShape(QUADS);
fill(0);
for(PVector v : vertices) vertex(v.x,v.y);
endShape();
popStyle();
}
}