处理:当类文件扩展PShape时,createShape()行为会发生变化

时间:2016-02-10 20:27:47

标签: processing

我只是在学习处理。我的背景是ActionScript。我正在创建一个绘制复杂对象的自定义类。作为这个类的一部分,我多次调用createShape()。事情很好,直到我决定我需要自定义类来扩展PShape。现在它不会识别我正在使用的createShape()语法,并返回一个错误,说“createShape()需要参数,如:createShape(PApplet,PShape)”

这是函数,它返回一个PShape对象。它工作正常。

    class MyClass
    {
      ...

      PShape makeTriangle1( float w, color c )
      {
        strokeJoin(BEVEL);
        PShape t = createShape(TRIANGLE, 0, 0, w, 0, 0, topBar);
        t.setFill(c);
        return t;
      }
    }

但是当我这样做时,它会返回我上面引用的错误:

    class MyClass extends PShape
    {
      ...

      PShape makeTriangle1( float w, color c )
      {
        strokeJoin(BEVEL);
        PShape t = createShape(TRIANGLE, 0, 0, w, 0, 0, topBar);
        t.setFill(c);
        return t;
      }
    }

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:2)

PShape类有一个名为createShape()的函数。您可以在第1441行here

上查看
static protected PShape createShape(PApplet parent, PShape src) {
    PShape dest = null;
    if (src.family == GROUP) {
      dest = parent.createShape(GROUP);
      PShape.copyGroup(parent, src, dest);
    } else if (src.family == PRIMITIVE) {
      dest = parent.createShape(src.kind, src.params);
      PShape.copyPrimitive(src, dest);
    } else if (src.family == GEOMETRY) {
      dest = parent.createShape(src.kind);
      PShape.copyGeometry(src, dest);
    } else if (src.family == PATH) {
      dest = parent.createShape(PATH);
      PShape.copyPath(src, dest);
    }
    dest.setName(src.name);
    return dest;
  }

请注意,该函数的参数是PAppletPShape

当您在该类中扩展PShape并调用createShape()时,Processing会认为您正在尝试调用此函数。由于您的参数不匹配,您将收到错误。

要解决此错误,您可以将草图PApplet传递到MyClass类,并专门调用草图级createShape()函数:

int topBar = 100;

MyClass mc;

void setup() {
  size(500, 500);
  mc = new MyClass(this);
}

void draw() {
  background(0);
  shape(mc.makeTriangle1(100, #ff0000), 200, 200);
}


class MyClass extends PShape{

  PApplet sketch;

  public MyClass(PApplet sketch){
    this.sketch = sketch;
  }

  PShape makeTriangle1( float w, color c )
  {
    strokeJoin(BEVEL);
    PShape t = sketch.createShape(TRIANGLE, 0, 0, w, 0, 0, topBar);
    t.setFill(c);
    return t;
  }
}

但是,我强烈建议您重构代码,这样就不再需要扩展PShape了。扩展这样的Processing类似乎很奇怪。您有可能使用composition instead of inheritance。换句话说,您的班级有一个 PShape,而不是您的班级是一个 PShape