首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在处理过程中实例化类中的SoundFile对象

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

Stack Overflow用户
提问于 2015-06-17 05:08:16
回答 2查看 2.6K关注 0票数 2

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

代码语言:javascript
复制
import processing.sound.*;

SoundFile clickSound;

void setup() {
  size(600, 600);
  clickSound = new SoundFile(this, "bike-passing-by.wav");
}

void draw() {
  clickSound.play();
}

但是,当我试图从类内创建SoundFile实例时,会遇到麻烦。这方面的一个简化例子是:

代码语言:javascript
复制
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");

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

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

但只会产生不同的错误。任何关于如何解决这个问题的建议都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-17 12:36:59

发生此错误的原因是,正如您所说的,您需要访问在处理草图中为您自动创建的PApplet实例。当您在另一个类中时,this关键字引用的是该类的实例,而不是草图的PApplet实例。

如果您的类位于主草图中(而不是在另一个选项卡中),那么您可以这样做:

代码语言:javascript
复制
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();
  }

}

你唯一关心的是这句话:

代码语言:javascript
复制
clickSound = new SoundFile(NameOfYourSketch.this, "bike-passing-by.wav");

这个语法看起来可能很奇怪,但是您可以通过使用this实现草图级的NameOfYourSketch.this。在框架下,这是因为草图被编译成Java类,而主草图窗口中的类是该类的非静态内部类。

如果您的类位于另一个选项卡中,则该方法将无法工作,因为在它们自己的选项卡中的类被编译成它们自己的顶级非内部Java类,因此它们无法访问草图级别的this变量。相反,您必须将其传递给全班:

代码语言:javascript
复制
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关键字。

请注意,如果您的类是在它自己的选项卡中定义的,或者它在草图选项卡中,并且它与您的草图不太“耦合”,那么这第二种方法就能工作,所以它可能比第一种方法更可取。

票数 4
EN

Stack Overflow用户

发布于 2015-06-17 05:19:56

代码语言:javascript
复制
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不被破坏,因此,如果有任何问题必须注释,请尝试此方法。
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30882728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档