flash as3中如何在点击一个按钮后实现声音循环播放,说明思路,有代码说明最好
我这样写只能实现点击xuanhuanbf后循环播放一次,以后就不循环播放了//循环播放vargaibian:Boolean=false;this.addEventList...
我这样写只能实现点击xuanhuanbf后循环播放一次,以后就不循环播放了
//循环播放
var gaibian:Boolean=false;
this.addEventListener(Event.SOUND_COMPLETE,moshi);
function moshi(e:Event):void
{
if(gaibian==true)
{
_channel.stop();
_channel=_sound.play(0);
}
}
xunhuanbf.addEventListener(MouseEvent.CLICK,xunhuan);
function xunhuan(e:Event):void
{
_channel.addEventListener(Event.SOUND_COMPLETE,xh);
function xh(e:Event):void
{ gaibian=true;
_channel.stop();
_channel=_sound.play(0);
}
} 展开
//循环播放
var gaibian:Boolean=false;
this.addEventListener(Event.SOUND_COMPLETE,moshi);
function moshi(e:Event):void
{
if(gaibian==true)
{
_channel.stop();
_channel=_sound.play(0);
}
}
xunhuanbf.addEventListener(MouseEvent.CLICK,xunhuan);
function xunhuan(e:Event):void
{
_channel.addEventListener(Event.SOUND_COMPLETE,xh);
function xh(e:Event):void
{ gaibian=true;
_channel.stop();
_channel=_sound.play(0);
}
} 展开
3个回答
展开全部
,是做flash全站经常遇到的问题。
首先想给你说的是,加载外部flash影片并不是像你说的,主flash加载外部影片后就变成了另外那个flash,而是加载完后,主flash里面的一个mc变成了你加载的那个flash,也就是说将同时存在主flash与子flash。
如果需要加载其他的flash而把上一个加载的子flash去掉,你可以在主flash的同一个mc上加载其他flash,这时便替换掉了。
而当我们做flash整站的时候,因为需要背景音乐是一个独立的模块,一般情况下,flash音乐播放器是直接做在主flash场景中的。
如果你非要调用播放器,那么要将你加载音乐播放器的mc和加载子flash的mc弄成不同的mc
你的问题还有一个可能性,就是你的音乐播放器所在的mc所在的层存在空白帧。这时他也会出现重新播放的现象。所以,做的时候一定要注意:第一,将播放器(不论是外部加载还是直接做在主场景中)做成一个mc。第二,不能让播放器上的层断帧。一般情况下,做flash整站的时候,都保持主flash的主场景上只有一帧。其他所有的动画都做成mc,用代码控制每个mc的播放。
不明白继续问。
--------------------------------------
修改回答:
代码是没什么问题,但是我不明白你的这句话“每次回到主场景都是相当于再次载入主场景”,是怎么回事?这个具体说一下
如果你确实每次回到主场景都是相当于再次载入主场景,那么说明你的场景上的第一帧的代码在每次回到主场景上面又执行了一次?那么你说的这种情况是肯定会发生的!
要想办法让你的音乐播放器代码只执行一次。
补充:我们平时做flash全站的时候主flash是不可能卸载掉的,它会一直存在。我真的搞不懂你怎么会让主flsah重新加载了。
------------------------------------------------
再再次修改
我不知道我理解的是不是正确。你的主flash上面有一个空的mc,用来加载主flash,是这样吗。
如果是这样,你只需将你的音乐播放器代码写在正宗主flash上。所谓的主flash上没有音乐代码。
也就是说,flash1(正宗主flash)里面只有一个空mc,代码内容有音乐代码,判断加载主flash(flash2)的代码。而flash2不包含音乐代码。
首先想给你说的是,加载外部flash影片并不是像你说的,主flash加载外部影片后就变成了另外那个flash,而是加载完后,主flash里面的一个mc变成了你加载的那个flash,也就是说将同时存在主flash与子flash。
如果需要加载其他的flash而把上一个加载的子flash去掉,你可以在主flash的同一个mc上加载其他flash,这时便替换掉了。
而当我们做flash整站的时候,因为需要背景音乐是一个独立的模块,一般情况下,flash音乐播放器是直接做在主flash场景中的。
如果你非要调用播放器,那么要将你加载音乐播放器的mc和加载子flash的mc弄成不同的mc
你的问题还有一个可能性,就是你的音乐播放器所在的mc所在的层存在空白帧。这时他也会出现重新播放的现象。所以,做的时候一定要注意:第一,将播放器(不论是外部加载还是直接做在主场景中)做成一个mc。第二,不能让播放器上的层断帧。一般情况下,做flash整站的时候,都保持主flash的主场景上只有一帧。其他所有的动画都做成mc,用代码控制每个mc的播放。
不明白继续问。
--------------------------------------
修改回答:
代码是没什么问题,但是我不明白你的这句话“每次回到主场景都是相当于再次载入主场景”,是怎么回事?这个具体说一下
如果你确实每次回到主场景都是相当于再次载入主场景,那么说明你的场景上的第一帧的代码在每次回到主场景上面又执行了一次?那么你说的这种情况是肯定会发生的!
要想办法让你的音乐播放器代码只执行一次。
补充:我们平时做flash全站的时候主flash是不可能卸载掉的,它会一直存在。我真的搞不懂你怎么会让主flsah重新加载了。
------------------------------------------------
再再次修改
我不知道我理解的是不是正确。你的主flash上面有一个空的mc,用来加载主flash,是这样吗。
如果是这样,你只需将你的音乐播放器代码写在正宗主flash上。所谓的主flash上没有音乐代码。
也就是说,flash1(正宗主flash)里面只有一个空mc,代码内容有音乐代码,判断加载主flash(flash2)的代码。而flash2不包含音乐代码。
展开全部
这样:
var sound:Sound = new Sound( New URLRequest("xxx.mp3"));
var sc:SoundChannel = new SoundChannel();
sc = sound.play();
sc.addEventListener( Event.SOUND_COMPLETE , replayhandler );
//重复播放
function replayhandler( e:Event ){
sc.stop();
sc = sound.play(0);
sc.addEventListener( Event.SOUND_COMPLETE , replayhandler );
}
原理很简单,就是在声音播放完成的函数中再次添加该侦听器,这样就能不断地重复播放了。
哦 如果在你的代码基础上改的话 那就是:
function xh(e:Event):void
{
gaibian=true;
_channel.stop();
_channel=_sound.play(0);
_channel.addEventListener(Event.SOUND_COMPLETE,xh);//添加这句
}
}
var sound:Sound = new Sound( New URLRequest("xxx.mp3"));
var sc:SoundChannel = new SoundChannel();
sc = sound.play();
sc.addEventListener( Event.SOUND_COMPLETE , replayhandler );
//重复播放
function replayhandler( e:Event ){
sc.stop();
sc = sound.play(0);
sc.addEventListener( Event.SOUND_COMPLETE , replayhandler );
}
原理很简单,就是在声音播放完成的函数中再次添加该侦听器,这样就能不断地重复播放了。
哦 如果在你的代码基础上改的话 那就是:
function xh(e:Event):void
{
gaibian=true;
_channel.stop();
_channel=_sound.play(0);
_channel.addEventListener(Event.SOUND_COMPLETE,xh);//添加这句
}
}
追问
谢谢你的回答,我还有个问题您能帮我看下嘛?——你看我补充里面的代码,函数外部有一个变量gaibian。我想问的是,貌似用函数无法改变gaibian的值,要怎么做才能使得gaibian的值由false变为ture呢?如果我在函数里加一句return gaibian=true;能实现吗?
追答
音乐重播功能实现没有? 如果没有实现的话 那么改变不了gaibian的值那也是正常的!
恩 我按照你想要的结果帮你把代码稍稍地整理了一下,你再试试看吧!
var gaibian:Boolean = false;
//把this改成了_channel
_channel.addEventListener(Event.SOUND_COMPLETE,xh);
function xh( e )
{
_channel.stop();
//判断: 如果为true的话就循环播放
if( gaibian == true ){
_channel=_sound.play(0);
_channel.addEventListener(Event.SOUND_COMPLETE,xh);
}
}
xunhuanbf.addEventListener(MouseEvent.CLICK,xunhuan);
function xunhuan( e )
{
if( gaibian == true ){
gaibian = false;
}else{
gaibian = true;
}
}
如果还不行的话,请你继续补充问题,我会帮你解决的。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1楼的思路是对的,不过不要忘记把播放完之后的声道(SoundChannel)回收掉。按理说flashplayer是可以自动回收的。但是记住!所有拥有监听器的东东是永远无法回收的(内存溢出)。所以请这样修改
function xunhuan(e:Event):void
{
_channel.addEventListener(Event.SOUND_COMPLETE,xh);
function xh(e:Event):void
{ gaibian=true;
_channel.stop();
_channel.removeEventListener(Event.SOUND_COMPLETE,xh);
_channel=_sound.play(0);
_channel.addEventListener(Event.SOUND_COMPLETE,xh);
}
}
function xunhuan(e:Event):void
{
_channel.addEventListener(Event.SOUND_COMPLETE,xh);
function xh(e:Event):void
{ gaibian=true;
_channel.stop();
_channel.removeEventListener(Event.SOUND_COMPLETE,xh);
_channel=_sound.play(0);
_channel.addEventListener(Event.SOUND_COMPLETE,xh);
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询