0

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

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

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

提前感谢您的帮助!

在此处输入图像描述

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

4

2 回答 2

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度),然后看看哪个更近,如果有则改变焦点是任何满足条件的剪辑。

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

于 2013-10-23T01:26:51.513 回答
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 的帮助。虽然我最终没有使用光线投射方法,但学习它的内容非常丰富。例如,我可以看到它在游戏中是如何变得超级强大的。

于 2013-11-07T01:42:17.380 回答