我只是在学习处理。我的背景是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;
}
}
有什么想法吗?谢谢!
答案 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;
}
请注意,该函数的参数是PApplet
和PShape
。
当您在该类中扩展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
。