0

我正在使用这个 CDN 版本的 createjs

 <script type="text/javascript" src="http://code.createjs.com/createjs-2013.09.25.min.js"></script>

因为我正在尝试在 Youtube 上跟随这个介绍性截屏视频http://www.youtube.com/watch?v=OWHJa0jKJgo 。它有一条线

 createjs.Sound.addEventListener("loadComplete", this.handleComplete);

但是,“loadComplete”最近已被弃用,取而代之的是“fileLoad”事件。如果我在主干视图的函数内执行此操作

  loadRegisterSound: function(){
  createjs.Sound.addEventListener("fileload", this.handleLoad);
  createjs.Sound.registerSound("img/pop.mp3", "sound");
  }

然后我明白了

Uncaught TypeError: Cannot read property 'handleEvent' of undefined 

如果我将上述函数的后半部分移到 handleLoad 函数中

loadRegisterSound: function(){
      createjs.Sound.addEventListener("fileload", this.handleLoad);

      },

handleLoad: function(){
   createjs.Sound.registerSound("img/pop.mp3", "sound");
   var ball = new createjs.Shape();
   ball.graphics.beginFill("#000000").drawCircle(0, 0, 50);
   createjs.Tween.get(ball, {loop:true}).to({x:450}, 3000).to({x:50}, 3000);
   createjs.Ticker.addEventListener("tick", this.tick);
   ball.addEventListener("click", this.handleClick);

   ball.x = 50;
   ball.y = 200;
   stage.addChild(ball);
}

那么没有任何迹象表明 handleLoad 函数被调用过。什么都没发生。

在 createjs http://www.createjs.com/Docs/SoundJS/classes/Sound.html的文档中,有一个奇怪的 createjs.proxy 函数与 fileload 事件一起使用

 createjs.Sound.addEventListener("fileload", createjs.proxy(this.loadHandler, (this));

但是,如果我尝试在主干视图中将它与我的代码一起使用,我会收到一个意外;错误。

有人可以解释我如何让fileload事件与 createjs.registerSound api 一起工作吗?

4

1 回答 1

1

createjs.proxy 用于维护范围,因此当调用处理函数时,它将在它所在的对象或库的正确上下文中调用。javascript 中的范围是一个复杂的主题,如果您不熟悉,值得阅读更多内容它。

我对您上面的代码片段感到困惑,因为您似乎正在从图像文件夹加载声音,并且在加载后您创建一个形状并将其添加到舞台。使用您的代码,我认为这就是您想要播放的声音:

createjs.Sound.addEventListener("fileload", createjs.proxy(this.handleLoad, this));
createjs.Sound.registerSound("img/pop.mp3", "sound");
function handleLoad(event) {
  var instance = createjs.Sound.play("sound");
}

在舞台上绘制形状与加载和播放声音无关,分离代码也可能有意义。截屏视频现在已经过时了,但是您可以在createjs 网站上找到有用的官方教程来帮助您入门,以及简单的示例。希望有帮助。

于 2013-11-04T16:40:11.910 回答