gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:32:41 26 4
gpt4 key购买 nike

当我的一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com