我正在尝试在处理(最新版本,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();
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试从类内部创建 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();
}
}
Run Code Online (Sandbox Code Playgroud)
我收到的错误是"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");
但只能产生不同的错误。任何有关如何解决此问题的建议将不胜感激。
发生错误的原因是,正如您所说,您需要访问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();
}
}
Run Code Online (Sandbox Code Playgroud)
您真正关心的唯一一行是这一行:
clickSound = new SoundFile(NameOfYourSketch.this, "bike-passing-by.wav");
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,SomeSound构造函数接受一个PApplet参数,然后可以将其传递给SoundFile构造函数。为了将该PApplet实例提供给SomeSound构造函数,您可以使用 sketch-levelthis关键字。
请注意,如果您的类在其自己的选项卡中定义或者位于草图选项卡内,并且它与草图的“耦合”程度较低,那么第二种方法将起作用,因此它可能比第一种方法更可取。
| 归档时间: |
|
| 查看次数: |
2951 次 |
| 最近记录: |