在 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 替换 thisclickSound = new SoundFile(super, "bike-passing-by.wav");

PAppletclickSound = 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" 稍微少一点,那么第二种方法将起作用,所以它可能是优于第一种方法。