我正在尝试在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关键字。

请注意,如果您的类是在其自己的选项卡中定义的,或者如果它在草图选项卡中,则该第二种方法将起作用,并且它与草图的“耦合”要少一些,因此它可能比第一种方法更可取。

09-16 11:48