动态焦点管理[AIR / AS3]

时间:2013-10-23 00:29:59

标签: actionscript-3 flash air focus

我遇到了一个我正在研究的项目的情况,我希望能够对如何解决这个问题有所了解。基本上我正在编写一个AIR / AS3应用程序,允许用户使用键盘上的箭头键移动焦点。我试图解决的问题是剪辑是动态放置的,所以我不知道他们的位置相对于彼此是什么。除此之外,所有剪辑都有不同的形状和大小,因此部分奇怪的是,如果你在网格上布置它们的位置,一些剪辑将占据多个列,或者多行。

因此,目标是建立一些评估所有剪辑大小和/或位置的逻辑,并创建某种形式的地图,允许剪辑在按下向右,向左,向上或向下时知道最近邻居是谁。问题是,解决这类问题的最佳方法是什么?我最终需要它在移动时感觉非常自然,并且比例如选项卡索引列表更加智能。

如果我没有提供足够的信息,请告诉我,我可以根据需要分享其他详细信息。只是不想疯狂地试图解释事情的开始。

提前感谢您的帮助!

enter image description here

使用参考图像,假设块“D”具有焦点。使用下面提供的逻辑@Pier's,如果我要按“UP”,它会知道要阻止“A”,还是会阻止“B”,因为它的距离和角度较小?在这种情况下,我认为用户会期望它会阻止“A”,但我认为如果我理解正确,代码会评估阻止“​​B”。

2 个答案:

答案 0 :(得分:1)

计算两个剪辑之间的距离和相对角度很容易(简单的三角法)。这里是计算2 x,y位置之间的距离和角度的函数。

    function angle(x1,y1,x2,y2):Number{
        return radToDeg(Math.atan2((y2 - y1),(x2 - x1)));
    }

    function radToDeg(angle:Number):Number{
        // to convert radians to degrees
        return angle * 180 / Math.PI;
    }

    function distance(x1,y1,x2,y2):Number{
        var dx:Number = x1 - x2;
        var dy:Number = y1 - y2;
        return Math.sqrt(dx * dx + dy * dy);
    }

知道这一点,只需查看用户按下的箭头。然后查看其他剪辑的角度和距离,并查看当前方向上有多少剪辑(例如:哪些剪辑的角度偏移小于+ -45度),然后查看哪一个更近,然后更改焦点是符合条件的任何剪辑。

我认为你不会在舞台上放置数百个剪辑,因为在这种情况下你应该只计算最近剪辑的角度。

答案 1 :(得分:0)

很抱歉延迟跟进,但我最终通过动态生成所有剪辑位置的网格图来解决我的问题,然后允许我在各个方向扫描以找到下一个剪辑获得焦点。这是基于我最初提供的示例图片的输出:

[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3]
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3]
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3]
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3]
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3]
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-,-,-,-,-,-,-,-,-,5,5,5,5,5,5,5,5,5]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-,-,-,-,-,-,-,-,-,5,5,5,5,5,5,5,5,5]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-,-,-,-,-,-,-,-,-,5,5,5,5,5,5,5,5,5]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-,-,-,-,-,-,-,-,-,5,5,5,5,5,5,5,5,5]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-,-,-,-,-,-,-,-,-,5,5,5,5,5,5,5,5,5]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-,-,-,-,-,-,-,-,-,5,5,5,5,5,5,5,5,5]

我必须调整网格大小以平衡性能与保真度,但它似乎在我需要它的各种场景中都很有效。

再次感谢@Pier的帮助。虽然我最终没有使用光线投射方法,但它是非常有用的信息。我可以看到在游戏中如何可以超级强大。