我正在尝试在Processing(最新版本,3.0a10)中的另一个类中创建SoundFile类型的实例。我可以轻松播放在课堂外定义的声音,如下所示:
$form = $('#signupFrm'); // cache
$form.find('a.submit img').prop('disabled', true); // disable submit btn
但是,当我尝试从类中创建一个SoundFile实例时,我遇到了麻烦。一个简单的例子是:
import processing.sound.*;
SoundFile clickSound;
void setup() {
size(600, 600);
clickSound = new SoundFile(this, "bike-passing-by.wav");
}
void draw() {
clickSound.play();
}
我收到的错误是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();
}
}
。在SoundFile的Processing参考中,它声明构造函数定义为"The constructor SoundFile(soundTest.SomeSound, String) is undefined"
。 parent参数应该是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
但只能设法产生不同的错误。任何关于如何解决这个问题的建议将不胜感激。
答案 0 :(得分:3)
发生错误的原因是,正如您所说,您需要访问在Processing sketch中自动为您创建的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
关键字。
请注意,如果您的类在其自己的选项卡中定义,或者如果它位于草图选项卡内,并且它与草图“耦合”一点,则第二种方法将起作用,因此它可能优于第一种方法。
答案 1 :(得分:-1)
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
不会被破坏,因此如果任何问题必须发表评论,请尝试使用此方法。