在处理中实例化类中的 SoundFile 对象

Dan*_*erg 2 audio 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();
}
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");

我尝试替换thissuperclickSound = new SoundFile(super, "bike-passing-by.wav");

PAppletclickSound = new SoundFile(PApplet, "bike-passing-by.wav");

但只能产生不同的错误。任何有关如何解决此问题的建议将不胜感激。

Kev*_*man 5

发生错误的原因是,正如您所说,您需要访问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关键字。

请注意,如果您的类在其自己的选项卡中定义或者位于草图选项卡内,并且它与草图的“耦合”程度较低,那么第二种方法将起作用,因此它可能比第一种方法更可取。