我有以下代码:
if (i==0)
sprites[i].y = 0;
else
sprites[i].y = sprites[i-1].y + sprites[i-1].height; 每个Sprite可以有不同的高度。Sprite的高度可以根据用户的操作进行更改。
当一些精灵的高度发生变化时,我想相应地更新其他精灵的位置。
我正在寻找一个面向对象(也许是事件驱动)的解决方案。有什么想法吗?
谢谢
发布于 2009-09-16 20:21:43
如果你能很好地控制任何给定sprite的高度何时会改变,那么你可以使用一个自定义事件。设置将如下所示:
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字符串作为单独事件类中的常量,并从这两个类中访问它。
这对你来说仍然不是一个完美的解决方案-如果你愿意,你可以找出哪个sprite改变了它的高度,并且只重新计算它后面的sprite,这将使你的代码更有效率-但它胜过每次调用enterframe事件。
现在,如果你正在使用Flex,你会有更多的工具可供你使用-你可能会使用数据绑定来自动化几乎所有的这些,或者至少使用changed事件来自动为你分派事件,但这是无关紧要的!
发布于 2009-09-15 18:01:49
无法完全跟踪DisplayObject的x、y、width、height属性的更改...您可以重写访问器,但这仍然不能很好地工作...例如,一个对象可能会变得更大,因为添加了一个子对象,绘制了一些东西,完成了一些加载操作等等。
如果精灵的数量相当低(<200),你可以很容易地在enterframe上进行检查,而不会造成任何可测量的性能损失……不,这不是一个很好的方法,但它确实是最有效和最安全的做法……
祝你好运... ;)
https://stackoverflow.com/questions/1427816
复制相似问题