【问题标题】:Instantiating a SoundFile object within a class in Processing在 Processing 中的类中实例化 SoundFile 对象
【发布时间】:2015-06-17 05:08:16
【问题描述】:

我正在尝试在 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 替换为superclickSound = new SoundFile(super, "bike-passing-by.wav");

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

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

【问题讨论】:

  • 如何调用问题中必须提到的setup()draw()
  • Processing 自动调用 setup() 一次,并在程序运行期间无限循环运行 draw()。
  • 你这两个函数必须包含在同一个类中,否则它不能像你通常问的那样工作。我会用一种方法来回答。

标签: audio processing


【解决方案1】:

发生错误是因为,正如您所说,您需要访问在处理草图中为您自动创建的 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");

这种语法可能看起来很奇怪,但您可以使用NameOfYourSketch.this 来达到草图级别的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 关键字。

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

【讨论】:

  • 谢谢!这正是我需要知道的!奇迹般有效。我很欣赏它为什么起作用的解释,以及实际的语法。
【解决方案2】:
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没有被破坏,所以如果有任何问题必须评论,请尝试这个方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多