【问题标题】:How to stick position of one Sprite to another?如何将一个 Sprite 的位置粘贴到另一个 Sprite 上?
【发布时间】:2009-09-15 15:15:19
【问题描述】:

我有以下代码:

if (i==0)
  sprites[i].y = 0;
else
  sprites[i].y = sprites[i-1].y + sprites[i-1].height; 

每个 Sprite 可以有不同的高度。 Sprite 的高度可以随用户操作而改变。

当某些精灵的高度发生变化时,我想相应地更新其他精灵的位置。

我正在寻找面向对象(可能是事件驱动)的解决方案。有什么想法吗?

谢谢

【问题讨论】:

    标签: flash actionscript-3


    【解决方案1】:

    没有办法完全跟踪对xywidthheight 属性的更改 DisplayObjects ...您可以覆盖访问器,但这仍然行不通...例如,一个对象可能会变大,因为添加了一个孩子,绘制了一些东西,完成了一些加载操作等等......

    如果精灵的数量相当低(

    那么祝你好运... ;)

    【讨论】:

    • 那太糟糕了,因为在 PHP 中我只会写: $sprites[i]->y &= $sprites[i-1]->y (如果我没记错的话)我想也许一些设计模式(观察者)实现了这个......
    【解决方案2】:

    如果您可以很好地控制任何给定精灵的高度何时发生变化,那么您可以使用自定义事件。设置如下所示:

    var UPDATED_EVENT:String = "updated";
    var i:int = 0;
    var count:int = sprites.length; // this is the length of your array
    
    for (i = 0; i < count; i++) {
      sprites[i].addEventListener(UPDATED_EVENT, calc);
    }
    
    function calc(e:Event = null):void {
    // here goes your positioning code
      for (i = 0; i < count; i++) {
        if (i==0)
          sprites[i].y = 0;
        else
          sprites[i].y = sprites[i-1].y + sprites[i-1].height;
      }
    }
    
    calc();
    

    然后,只要确保每当您更改其中一个精灵的高度时,您都会执行以下操作:

    mySprite.dispatchEvent(new Event(UPDATED_EVENT));
    

    如果您分布在多个类中(并且您可能应该如此),那么您可以将 UPDATED_EVENT 字符串设置为单独的事件类中的 const 并从两者中访问它。

    这对你来说仍然不是一个完美的解决方案 - 如果你愿意,你可以找出哪个精灵正在改变它的高度,并且只重新计算它之后的精灵,这将使你的代码更有效率 - 但它胜过调用每次都有一个 enterframe 事件。

    现在,如果您使用的是 Flex,您可以使用更多工具 - 您可以使用数据绑定来自动化几乎所有这些,或者至少使用更改的事件来自动为您分派事件,但这两者都不是这里也没有!

    【讨论】:

    • 1.试试function calc(e:Event = null) { var y:Number = 0; for each (var s:Sprite in sprites) y = (s.y = y) + s.height; }。它更快(没有数组访问)和更简洁。 2. 这并不总是更有效率。如果您的精灵变化很大(每帧多次),那么您将比需要更频繁地调用calc 并实例化比需要更多的事件。再加上这是非常不灵活的,因为任何访问这些精灵的代码都需要关心更新。这与 OO 概念完全相反。
    • 很酷的反馈,以及关于使用 for each 循环而不是数组访问的良好调用。就 OO 原则而言,你是对的——按照我的布局方式,你将进行一些紧密的耦合。您应该能够将其重构为更抽象的安排,但如果没有像 Flex 提供的 CHANGED 事件,您仍然会在每次发生变化时手动调度 UPDATED_EVENT。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多