PShape 2.08使用createShape抛出NullPointerException

时间:2013-05-17 04:55:25

标签: nullpointerexception processing

我在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

如何使这项工作?有没有解决方法? 感谢

2 个答案:

答案 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();
  }
}