【发布时间】:2017-09-06 04:56:00
【问题描述】:
我真的对此很陌生,所以,如果有一些我不知何故错过的明显解决方案,我真的很抱歉,但是哦,好吧......
我正在制作游戏,我正在尝试制作角色选择菜单。每个角色都会有同一首歌曲的唯一版本(具有相同的 bps),因此当您“悬停”其中一个选项时,角色的歌曲会播放而其他歌曲会静音(不会暂停或停止,所以以免失去歌曲所有版本之间的同步)...
现在,我试图只为其中一首歌曲进行编程,然后在我弄清楚后重复其他歌曲的方法。
所以...
我究竟做错了什么?
代码如下:
package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.media.SoundTransform;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundMixer;
public class MainThing extends MovieClip {
private var soulcounting: Number = 1;
private var Muting: Boolean = false;
private var snd:Sound = new Sound();
public function MainThing() {
snd.load(new URLRequest("SOUL1.mp3"));
stage.addEventListener(Event.ENTER_FRAME, FrameHandler);
}
private function FrameHandler(event: Event): void {
if (Object(root).currentFrame == 2) {
var channel:SoundChannel = snd.play(0,1);
channel.soundTransform = new SoundTransform(1,0);
/*the soulcounting number is determined by a keyboard function...
I didn't deem it necessary to be included in here,
as I don't think it is part of the problem.*/
if (soulcounting == 1) {
Object(root).SOULS.gotoAndStop(1);
Muting = false;
}
if (soulcounting == 2) {
Object(root).SOULS.gotoAndStop(2);
Muting = true;
}
if (soulcounting == 3) {
Object(root).SOULS.gotoAndStop(3);
Muting = true;
}
if (soulcounting == 4) {
Object(root).SOULS.gotoAndStop(4);
Muting = true;
}
if (soulcounting == 5) {
Object(root).SOULS.gotoAndStop(5);
Muting = true;
}
if (soulcounting == 6) {
Object(root).SOULS.gotoAndStop(6);
Muting = true;
}
if(Muting){
setVolume(channel);
}
if(!Muting){
setVolume(channel, 1);
}
}
private function setVolume (Soundchannel:SoundChannel, volume:Number=0) {
var trans:SoundTransform = Soundchannel.soundTransform;
trans.volume = volume;
Soundchannel.soundTransform = trans;
}
}
}
(如果我尝试预览 swf,一切正常,直到我到达第二帧,其中输出开始重复 TypeError:错误 #1009:无法访问空对象引用的属性或方法。
在 MainThing/FrameHandler())
TypeError #1009 似乎是一个非常常见的错误,但我所阅读的内容并没有真正帮助我解决这个问题......对不起,如果这里已经有解决方案,我只是没有足够的搜索...... .
提前致谢!
【问题讨论】:
-
Object(root)应该是什么意思?如果是舞台上的某个 MovieClip,为什么不给那个 MC 一个 instance name,然后在代码中使用if (myMCName.currentFrame == 2)定位它? -
对象(根)是舞台。
-
规则 #1... 永远不要让舞台使用多个帧(对于卡通片可以,但对于应用程序则不行)。取而代之的是制作一个大(舞台大小)MovieClip 作为容器,然后将所有旧舞台帧剪切/粘贴到其中。如果您将容器称为(实例名称)为 contMC 那么您的代码可以说
if (contMC.currentFrame == 2)等... -
我仍然需要调用
Object(root).contMC,因为我正在使用 .as 文件。除非我添加指向 MovieClip 的链接,但这只会让它变得更加复杂,因为我必须使用addChild函数......我不知道在舞台上不使用多个帧(显示我的经验),它会导致性能问题吗? -
不,它避免了访问舞台项目和变量等问题。作为测试绘制一个小盒子形状(矩形,没有轮廓,只是填充颜色)然后右键单击并选择转换为 MClip。现在在 properties (ctrl+F3) 中只需将 box 放在实例名称部分。按 Enter 确认更改,然后按 ctrl+s 保存。将框 MC 拖到左侧作为起点.. 在您的函数
MainThing中输入代码box.x += 100.. 通过 ctrl+shift+enter 进行测试... 框是否移动到与放在舞台上不同的位置?跨度>
标签: actionscript-3 audio volume soundchannel