Flash AS3:在Movieclips中交换部件

时间:2015-02-26 05:53:46

标签: actionscript-3 flash swap movieclip graphic

我有一个大约10帧的Movieclip(1级,MC)。每帧上都有一个不同的动画片段(2级,Move Jump等动画)。在每个2级动画片段中,大约有30个动画片段符号(3级,头臂等),每个符号约100帧,大约30-50个关键帧。每个3级符号大约有10帧,每帧都有一个特定的皮肤图形。

我已经命名了所有2级和3级符号实例(同一个对象的时间轴上的标签相同),并且我有正确的帧stop();并贴上标签。我也明白,每当我输入一个不仅仅是1级而且是2级的新帧时,我必须将所有3级符号重置为所需的帧,因为我的先前设置将在离开帧时被销毁。

我通过做level1.gotoAndStop(level2name)--->来完成它。 level1.level2.level3.gotoAndStop(skintype)然后循环一个讨厌的令人讨厌的姿势X bodyparts。并且此过程需要在ENTER_FRAME事件中执行,因为所有内容都将重置。不用说,我真的不想这样做。

其中一个替代方案是打破图形,并且在我的1级MC动画片段中有许多2级构图动画片段(由战士第3次攻击击中法师,由第4次流氓攻击击中战士......)。这就是我以前做过的事情。但对于这个项目,一个简单的计算告诉我,我需要以这种方式制作200多个动画,这是不可行的。我也可以摆脱1级MC并将姿势保存到数组中,但是每个帧仍然需要刷新bodyparts。

我希望有一个相对快速的解决方案,我设法错过,因为它似乎是这样一个基本功能,我敢肯定许多Flash游戏将不得不通过它(打扮,或任何与定制+动画真的)。但不知何故,我一直在寻找几天,找不到治愈方法。作者时间简单地替换符号中的图形以替换整个文件中每个动画的每一帧的能力也表明,这些交换必须采用更通用的方法。我希望你能证明我是对的!

我确实有两件我不知道的事情,如果我甚至不想尝试:1)将MC拖到frame1(我唯一的框架)上,我目前只有代码。 2)单独声明每个bodypart并声明MC,然后将MC的部分链接到这些bodyparts。基本上,我只需要一种可行的方法来防止每次动画进入新帧时重置身体部分,我的flash知识不足以告诉我是否甚至可以让这些“全局图形库独立于帧”。 / p>

是的,我知道我可能不是以最干净的方式做到这一点,但我只是用视觉效果更好,所以虽然我可以从形状开始并使用严格的代码动画一切我真的想要远离它。艺术风格在这个项目中非常重要。

更新:现在,我选择了丑陋的路线。每当MC改变动画时,我都会这样做:

的MovieClip(的DisplayObjectContainer(MC.getChildByName(MC.move)))Hand.gotoAndStop(MC.skinname);

对所有35个身体部位重复一遍。事实证明,闪光灯取代了MC.move中的所有手部框架,这使得生活变得更加容易。另一种方法是轮询每一帧,但直接后果是fps更慢。相反,现在我只需要在移动发生变化时切换图形。

这有效,但我知道它会慢慢降低性能。实际上,它可以以与实际矢量渲染相同的幅度减慢性能。将交换限制为仅移动更改实际上不是可选的,而是强制性的。

1 个答案:

答案 0 :(得分:0)

请看这个:http://zdg.ru/tmp/animation.swf
来源可以在这里下载:http://zdg.ru/tmp/animation.fla

如果我的描述正确,我以同样的方式做了动画。主时间轴有一个带有字符符号的帧。字符符号在其中有一个时间轴,有两个动画点“stand”和“jump”。角色由符号“head”,“body”,“left_hand”,“right_hand”,“left_leg”,“right_leg”组成。这些符号中的每一个都是独立动画的。 Charater动画时间轴包含关键帧和补间。所有符号在所有帧中都是一致的。

每个角色部分的时间轴为2帧,对应于皮肤1和皮肤2。

正如您所看到的,在动画过程中不会破坏皮肤,也不需要在每一帧中对其进行修正。

主时间轴上的代码是:

var char_body_parts:Array = new Array(
    mv_char.body, mv_char.head, mv_char.left_hand, mv_char.right_hand,
    mv_char.left_leg, mv_char.right_leg
);

var skin_num:int = 1;

mv_char.gotoAndStop("stand");
setSkin(char_body_parts, skin_num);

btn_jump.addEventListener(MouseEvent.CLICK, doJump);
btn_skin.addEventListener(MouseEvent.CLICK, doSkin);

function doJump(evt:MouseEvent):void {
    mv_char.gotoAndPlay("jump");
}

function doSkin(evt:MouseEvent):void {
    skin_num++;
    if (skin_num > 2) skin_num = 1;
    setSkin(char_body_parts, skin_num);
}

function setSkin(parts:Array, skin_num:int):void {
    for (var i:int = 0; i < parts.length; i++) {
        (parts[i] as MovieClip).gotoAndStop(skin_num);
    }
}

==================更新====================
这是更新的动画:http://zdg.ru/tmp/animation3.swf
来源可以在这里下载:http://zdg.ru/tmp/animation3.fla
现在我的设置与你的设置相同。
我有一个2帧的字符,一个帧包含“stand”movieclip,另一个帧包含“jump”movieclip。 实际上,当你为任何动画gotoAndStop时,皮肤会丢失。但是你不必每帧都更新它们。您只需要在动画的第一帧中更新它们,即在gotoAndStop(“animation”)之后。我仍然有一个批量分配皮肤的身体部位列表,但现在可以按名称访问它们。所以主要的代码更改是:

var char_body_parts:Array = new Array(
    "body", "head", "left_hand", "right_hand",
    "left_leg", "right_leg"
);

function setSkin(char:MovieClip, parts:Array, skin_num:int):void {
    for (var i:int = 0; i < parts.length; i++) {
        char.mv_animation.getChildByName(parts[i]).gotoAndStop(skin_num);
    }
}

function setAnimation(char:MovieClip, anim_name:String):void {
    char.gotoAndStop(anim_name);
    setSkin(char, char_body_parts, skin_num);
}

还有两个解决方案,我没有对它们进行编码,但很容易描述它们。

  1. 在每个皮肤动画片段的第1帧中,添加gotoAndStop((root as MovieClip).skin_num)。它的工作方式如下:每当皮肤重置时,它从第1帧开始。在第1帧中,它会自动gotoAndStop到当前皮肤。所以你不需要做任何其他事情。

  2. 将动画动画片段放在时间轴中,但在同一帧中。将每个动画命名为“stand”,“jump”等。不是通过gotoAndStop切换动画,而是通过使选定的动画可见而其他动画不可见。每次皮肤更换都需要设置一次皮肤。