我有以下代码:
if (i==0)
sprites[i].y = 0;
else
sprites[i].y = sprites[i-1].y + sprites[i-1].height;
每个精灵可以有不同的高度。精灵的高度可以改变用户动作。
当某些精灵的高度发生变化时,我想相应地更新其他精灵的位置。
我正在寻找面向对象(可能是事件驱动)的解决方案。有什么想法吗?
由于
答案 0 :(得分:2)
无法完全跟踪对x
的{{1}},y
,width
,height
属性的更改...您可以覆盖访问者但是,这仍然不会有用......例如,一个对象可能会变大,因为添加了一个孩子,绘制了一些东西,一些加载操作完成等等......
如果精灵的数量相当低(<200),你可以轻松地对enterframe进行检查,而不会有任何可衡量的性能损失......不,这不是一个非常好的方法,但它确实是最好的高效,安全的事情...
祝你好运......;)
答案 1 :(得分:1)
如果您可以很好地控制任何给定精灵的高度何时发生变化,那么您可以使用自定义事件。设置看起来像这样:
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,你可以使用更多的工具 - 你可以使用数据绑定来自动化几乎所有这些,或者至少使用已更改的事件为你自动发送事件,但这两者都不是在这里也没有!