AS控制聲音教程

来源:互联网 发布:java迭代器使用 编辑:程序博客网 时间:2024/04/19 08:49

作者:Super-Tomato等  来源:闪吧

简单播放音乐

1. 首先打开新的Flash文件, 把声音导入库中 (还摸不清介面的朋友就按ctrl+r)

2. 导入之后到库中定义声音的ID, 如图:

按此在新窗口浏览图片

*** 这里的ID和场景上的实体名是不一样的 ***

3. 接下来就在第一帧编写代码, 如下

      mySound = new Sound();   //定义声音类
      mySound.attachSound("tomato");   //提取库中我们所设定的ID
      mySound.start();   //开始播放声音

4. 测试结果..http://www.flash8.net/bbs/UploadFile/2004-7/2004793811706.swf

音乐的开始, 停止和循环

   mySound.start([Secondsoffset], loop);

start当中的两个参数分别为Secondsoffset, Seconds就是秒数而offset就是抵消或取消的意思...所以简单的说就是取消开始播放,以秒数来计算... 没有定义的话就是0, 另外一个loop就是循环了...

   mySound.start(5, 99);

这个意思就是音乐从第5秒开始播放, 并循环99次, 这里提供了个例子为mySound.start(0,99);

http://www.flash8.net/bbs/UploadFile/2004-7/20047931838334.swf

mySound.stop();

   mySound.stop("tomato");   //如果new Sound没有定义的话就这样使用, 不然多个声音会全部停止

这个很简单不用解释了吧...就是停止音乐

我们看到某些网站所使用的一个按钮控制播放和停止的效果就是使用这些就可以达成了, 如:

   mySound = new Sound();
   mySound.attachSound("tomato");
   mySound.start(0,99);   //音乐开始播放并循环99次
   var music = true;  //定义一个变量记录目前音乐是否是在播放, 因为音乐已经播放所以设定为true
   btn.onRelease = function() {
      if(music) {   //当变量为true时就表示音乐是在播放
         mySound.stop();   //使用stop设定音乐停止
         music = false;   //变量记录false为音乐停止
      } else {   //以下的和以上相反
         mySound.start(0,99);
         music = true;
      }
   }

例子 :
点击浏览该文件

 

setPan 和 setVolume

    mySound.setPan(pan);

pan的值是介于 -100 到 100, 用意在于设定喇叭的平衡... -100为只能左边的喇叭听到声音, 100为右边的, 而0就是平衡点, 两个喇叭都能听到声音

例如:

    mySound = new Sound();
    mySound.attachSound("tomato");
    mySound.start(0, 10);
    var speaker = -100;   //变量设定为-100, 即是从左边喇叭开始

    mySound.setPan(speaker);   //设定喇叭平衡
    function pan() {   //设定函数并通过setInterval每秒调整平衡
        speaker += 20;   //每秒平衡偏移20
        mySound.setPan(speaker);  //设定喇叭的平衡

        if(speaker > 100) {   //当音乐完全偏移到右边喇叭播放的时候就停止
            mySound.stop();
            clearInterval(p);
        }


    }
    var p = setInterval(pan, 1000);  
//开始每秒执行喇叭平衡

例子:
点击浏览该文件

    mySound.setVolume(volume);

volume为0 - 100, 0为静音, 100为最大

例如 :

    mySound = new Sound();
    mySound.attachSound("tomato");
    mySound.start(0, 99);
    var top = key.vol._y;   //定义拖动按钮的最高点
    var left = right = key.vol._x;   //定义拖动左右的范围
    var bottom = key.vol._y+100;   //定义拖动按钮的最低点
    key.vol.onPress = function() {
        this.startDrag(true,left,top,right,bottom);   //按钮按下拖动范围
    }
    onEnterFrame = function() {
        v = int(key.textInput.value.text);   //取得输入框内的值
        mySound.setVolume(v);   //设定音量
    }

例子 :
点击浏览该文件


 


 

    Position, Duration 和 暂停

     mySound.position();

唯读指令, 主要是取得目前播放音乐的毫秒数(1秒 = 1000毫秒), 在音乐播放之后才能够取得, 在一开始start()之后使用是无法取得的

     mySound.duration();

唯读指令, 主要是取得音乐的总毫秒数 要使音乐暂停, 播放的时候再继续之前暂停的位置开始播放, 我们可以先取得按钮按下暂停时的position以取得位置, 然后再次按下播放的时候就使用start()当中的SecondsOffset使音乐从暂停的部分开始播放, 如:
 

    mySound = new Sound();
    mySound.attachSound("tomato");
    var SecondsOffset = 0;   //设定SecondsOffset为0
    p1.onRelease = function() {
        mySound.start(SecondsOffset, 0);   //播放按钮按下开始从0offset播放
    }
    p2.onRelease = function() {
        SecondsOffset = mySound.position/1000;   //暂停按钮按下时记录目前位置并换成秒数
        mySound.stop();   //音乐暂停
    }
    onEnterFrame = function() {   //这里是循环部分
        if(mySound.position == mySound.duration) {   //如果播放的毫秒数等于音乐总毫秒数
             mySound.start(0, 99);   //开始循环播放99次
        }
    }

 例子 :
点击浏览该文件


 

倒退 和 快速播放

只要会了以上的方法, 倒退播放和快速播放就非常简单了, 如下:

1. 场景上建立两个按钮, 分别为(倒退 rev 和 快速播放 ff)

2. 在第一帧使用以下代码 :

    mySound = new Sound();
    mySound.attachSound("tomato");
    mySound.start();
    var SecondsOffset = 0;
    var reverse = foward = false;   //设定倒退和前进变量为false
    onEnterFrame = function () {
        if (reverse && mySound.position > 0) {   //当倒退按下且音乐秒数大于0
            mySound.stop();   //音乐停止
            SecondsOffset -= .5;  //offset倒退0.5秒
            mySound.start(SecondsOffset, 0);   //音乐从倒退的0.5秒开始播放
        }
        if (foward && mySound.position <= mySound.duration) {   //当快速播放按下且音乐不为结束
            mySound.stop();
            SecondsOffset += .5;   //offset前进0.5秒
            mySound.start(SecondsOffset, 0);
        }
        rev.onPress = function() {   //当倒退按下并取得position
            SecondsOffset = mySound.position/1000;
            reverse = true;   //reverse变量为true
        };
        rev.onRelease = function() {   //当倒退放开就设定reverse变量为false
            reverse = false;
        }
        ff.onPress = function() {   //同上
            SecondsOffset = mySound.position/1000;
            foward = true;
        };
        ff.onRelease = function() {
            foward = false;
        }
    };



 

Preloader

至于loadSound部分顶上帖子已经有了, 所以这里不说明了... 所以我就写一下进度条的写法

1. 在场景上建立一个为100%长度的MC(loadBar)

2. 在第一帧使用以下代码 :

    onLoad = function () {
        mySound = new Sound();
        mySound.loadSound("tomato.mp3");   //载入同一目录中的MP3
        var percent = 0;   //%一开始为0
        loadBar._xscale = percent;   //进度条的宽度比例为percent
    };
    onEnterFrame = function () {
        mySoundBytesTotal = mySound.getBytesTotal();   //取得文件的size
        mySoundBytesLoaded = mySound.getBytesLoaded();   //取得目前文件所载入的size
        percent = int(mySoundBytesLoaded/mySoundBytesTotal*100);   //计算出文件所载入的比例
        loadBar._xscale = percent;   //设定进度条宽度比例
        if (percent>=100) {   //当完全载入之后
             delete onEnterFrame;   //删除循环
             mySound.start();   //音乐开始播放
        }
    };

 

 

********************************** 完毕 ************************************* 


 

Q1. 为何loadMovie当中的swf音乐无法播放?

ans:  只要在swf当中把  mySound = new Sound()  换成  mySound = new Sound(this) 就可以了    


 

Q2. 为何不能同时设定两首音乐不同的音量? ans: 一般你们会这样使用AS

    mySound1 = new Sound();
    mySound1.attachSound("tomato1");
    mySound1.start();
    mySound2 = new Sound();
    mySound2.attachSound("tomato2");
    mySound2.setVolume(50);  //另外一首音量为50
    mySound2.start();

但这样是错误的, 正确方法是分别把音乐分开在不同的层当中 :

    mySound1 = new Sound(this);
    mySound1.attachSound("tomato1");
    mySound1.start();
    createEmptyMovieClip("mc", 0);
    mySound2 = new Sound(mc);
    mySound2.attachSound("tomato2");
    mySound2.setVolume(50);
    mySound2.start();

 

 相信你已经看过了番茄的文章了,那样的话就省事多了。因为你已经知道了attach这个语法了。
好的下面开始。
setTransform方法用于设置声音对象的声音转换信息或是均衡信息,语法格式如下:
mySound.setTransform(soundTransformObject);
参数soundTransform(声音转换对象)是用Object对象构造函数方法创建的对象,他用有下面的一些参数,用以确定声音在左声道和右声道如何分配。
ll:指定左声道输入在左声道中播放的百分数(-100~100).
lr:指定左声道输入在右声道中播放的百分数(-100~100)。
rr:指定右声道输入在右声道中播放的百分数(-100~100)。
rl:指定右声道输入在左声道中播放的百分数(-100~100)。
立体声把声音输入均分到左右声道,并默认做以下转换:
ll=100;
lr=0;
rr=100;
rl=0;左声道在左声道播放所有的声音输入。默认做以下转换:
ll=100;
lr=100;
rr=0;
rl=0;
而右声道道理同上。
下面的例子使用Object对象的构造函数创建一个声音转化对象,这个对象设置在左声道播放左右声道两个声道的输入。
s=new Sound();
s.attach("idname");
s.start(1,3);
myObject=new Object();
myObject.ll=100;
myObject.lr=100;
myObject.rr=0;
myObject.rl=0;
s.setTransform(myObject);
效果相当于左声道播放。
这里只举一个例子。
(有点懒啊)
其实呢setTransform主要是用于专业人员设置音效的时候使用,而且立体声是单声道的双倍,所以如果没有特殊需要呢,一般不需要设置。而且如果使用setTransform,将会和setPan叠加,将会删除或是更新以前的设置。
限于上传的限制,今天无法做个例子来让大家看看。不过代码是无误的。我在同学的机子上试验过的。
大家只需要复制代码,然后导入声音文件,设置好链接就可以完成的。

如果有那位做好的话,可以传上来,当作是例子了阿。

 丹若注:我试着用一个按钮控制音乐的语句
从库中导入声音,并无限循环播放,点击按钮声音暂停,再次点击从上次播放暂停处播放。
语句有两种加法:

方法一,全加在时间轴上:

ms = new Sound();
//创建声音对象MS
ms.attachSound("ge");
//从库中加载歌曲GE到声音对象MS中
ms.start(3);
//从第3秒处开始播放歌曲
i = 0;
ms.onSoundComplete = function() {
//如果歌曲全部播放完
ms.start(3);
//从第3秒开始播放
};

bt.onPress = function ()
{
    i ++;
    if (i % 2 == 1)
     //如果i和2相除的余数为1
    {
        ms.stop();//暂停播放
    }
    else
    {
        ms.start(ms.position / 1000);
        //否则从暂停处重新播放
    }
};

方法二:

时间轴上的语句:

ms = new Sound();
//创建声音对象MS
ms.attachSound("ge");
//从库中加载歌曲GE到声音对象MS中
ms.start(3);
//从第3秒处开始播放歌曲
i = 0;
ms.onSoundComplete = function() {
//如果歌曲全部播放完
ms.start(3);
//从第3秒开始播放
};

按钮语句:
on (press) {
if (i == 0) {
  ms.stop();
  i = 1;
} else {
  ms.start(ms.position/1000);
  //如果i不等于0则从暂停处开始播放
  i = 0;
}
}

注:ge为库中歌曲的链接标识符

原创粉丝点击