actionscript-3 - 判断一个 Sprite 是否靠近另一个 Sprite 的更快方法?

标签 actionscript-3 apache-flex flex4.5

当我的一个 sprite 被拖动(四处移动)时,我会循环浏览 Canvas 上的其他 sprite,检查它们是否在范围内,如果在范围内,我会在它们上设置背景光。这是我现在的做法:

//Sprite is made somewhere else
public var circle:Sprite;

//Array of 25 sprites
public var sprites:Array;

public function init():void {
    circle.addEventListener(MouseEvent.MOUSE_DOWN, startDrag);
}

private function startDrag(event:MouseEvent):void {
    stage.addEventListener(MouseEvent.MOUSE_MOVE, glowNearbySprites);
    stage.addEventListener(MouseEvent.MOUSE_UP, stopDrag);

    circle.startDrag();
}

private function stopDrag(event:MouseEvent):void {
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, glowNearbySprites);
    stage.removeEventListener(MouseEvent.MOUSE_UP, stopDrag);

    circle.stopDrag();
}

private function glowNearbySprites(event:MouseEvent):void {
    for (var i = 0; i < sprites.length; i++) {
        var tSprite = sprites.getItemAt(i) as Sprite;
        if (Math.abs(tSprite.x - circle.x) < 30 && 
                   Math.abs(tSprite.y - circle.y) < 30) { 
            tSprite.filters = [new GlowFilter(0xFFFFFF)];
        }
        else {
            tSprite.filters = null;
        }
    }
}

基本上,每次触发 MOUSE_MOVE 事件时,我都会循环遍历每个 Sprite 。这工作正常,但拖动 Sprite 时的延迟非常明显。有没有更高效、没有或更少延迟的方法来做到这一点?

最佳答案

嗯,根据您拥有的 sprite 数量的大小,这可能是微不足道的。但是,如果您要处理超过 1k 的 Sprite ——使用数据结构来帮助您减少检查量。看这个QuadTree Demo

基本上你必须为所有 Sprite 创建索引,这样你就不会检查所有 Sprite 。由于您的阈值为 30,因此当 Sprite 移动时,您可以将其放入 int(x/30)、int(y/30) 的行/列索引中。然后你可以只检查鼠标位置的行/列索引周围 9 列中存在的 Sprite 。

虽然这看起来更麻烦,但实际上如果你有更多的项目它会更有效率——即使你添加更多的 Sprite ,检查的数量也会保持一致。使用这种方法,我假设您可以运行 10k 个 Sprite 而不会出现任何问题。

其他性能优化包括:

  • 使用 Sprite 向量/数组而不是 getChildAt
  • 预增量 i (++i)
  • 存储一个静态单实例 glowfilter,因此它只是一个数组,而不是为所有 Sprite 创建一个单独的过滤器。
  • GlowFilter 非常占用 CPU。一次将所有 Sprite 绘制在一起,然后对其应用一次 GlowFilter 可能是有意义的——(这当然取决于你如何设置——甚至可能更麻烦地 blit 你自己的位图)。<
  • 让你的变量声明 var sprite:Sprite = ...。如果你不难输入它,它必须通过字符串而不是更快的 getlex 操作码来执行“过滤器”变量查找。

关于actionscript-3 - 判断一个 Sprite 是否靠近另一个 Sprite 的更快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11164007/

相关文章:

actionscript-3 - AS 3 游戏结束屏幕闪光倒计时器

ios - System.setClipboard不适用于iOS(AS3)

apache-flex - WebORB for Java 还是 BlazeDS?

android - 我应该使用哪个版本的 AIR 将我的应用程序移植到 Android?

actionscript-3 - 反编译、修改和编译 Flash 对象

actionscript-3 - 获取 ActionScript 中的当前帧。我应该引用什么实例?

ruby-on-rails - 从 Rails 到 Flex 的日期/时间转换问题?

apache-flex - 如何使用 Flex Spark 数据网格显示多行列标题?

apache-flex - 在边框容器周围放置一个滚动条

css - 组件状态的 Adob​​e Flex 设置样式