我试图在处理中的另一个类中创建一个SoundFile类型的实例(最新版本,3.0a10)。我可以轻松地播放在类之外定义的声音,如下所示:
import processing.sound.*;
SoundFile clickSound;
void setup() {
size(600, 600);
clickSound = new SoundFile(this, "bike-passing-by.wav");
}
void draw() {
clickSound.play();
}但是,当我试图从类内创建SoundFile实例时,会遇到麻烦。这方面的一个简化例子是:
import processing.sound.*;
SomeSound fx;
void setup() {
size(600, 600);
fx = new SomeSound();
}
void draw() {
fx.play();
}
class SomeSound {
SoundFile clickSound;
SomeSound() {
clickSound = new SoundFile(this, "bike-passing-by.wav");
}
void play() {
clickSound.play();
}
}我收到的错误是"The constructor SoundFile(soundTest.SomeSound, String) is undefined"。在SoundFile的处理引用中,它声明构造函数被定义为SoundFile(parent, path)。父参数应该是PApplet: typically use "this"。
因此,我尝试了许多选项来替换这一行:clickSound = new SoundFile(this, "bike-passing-by.wav");
我尝试用super:clickSound = new SoundFile(super, "bike-passing-by.wav");替换super:clickSound = new SoundFile(super, "bike-passing-by.wav");
和PApplet:clickSound = new SoundFile(PApplet, "bike-passing-by.wav");
但只会产生不同的错误。任何关于如何解决这个问题的建议都将不胜感激。
发布于 2015-06-17 12:36:59
发生此错误的原因是,正如您所说的,您需要访问在处理草图中为您自动创建的PApplet实例。当您在另一个类中时,this关键字引用的是该类的实例,而不是草图的PApplet实例。
如果您的类位于主草图中(而不是在另一个选项卡中),那么您可以这样做:
import processing.sound.*;
SomeSound fx;
void setup() {
size(600, 600);
fx = new SomeSound();
}
void draw() {
fx.play();
}
class SomeSound {
SoundFile clickSound;
SomeSound() {
clickSound = new SoundFile(NameOfYourSketch.this, "bike-passing-by.wav");
}
void play() {
clickSound.play();
}
}你唯一关心的是这句话:
clickSound = new SoundFile(NameOfYourSketch.this, "bike-passing-by.wav");这个语法看起来可能很奇怪,但是您可以通过使用this实现草图级的NameOfYourSketch.this。在框架下,这是因为草图被编译成Java类,而主草图窗口中的类是该类的非静态内部类。
如果您的类位于另一个选项卡中,则该方法将无法工作,因为在它们自己的选项卡中的类被编译成它们自己的顶级非内部Java类,因此它们无法访问草图级别的this变量。相反,您必须将其传递给全班:
import processing.sound.*;
SomeSound fx;
void setup() {
size(600, 600);
fx = new SomeSound(this);
}
void draw() {
fx.play();
}
class SomeSound {
SoundFile clickSound;
SomeSound(PApplet p) {
clickSound = new SoundFile(p, "bike-passing-by.wav");
}
void play() {
clickSound.play();
}
}注意,SomeSound构造函数接受一个PApplet参数,然后它可以传递给SoundFile构造函数。要将该PApplet实例提供给SomeSound构造函数,可以使用草图级this关键字。
请注意,如果您的类是在它自己的选项卡中定义的,或者它在草图选项卡中,并且它与您的草图不太“耦合”,那么这第二种方法就能工作,所以它可能比第一种方法更可取。
发布于 2015-06-17 05:19:56
import processing.sound.*;
class callerClass{
SomeSound fx;
void setup() {
size(600, 600);
this.fx = new SomeSound();
}
void draw() {
this.fx.play();
}
}
class SomeSound {
SoundFile clickSound;
SomeSound() {
clickSound = new SoundFile(this, "bike-passing-by.wav");
}
void play() {
clickSound.play();
}
}fx不被破坏,因此,如果有任何问题必须注释,请尝试此方法。https://stackoverflow.com/questions/30882728
复制相似问题