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

Audio 正在处理中实例化类中的SoundFile对象,audio,processing,Audio,Processing,我正在尝试在正在处理的另一个类(最新版本,3.0a10)内创建该类型的实例。我可以轻松播放在类外定义的声音,如下所示: import processing.sound.*; SoundFile clickSound; void setup() { size(600, 600); clickSound = new SoundFile(this, "bike-passing-by.wav"); } void draw() { clickSound.play();

我正在尝试在正在处理的另一个类(最新版本,3.0a10)内创建该类型的实例。我可以轻松播放在类外定义的声音,如下所示:

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();
  }

}
我收到的错误是
“构造函数声音文件(soundTest.SomeSound,String)未定义”
。在SoundFile的处理参考中,它声明构造函数定义为
SoundFile(父级,路径)
。父参数应该是
PApplet:通常使用“this”

因此,我尝试了许多选项来替换这一行:
clickSound=新的声音文件(这是“bike passing by.wav”)

我尝试用
super
替换
this
clickSound=新的声音文件(super,“bike passing by.wav”)

PApplet
clickSound=新的声音文件(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
    不是destroy,因此如果有任何问题需要注释,请尝试此方法

发生错误是因为,正如您所说,您需要访问在处理草图中自动为您创建的
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
。This
。实际上,这是因为草图被编译成Java类,而主草图窗口中的类是该类的非静态内部类

如果您的类位于另一个选项卡中,这种方法将不起作用,因为它们自己的选项卡中的类被编译成它们自己的顶级非内部Java类,因此它们无法访问草图级别
这个
变量。相反,您必须将其传递到类中:

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
关键字


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

如何调用
setup()
draw()
这是问题中必须提到的。Processing会自动调用setup()一次,并在程序运行期间以无限循环方式运行draw()。您必须将这两个函数包含在同一个类中,否则它将无法正常工作。我用一种方法来回答。谢谢!这正是我需要知道的!!工作起来很有魅力。我很欣赏对其工作原理以及实际语法的解释。