【问题标题】:How to keep both object and reference on stage with AS3?如何使用 AS3 将对象和引用保持在舞台上?
【发布时间】:2011-06-16 02:10:17
【问题描述】:

我有一些对象,它扩展了影片剪辑:

public class MyClass extends MovieClip { ... }

现在,我想把其中的两个放在舞台上:

var obj:MyClass = new MyClass();
addChild(obj);

这会放一个,但另一个我希望它与第一个完全相同,所以我只需要在舞台上添加 obj 的“引用”,以及 obj 本身。

最后,我希望两个 MyClass 类型的对象在舞台上做同样的事情。如果我尝试简单地做:

var obj2 = obj;
addChild(obj2);

只有 obj2 会出现在舞台上。

我如何通过引用实现这一目标? (为了节省内存和CPU时间(真的很重要))

提前致谢!

【问题讨论】:

    标签: actionscript-3 reference flash-cs5


    【解决方案1】:

    没有真正的好方法来做你想做的事。根据我的阅读,您希望舞台上有两个对象....但您希望他们在舞台上做同样的事情,所以您实际上只需要一个对象。

    按照设计,显示列表中的对象只有一个位置。如果您同时拥有多个位置,则需要两个对象。但是,还有另一种涉及 blitting 的方法,但您必须将框架放置到位......但是,您可以使用一个对象并将它们复制到舞台上的多个位置。如果这是你想走的路,有一个教程here.

    祝你好运。

    【讨论】:

      【解决方案2】:

      如果您要同时创建多个实例,只需使用 for 循环:

      var i:uint = 0;
      for(i; i<2; i++)
      {
          var t:MyClass = new MyClass();
      
          // properties of t
      
          addChild(t);
      }
      

      如果你想稍后再做,你可以尝试这样的事情:

      function getCopy(taget:MyClass, ...attrs):MyClass
      {
          var t:MyClass = new MyClass();
      
          var i:String;
          for each(i in attrs)
          {
              t[i] = target[i];
          }
      
          return t;
      }
      

      缺点是您必须指定要继承的属性。

      var m:MyClass = new MyClass();
      m.x = 10;
      m.y = 30;
      
      var b:MyClass = getCopy(m, "x", "y");
      
      trace(b.x, b.y); //output: 10, 30
      

      【讨论】:

      • +1 用于 getCopy 的有趣使用...但这实际上创建了另一个实例...我实际上希望舞台上的同一个对象位于两个不同的位置...但正如其他答案中提到的那样, 这是不可能的!谢谢!
      【解决方案3】:

      我知道这是一个旧线程,但我最近一直在努力做类似的事情,并找到了一些解决方法。

      正如这里所说,不可能创建单个实例的多个副本,但可以基于现有实例创建新实例。你可以写一个这样的函数:

      public function getClass(obj:Object):Class {
      
          return Object(obj).constructor;
      }
      

      ...然后像这样实现它:

      var seedImage:MovieClip = new SeedImageClass();
      
      var classRef:Class = getClass(seedImage);
      
      var copiedImage:MovieClip = new classRef();
      
      seedImage.x = seedImage.y = 200;
      copiedImage.x = copiedImage.y = 300;
      
      stage.addChild(seedImage);
      stage.addChild(copiedImage);
      

      ...SeedImageClass 将是您在 Flash 中的作品的 AS 链接标题。如果不是动画,最好使用 Sprite 而不是 MovieClip。

      getClass() 函数适用于任何类,而不仅仅是图像。

      但出于我的目的,这变得不必要了,因为我养成了将我可能想要的任何“种子图像”存储为类变量而不是 MovieClips 的习惯,然后从中实例化新副本。

      这是我正在开发的游戏中的一个简化示例:

      public class SoldierType {
      
          public var imageClass:Class;
      
          public function SoldierType(artReference:Class) {
      
              this.imageClass = artReference;
          }
      }
      
      public class Soldier {
      
          public var type:SoldierType;
          public var image:MovieClip;
      
          public function Soldier(typeReference:SoldierType, startX:Number, startY:Number) {            
      
              this.type = typeReference;
              this.image = new this.type.imageClass();   //where the magic happens
              this.image.x = startX;
              this.image.y = startY;
          }
      }
      

      ..它的实现方式(或多或少)是这样的,其中 art.BlueMarine 是到 Flash 符号的 AS 链接。

      var marineType:SoldierType = new SoldierType(art.BlueMarine);
      
      var marine01:Soldier = new Soldier(marineType, 200, 200);
      var marine02:Soldier = new Soldier(marineType, 300, 300);
      
      stage.addChild(marine01.image);
      stage.addChild(marine02.image);
      

      最后一部分的重点是,您可以重组代码以从类引用而不是实例化的 MovieClip 生成新实例,这将使您的代码运行得更快。如果没有,getClass() 函数可以做到。

      祝大家好运。

      【讨论】:

        【解决方案4】:

        你不能。您必须创建 2 个实例。

        【讨论】:

          【解决方案5】:

          简短回答:你不能,你需要两个实例。 Flash 无法在显示列表中的两个不同位置显示同一对象。
          长答案:可以使用 BitmapData 类获取相当于项目的“快照”——它实际上是创建时显示的任何内容的副本。它可以完成您的要求。

          【讨论】:

          • 性能实际上会提高,除非他对位图数据本身进行大量转换。为了显示相当静态的数据,位图数据画布尖叫。
          • 你知道吗,你是对的。不知道我在想什么,我什至看到它严重优化了性能。那好吧。修好了。
          【解决方案6】:

          这真的取决于你的对象是什么。如果您的要求是让多个对象在舞台上做完全相同的事情,那么提高性能的最佳方法是查看对象本身的设计,而不是试图逃避需要复制它们的事实。

          根据您的对象正在做什么,可能不需要复制您的类的方法,您可以只调用一个方法并将结果通过您的显示对象传播。

          【讨论】:

            【解决方案7】:

            您应该深度克隆您的 obj 以创建一个新实例 obj2

            或者创建一个像obj2这样的obj实例,在initialize中做同样的事情,然后将它添加到stage中。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-06-23
              • 2010-11-17
              • 2014-10-25
              • 2013-11-25
              • 2016-06-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多