在 Processing 的 class 中实例化 SoundFile 对象
Instantiating a SoundFile object within a class in Processing
我正在尝试在 Processing(最新版本 3.0a10)中的另一个 class 中创建 SoundFile 类型的实例。我可以轻松地播放定义在 class 之外的声音,如下所示:
import processing.sound.*;
SoundFile clickSound;
void setup() {
size(600, 600);
clickSound = new SoundFile(this, "bike-passing-by.wav");
}
void draw() {
clickSound.play();
}
但是,当我尝试从 class 中创建 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
替换 this
:
clickSound = new SoundFile(super, "bike-passing-by.wav");
和PApplet
:
clickSound = new SoundFile(PApplet, "bike-passing-by.wav");
但只能设法产生不同的错误。非常感谢任何有关如何解决此问题的建议。
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
没有销毁所以尝试这个方法,如果有任何问题必须评论。
发生错误是因为,正如您所说,您需要访问在 Processing 草图中自动为您创建的 PApplet
实例。当您在另一个 class 中时,this
关键字指的是那个 class 的实例,而不是草图的 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");
此语法可能看起来很奇怪,但您可以使用 NameOfYourSketch.this
达到草图级别 this
。在引擎盖下,这是因为您的草图被编译成 Java class,并且主草图 window 中的 class 是非静态内部 class class.
的 es
如果你的 class 在另一个选项卡中,这种方法将不起作用,因为它们自己选项卡中的 classes 被编译到它们自己的顶级非内部 Java classes,所以他们无权访问草图级 this
变量。相反,您必须将其传递到 class:
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
关键字。
请注意,如果您的 class 是在其自己的选项卡中定义的,或者如果它在草图选项卡内,并且您的草图 "coupled" 稍微少一点,那么第二种方法将起作用,所以它可能是优于第一种方法。
我正在尝试在 Processing(最新版本 3.0a10)中的另一个 class 中创建 SoundFile 类型的实例。我可以轻松地播放定义在 class 之外的声音,如下所示:
import processing.sound.*;
SoundFile clickSound;
void setup() {
size(600, 600);
clickSound = new SoundFile(this, "bike-passing-by.wav");
}
void draw() {
clickSound.play();
}
但是,当我尝试从 class 中创建 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
替换 this
:
clickSound = new SoundFile(super, "bike-passing-by.wav");
和PApplet
:
clickSound = new SoundFile(PApplet, "bike-passing-by.wav");
但只能设法产生不同的错误。非常感谢任何有关如何解决此问题的建议。
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
没有销毁所以尝试这个方法,如果有任何问题必须评论。
发生错误是因为,正如您所说,您需要访问在 Processing 草图中自动为您创建的 PApplet
实例。当您在另一个 class 中时,this
关键字指的是那个 class 的实例,而不是草图的 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");
此语法可能看起来很奇怪,但您可以使用 NameOfYourSketch.this
达到草图级别 this
。在引擎盖下,这是因为您的草图被编译成 Java class,并且主草图 window 中的 class 是非静态内部 class class.
如果你的 class 在另一个选项卡中,这种方法将不起作用,因为它们自己选项卡中的 classes 被编译到它们自己的顶级非内部 Java classes,所以他们无权访问草图级 this
变量。相反,您必须将其传递到 class:
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
关键字。
请注意,如果您的 class 是在其自己的选项卡中定义的,或者如果它在草图选项卡内,并且您的草图 "coupled" 稍微少一点,那么第二种方法将起作用,所以它可能是优于第一种方法。