在 Actionscript 上播放声音

2024-01-11

我有一个简单的拖放游戏,在 Flash 中启动并且大部分工作正常。

我已经添加了我的动物,您可以将它们拖放到正确的位置。我还添加了声音,这样当动物被放到正确的位置时,它就可以工作,但是每次我将新动物添加到正确的位置时,它都会起作用。播放那个声音和最后一个动物的声音。

e.g。将小猪放入小猪空间,即可播放小猪的声音 将牛放置在牛空间中,播放牛声和猪声 将鸭子放在鸭子空间中,它会播放鸭子声音、牛声音和猪声音。

显然,我只想在动物放置在正确位置时播放声音 - 在掉落时(而不是在下一个动物掉落时)

我不确定我做错了什么

/* 拖放 使指定的元件实例可通过拖放移动。 */

 import flash.media.Sound;
  var offset:int = 10;

  var pigStartX:int = 196.80;
  var pigStartY:int = 292.10;

  var pigEndX:int = 578.40;
  var pigEndY:int = 208.50;

  Pig.addEventListener(MouseEvent.MOUSE_DOWN, fl_ClickToDrag);

  function fl_ClickToDrag(event:MouseEvent):void
  {
  Pig.startDrag();
   }

 stage.addEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop);

  function fl_ReleaseToDrop(event:MouseEvent):void
   {
  Pig.stopDrag();
// dragging and dropping the pieces while checking for correct   location 

    if(Pig.x < pigEndX - offset || Pig.x > pigEndX + offset || Pig.y <    pigEndY - offset ||Pig.y > pigEndY + offset){

    Pig.x = pigStartX;
    Pig.y = pigStartY;
}

  else{

     //set piece back to original position
     Pig.x = pigEndX;
     Pig.y = pigEndY;

     var oink:PigOink = new PigOink(); 
     var channel:SoundChannel = oink.play();
    //checkGame();

}
}

/* 拖放 使指定的元件实例可通过拖放移动。 */

 var cowStartX:int = 324;
 var cowStartY:int = 317.95;

 var cowEndX:int = 411.50;
 var cowEndY:int = 140.95;

   Cow.addEventListener(MouseEvent.MOUSE_DOWN, fl_ClickToDrag_2);

  function fl_ClickToDrag_2(event:MouseEvent):void
  {
    Cow.startDrag();
  }

  stage.addEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop_2);

 function fl_ReleaseToDrop_2(event:MouseEvent):void
 {
    Cow.stopDrag();
// dragging and dropping the pieces while checking for correct  location 
 if(Cow.x < cowEndX - offset || Cow.x > cowEndX + offset || Cow.y <  cowEndY - offset ||Cow.y > cowEndY + offset){

      Cow.x = cowStartX;
      Cow.y = cowStartY;
 }

  else{

    //set piece back to original position
      Cow.x = cowEndX;
      Cow.y = cowEndY;

    var moo:CowMoo = new CowMoo(); 
    var channel:SoundChannel = moo.play();
    //checkGame();

}

}

/* 拖放 使指定的元件实例可通过拖放移动。 */

   var duckStartX:int = 209.45;
   var duckStartY:int = 402.05;

   var duckEndX:int = 56.45;
   var duckEndY:int = 225.05;

  Duck.addEventListener(MouseEvent.MOUSE_DOWN, fl_ClickToDrag_3);

  function fl_ClickToDrag_3(event:MouseEvent):void
  {
     Duck.startDrag();
   }

  stage.addEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop_3);

  function fl_ReleaseToDrop_3(event:MouseEvent):void
  {
     Duck.stopDrag();
// dragging and dropping the pieces while checking for correct location 
     if(Duck.x < duckEndX - offset || Duck.x > duckEndX + offset ||   Duck.y < duckEndY - offset ||Duck.y > duckEndY + offset){

    //set piece back to original position
        Duck.x = duckStartX;
        Duck.y = duckStartY;
     }

     else{


        Duck.x = duckEndX;
        Duck.y = duckEndY;

        var quack:DuckQuack = new DuckQuack(); 
        var channel:SoundChannel = quack.play();
    //checkGame();
   }


   }

@Neal Davis 关于导致问题的原因是正确的,但是我建议在动物到达目的地位置后删除事件侦听器而不是侦听MOUSE_UP释放函数中动物本身的事件:

function fl_ReleaseToDrop_3(event:MouseEvent):void {
    stage.removeEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop_3);
    Pig.stopDrag();
    //...
}

附加建议。

也正如@Organis 指出的那样。拥有更通用的代码要简单得多。 考虑有这样的事情:

文档类:

package
{
    import flash.display.Sprite;
    import flash.geom.Point;

    public class Main extends Sprite
    {
        private var animals:Vector.<Animal> = Vector.<Animal>([]);

        public function Main() {
            animals.push(new Animal("pig", pigMc, 578, 208, "oink.mp3"));
            animals.push(new Animal("cow", cowMc, 411, 140, "moo.mp3"));
            animals.push(new Animal("duck", duckMc, 56, 225, "quack.mp3"));
        }

    }

}

和简单的动物类:

package
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.geom.Point;
    import flash.media.Sound;
    import flash.net.URLRequest;

    public class Animal
    {
        private var _name:String;
        private var _dropMargin:Number = 10;
        private var _startPos:Point = new Point();
        private var _endPos:Point = new Point();
        private var _sound:Sound;
        private var _view:Sprite;

        public function Animal(name:String, view:Sprite, endX:Number = 0, endY:Number = 0, sound:String = null) {
            _name = name;
            _view = view;
            _startPos.x = _view.x; _startPos.y = _view.y;
            _endPos.x = endX; _endPos.y = endY;
            _sound = new Sound(new URLRequest(sound));
            view.addEventListener(MouseEvent.MOUSE_DOWN, onMDown);
        }

        private function onMDown(e:MouseEvent):void{
            _view.stage.addEventListener(MouseEvent.MOUSE_UP, onMUp);
            _view.startDrag();
        }

        private function onMUp(e:MouseEvent):void {
            _view.stage.removeEventListener(MouseEvent.MOUSE_UP, onMUp);
            _view.stopDrag();
            //Distance to destination point
            var dd:Number = Point.distance(pos, _endPos);

            if (dd > dropMargin) pos = _startPos;
            else {
                pos = _endPos;
                _sound.play();
            }
        }

        public function get view():Sprite{return _view;}

        public function get dropMargin():Number{return _dropMargin;}
        public function set dropMargin(value:Number):void{_dropMargin = value;}

        public function get pos():Point{return new Point(_view.x, _view.y);}
        public function set pos(value:Point):void{
            _view.x = value.x;
            _view.y = value.y;
        }

    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Actionscript 上播放声音 的相关文章

  • 调用控制器 Post 方法时遇到问题

    这是我的方法 AcceptVerbs HttpVerbs Post public void SaveImage FormCollection formValues byte contents Convert FromBase64String
  • AS3 是否可以复制 Shape 对象?

    我正在尝试制作一个可用于复制的形状 这是我所做的 我正在尝试做的以及我陷入困境的解释 在 Flash IDE 画笔 中手动绘制形状 创建了一个包含形状的新影片剪辑 作为一个类导出 实例化该类 var mc MovieClip new sha
  • 从另一个域加载外部图像

    是否可以从另一个域加载图像 jpg png gif 并操作像素 我想当下载 复制图像时它就在我的域中 使用加载器并将内容添加到图像组件时 我在调试器中收到错误 我想这里有一些跨域策略在起作用 但在继续之前我需要更确定它是如何工作的 我想 如
  • 闪存和 CORBA

    如何让 AS3 和 或 Flex AIR 应用程序与 CORBA 应用程序进行通信 在有人为 Flex 编写符合 CORBA 的库 您可能愿意自己做 之前 您最好的选择可能是构建一个充当桥梁的 包装器 Web 服务 可通过标准 Flex W
  • 在类之间调度事件

    我有一个自定义事件类 public class FFTDrawEvent extends Event public static const DRAW EVENT String drawEvent private var param Arr
  • 在 ActionScript 3 中在形状上绘制文本

    有没有办法仅使用 ActionScript 在 DisplayObject 或 Shape 中绘制文本 我在网上找到的唯一方法是创建 TextField 但我无法将 TF 添加到 DisplayObject 或 Shape Edit 解决了
  • 将数组从 Flash (AS3) 发送到 JavaScript

    是否可以使用ExternalInterface 调用将数组从Flash AS3 发送到JavaScript 我目前正在 Flash 内的 foreach 循环中多次调用一个函数 但速度太快 JavaScript 无法跟上 我的想法是创建一个
  • 在 Flash Player 10 中打开 pdf

    我需要在 Flash Player 10 中打开 PDF 该 swf 不会在浏览器中运行 并且系统上不会有 adobe reader 程序 我需要知道是否可以在 Flash 播放器中打开 PDF 而无需以任何方式进行转换 我在谷歌上搜索了无
  • 在没有流媒体服务器的情况下在 Flash 中录制 h.264 视频?

    是否可以在不需要流媒体服务器 如 fms wowza red5 的情况下从 Flash Actionscript 相机 即网络摄像头 保存 h 264 视频 我还想从麦克风获取样本数据 并在客户端对其进行转码 以便用户可以录制 h 264
  • 在数组/对象中查找项目的最快方法

    在 Javascript AS3 中查找列表或对象中项目的索引的最快方法是什么 我对这两种语言都提出这个要求 因为这两种语言的语法相似 假设 myArray one two three myObject one 1 two 2 three
  • as3 - 如何停止视频并分离 NetStream

    我有来自服务器的视频流 稍后我想并排添加另一个视频 那就好 我做到了 现在当我想删除视频时我的问题来了 我设法将其从显示中删除 但我可以听到视频仍在后台播放 那么我怎样才能停止播放该视频呢 这是我设置视频的代码 ns new NetStre
  • Flash AS3 -domain.com/crossdomain.xml 和安全错误

    在代码中 我在 URLLoader 之前使用它 swf 将与许多不同的域一起使用 并且这将及时更改 Security allowDomain In http domain com crossdomain xml http domain co
  • Javascript 通过ExternalInterface 来刷新

    我想知道是否有人可以查看我的代码 我正在尝试使用以下代码将虚拟变量从 javascript 传递到 actionscript 3 HTML
  • 使用 MP4 编码在 Flash 中流式传输网络摄像头视频

    我正在开发的 Flash 应用程序的功能之一是能够将网络摄像头流式传输给其他人 我们只是使用 Flash 中的内置网络摄像头支持并通过 FMS 发送它 有些人要求更高质量的视频 但我们已经在 Flash 中使用了最高质量设置 将质量设置为
  • Flex 4:状态改变事件

    Flex 4 中是否有任何事件可以用来检测状态更改 我知道这个问题已经很老了 但是通过谷歌搜索状态更改事件 我仍然到达这里 所以对于想知道的人 有一个StateChangeEvent CURRENT STATE CHANGE由组件调度的事件
  • ExternalInterface 是否适用于 file: 协议?

    任何人都可以确认ExternalInterface可以在file 协议 或者指向一些说不会的文档 开始看起来这行不通了 says 在两者之间的任一方向编写脚本 本地 HTML 文件和本地 SWF 文件 例如 使用 外部接口类 要求 HTML
  • 创建对象的弱引用

    Actionscript 3 中是否可以创建对对象的弱引用 以便可以对其进行垃圾收集 我正在创建一些类以使调试更容易 因此如果仅在此处引用这些对象 我不希望这些对象挂在内存中 当然我不想用回调填充代码以删除对象 格兰特 斯金纳 Grant
  • 在 Flex 中以 HTTP Post 方式上传任意数据

    我们目前有一个 Java 小程序 可以生成大量数据并将其上传到我们的服务器 我们拥有的上传方法之一是使用 HTTP POST 到我们的服务器 其内容只是原始数据 没有多部分编码或任何内容 我正在考虑实现一个具有相同功能的 Flex 应用程序
  • 如何使用 Rails 应用程序中的 s3 在存储桶之间复制文件?

    我目前正在开发一个 Rails 应用程序 尝试将视频从 s3 中的一个存储桶复制 移动到另一个存储桶 但是我在 Rails 应用程序上不断收到代理错误 502 在杂种日志中 它显示 无法分配内存 一旦发生此错误 应用程序就会终止 我们必须重
  • 垃圾收集最佳实践

    如果您要从显示列表中删除某个 MovieClip 并且该 MovieClip 又具有具有自己的事件侦听器的子 MovieClip 则是否有必要从子 MovieClip 中删除所有侦听器 或者只是直接从显示列表中删除的父级 MovieClip

随机推荐