【问题标题】:as3 - How to make two movieclips share the same code?as3 - 如何使两个影片剪辑共享相同的代码?
【发布时间】:2015-12-19 13:35:29
【问题描述】:

我有四个影片剪辑(玩家、一只手臂、另一只手臂和武器),手臂放在玩家身上,武器放在手臂上。玩家应该有一只手臂显示在其下方。以及应该显示在它上面的武器和另一只手臂。

但是,我有两个手臂作为两个不同的电影剪辑,但它们都有相同的确切代码。如果我将两者都保存在同一个影片剪辑中,则两条手臂都将显示在播放器的顶部,或者都将显示在播放器的下方。而且您不能将一个影片剪辑分成两层。而且你不能让两个影片剪辑共享同一个类。

所以我想知道我是否可以让这两个手臂共享相同的代码而无需编写两次。

【问题讨论】:

  • 您希望双臂共享相同的代码(无需编写两次代码)?你问的是这个吗?
  • 你能更好地解释你的问题吗?我不明白这部分:“如何将这两个手臂粘在一起并使其不那么乏味”。
  • @BadFeelingAboutThis 是的,我就是这个意思。
  • @elchininet 是的,现在更新了。
  • 在 MovieClips 中编写代码不是一个好方法,我建议您使用外部类或最后一个选项,在根的单帧中编写代码。但如果您更喜欢以这种方式工作,请按照我在答案中的建议。

标签: actionscript-3


【解决方案1】:

最干净的方法是创建一个基类。你可以在你的 .fla 文件旁边创建一个PlayerArmBase.asfile,让它看起来像这样:

package {
    import flash.display.MovieClip;
    import flash.events.Event;

    public class PlayerArmBase extends MovieClip {
        public function PlayerArmBase(){
            //don't do anything until this item has been added to stage/timeline
            this.addEventListener(Event.ADDED_TO_STAGE, addedToStage, false,0,true);
        }

        protected function addedToStage(e:Event):void {
           //this is the equivalent of where timeline code runs
           //put your code here for your arms

           //for example:
           this.addEventListener(Event.ENTER_FRAME, enterFrame, false, 0, true);
        }

        protected function enterFrame(e:Event):void {
            //do something every frame tick like point to the mouse position
        }
    }
}

现在,你可以让你的双臂扩展这个基类。为此,请右键单击 flash pro 中的每个手臂,然后转到它们的属性。选中高级设置中的“Export For Actionscript”复选框,然后在“Base Class”字段中键入您的类的名称。

现在该类中的所有代码都将应用于两个 arm MovieClip。


或者,您可以将所有通用代码放在基类中,然后再创建 2 个类(每个分支一个),并在其中放置特定代码并让它们扩展基类。这与上图相同,只是在类字段中输入LeftArm,而不是基类字段。

package {
    import flash.events.Event;

    public class LeftArm extends PlayerArmBase {
        public function LeftArm(){

        }

        //we can override the addedToStage function from the base class
        override protected function addedToStage(e:Event):void {
            super.addedToStage(e); //call the base class version of this function

            //do stuff specific to the left arm
        }
    }
}

这样,您可以在自己的类中拥有特定于每个手臂的代码,但将所有通用代码放在一个位置。超类可以访问使用 public 或 protected 关键字声明的所有函数和变量。 protected 就像私有的,除了超类仍然可以访问它。 private 只能在你定义它的类中使用。

【讨论】:

  • 基类对我有用。谢谢。如果我想扩展基类,你能解释一下我需要做什么吗?错误 1152:继承定义存在冲突。它指向我在从基类扩展的类中的所有变量/导入。
  • 您能否发送您的类文件的 pastebin 链接(或类似链接)。该错误通常意味着您试图定义已经在基类中定义的东西。如果您在基类中将 var 或函数定义为 public 或 protected,那么您不必在扩展它的类中再次定义它。
【解决方案2】:

就像我在 cmets 中所说的那样,我不喜欢在 MovieClips 内编码,但如果您更喜欢以这种方式工作,请执行以下操作:

将代码放在空的MovieClip 中,然后将MovieClip 放在每个臂MovieClip 中,并创建一个引用父级的变量来执行您需要的转换。

Here你有一个例子

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多