我正在尝试在Processing(最新版本3.0a10)的另一个类中创建SoundFile类型的实例。我可以轻松播放在类外定义的声音,如下所示:
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");
我尝试用this
替换super
:clickSound = new SoundFile(super, "bike-passing-by.wav");
和PApplet
:clickSound = new SoundFile(PApplet, "bike-passing-by.wav");
但只能产生不同的错误。任何有关如何解决此问题的建议将不胜感激。 最佳答案
发生错误是因为,正如您所说,您需要访问在Processing草图中自动为您创建的PApplet
实例。当您在另一个类中时,this
关键字引用该类的实例,而不是草图的PApplet
实例。
如果您的类(class)在您的主要草图内(不在另一个选项卡中),则可以执行以下操作:
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
关键字。请注意,如果您的类是在其自己的选项卡中定义的,或者如果它在草图选项卡中,则该第二种方法将起作用,并且它与草图的“耦合”要少一些,因此它可能比第一种方法更可取。