让我设置舞台,因为发布所有内容的代码太多了:
我有一个Main.as正在设置我的SoundController.as所以我可以从任何其他类触发声音(SoundController.as具有根据需要调用所有声音所需的所有功能)
我有一个ControlPanel.as可以通过使用docRef.soundControl.laserFire或我想要的任何其他函数名来访问这些声音,在这种情况下,laserFire声音会触发一次。
所以这是我的问题。我想让这个激光音效完成播放才能发射另一个激光。所以在SoundController.as中我设置了以下几段代码:
private var _laserPlaying:Boolean = false;
internal function laserFire():void {
_sfxChannel = _laser.play(25);
_laserPlaying=true;
_sfxChannel.addEventListener(Event.SOUND_COMPLETE, laserFinished);
}
internal function laserFinished(event:Event):void {
_sfxChannel.removeEventListener(Event.SOUND_COMPLETE, laserFinished);
_laserPlaying=false;
}
public function get laserPlaying():Boolean {
return _laserPlaying;
}
public function set laserPlaying(value:Boolean):void {
_laserPlaying = value;
}
现在在我的ControlPanel类的enterFrameHandler函数中我想做一个
if (docRef.soundControl.laserPlaying()==false)
或其他类似的效果,以便我可以检查声音何时完成,并让玩家再次按下触发器来发射激光。到目前为止,我尝试过的任何变体或者给我一个错误(在这种情况下为1195;尝试访问无法访问的方法laserPlaying通过带有静态类型SoundController的引用)或者它实际编译但是在发射第一个激光镜头之后它永远不会允许再次按下触发器。所以我显然做错了什么,并希望有人可以提供帮助。
我要说明第一次激光声播放得很好,所以不要担心所有代码我都没有费心去展示这部分代码。但是,如果需要更多信息来了解我如何制作任何工作,请告诉我。并提前致谢!
答案 0 :(得分:0)
如果soundController和ControlPanel在Main中实例化:
在ControlPanel中处理触发事件,如下所示:
if(MovieClip(parent).soundController.soundChannel.position==0)
{
MovieClip(parent).soundController.laserfire();
}else{do nothing;}
当然使用正确的实例名称。
如果这不起作用,您必须使代码更容易理解。
答案 1 :(得分:0)
抱歉浪费每个人的时间。我最终搞清楚我需要做些什么来完成这项工作。这可能对其他人没有多大用处,因为我的设置可能是我的布局所独有的,而不是其他任何人会尝试的东西,但这是我所做的。
在我的ControlPanel.as中,我添加了以下代码:
private var _soundController:SoundController;
然后我有一个等待将ControlPanel添加到舞台的功能,一旦发生这种情况我就解雇了:
_soundController = new SoundController(docRef);
现在通过添加我能够简单地调用的那些:
if(!_soundController.laserPlaying) { do stuff; }
现在似乎等待laserPlaying为假,然后按预期继续前进。