在 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 上播放声音 的相关文章

  • 将过滤器应用于 AS3 中的所有内容

    我正在尝试在 AS3 Flex SDK 中添加过滤器 我可以为任何一个对象添加一个过滤器 但我想将过滤器应用到一切那是某个对象的子对象 假设弹出一个暂停窗口 暂停窗口下方的所有内容都会变得模糊 将过滤器应用于每个单独的对象 例如 迭代列表
  • 还有其他访问相机的替代方法吗?

    除了使用 ActionScript 3 之外 还有其他方法来访问相机吗 import flash media Camera videoInstance attachCamera cameraInstance 或者我应该使用任何 API 吗
  • Flex:获取自己的 SWF 文件名?

    有没有办法以编程方式确定我的类正在运行的 swf 文件名 Thanks Stage http livedocs adobe com flex 3 langref flash display Stage html has a 加载器信息 ht
  • Flash AS3 - 如何访问其他帧(也称为非一帧)中的显示对象

    只要该子项位于第一帧中 getChildByName name 就会起作用 其他框架中的显示对象还没有被实例化 所以并不是说不能访问它们 它们不存在可供访问的地方 当播放头进入具有特定对象的关键帧时 会创建该对象并将其添加到舞台中 当播放头
  • 如何从Flash/AS3找到用户Temp文件夹的路径?

    如何从 Flash AS3 找到用户临时文件夹的路径 例如 C Users lisnil AppData Local Temp 它需要在任何版本的 Windows 上运行 至少是 XP Vista 和 7 您无法通过 Flash 那样访问文
  • 在 Flash AS3 中捕获未处理的 IOErrorEvent

    错误 2044 未处理的 IOErrorEvent text 错误 2036 从不加载 完全的 这就是我每次尝试使用加载器加载不存在的图像时看到的情况 我正在获取 URL 列表 但无法验证它们是否指向任何有用的内容 每当遇到 404 时 它
  • 如何在flex中绘制虚线

    经过一番搜索和阅读 Graphics 类文档后 我找不到指定线条的线条样式的方法 我的意思是这条线是实线还是虚线 有人可以帮助我吗 Thanks 无论如何 您不能仅仅通过使用 Flex 库类 当然 你也可以自己做 这是一个实现它的类 根据找
  • 需要澄清应用程序域

    我需要对这个主题进行一些澄清 因为我刚刚遇到将 swf 加载到重用加载器对象中的问题 假设我有 3 个 SWF 主文件 swfchildA swfchildB swf Main swf 中有一个可重用的加载程序对象 myloader loa
  • 使用as3在第二帧上添加影片剪辑

    如何使用 AS3 类中调用的 addChild 在特定帧上添加影片剪辑 我的问题是如何访问特定的框架 谢谢 棘手的事情是处理帧 实时循环 我会这样做的方式是 添加事件监听器FRAME CONSTRUCTED http help adobe
  • 在 Actionscript 3 中实现单例模式类的最佳方法是什么?

    由于 AS3 不允许私有构造函数 因此构造单例并保证构造函数不是通过 new 显式创建的唯一方法是传递单个参数并检查它 我听说过两个建议 一个是检查调用者并确保它是静态 getInstance 另一个是在同一包命名空间中拥有一个私有 内部类
  • 检查用户的 Flash 播放器是否具有音频功能。 (功能.hasAudio)

    是否可以检查用户是否有声卡 我找到了 Capability hasAudio 但不知道这是否是我应该查看的值 trace Capabilities hasAudio 指定系统是否具有音频功能 此属性始终true 文档对此并不清楚 但我认为
  • 如何通过使用内置的 Date 类来节省时间?

    这个问题的目的是使用内置的 Date 类收集日期 时间计算的解决方案 而不是编写冗长的复杂函数 我会自己写一些答案 如果有人想出一些非常聪明的东西 我会接受答案 但这主要是作为解决方案的集合 因为我经常看到处理日期的代码过于复杂 请记住这是
  • 将应用程序状态保存在磁盘或其他位置,以便用户稍后访问它

    In 弹性构建器 4 5我正在做一个像这样的项目cacoo http www cacoo com 我想保存diagrams display object ui components text 在将应用程序关闭到应用程序之后我无法访问的某个地
  • 从 Air Native 扩展返回结构

    是否可以从本机代码返回结构 返回 int 或 boolean 相对简单 但是如何将更复杂的结构返回给动作脚本 您可以返回任何可以在本机代码中表示为 FREObject 的对象 这实际上包括任何 Actionscript 类或 Actions
  • 更改由 AS3 添加到舞台的影片剪辑中的动态文本字段不起作用?

    当我更改动态文本字段的文本值时 文本字段只是变为空白 而不显示新值 我有一个名为 game board 的 MovieClip 由 AS3 动态添加到舞台上 舞台一开始是空白的 我有另一个名为 stage 2 的 MovieClip 它作为
  • Flash 照片上传 - 从网络摄像头拍摄照片 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Flash Player 10 中打开 pdf

    我需要在 Flash Player 10 中打开 PDF 该 swf 不会在浏览器中运行 并且系统上不会有 adobe reader 程序 我需要知道是否可以在 Flash 播放器中打开 PDF 而无需以任何方式进行转换 我在谷歌上搜索了无
  • 如何从公共函数返回变量

    我试图摆脱在主时间线上使用代码 但我很难理解 as 文件和 fla 文件如何交互 例如 我试图弄清楚如何将变量从主时间线传递到公共函数 对该变量执行一些操作并将其传递回主时间线 我在框架上有一个输入文本框和一个带有侦听器的简单按钮 我希望能
  • 如何进行 Flex 日期扣除和添加

    在 Flex 中 我试图进行日期扣除和添加 但找不到方法 例如 公共 var dateNow Date new Date 如何获得比现在日期早 3 个月的日期 谢谢 您可以为此使用 Date 构造函数 Date 构造函数的第一个参数采用年份
  • 如何判断一个字符串是否包含特定子串

    给定一个字符串A 如何确定该字符串是否包含子字符串 video x flv A indexOf video x flv gt 0

随机推荐