0

私が取り組んでいるプロジェクトで状況に遭遇しました。私はそれに取り組む方法について洞察を得たいと思っています。基本的に、ユーザーがキーボードの矢印キーを使用してフォーカスを移動できるようにする AIR/AS3 アプリを作成しています。私が克服しようとしている問題は、クリップが動的に配置されるため、それらの位置が相互にどのようになるかを事前に把握していないことです。それに加えて、すべてのクリップは異なる形状とサイズを持っているため、奇妙さの一部は、たとえばグリッド上に位置をレイアウトしている場合、いくつかのクリップが複数の列または複数の行を占有することです.

したがって、目標は、すべてのクリップのサイズおよび/または位置を評価し、右、左、上、または下を押したときにクリップが最も近い隣人を知ることができる何らかの形式のマップを作成するロジックを持つことです。問題は、このようなことに取り組むための最良のアプローチは何ですか? 最終的には、移動するときに非常に自然に感じられるようにする必要があり、たとえばタブインデックスリストよりもはるかにインテリジェントである必要があります.

十分な情報が提供されていない場合はお知らせください。必要に応じて追加の情報を共有できます。そもそも物事を説明しようとして夢中になりたくなかっただけです。

助けてくれてありがとう!

ここに画像の説明を入力

参照イメージを使用して、ブロック「D」にフォーカスがあると仮定します。以下に提供されている@Pierのロジックを使用して、「UP」を押すと、ブロック「A」に移動するか、距離と角度が小さいためブロック「B」に移動するかがわかりますか? この場合、ユーザーはブロック「A」に行くことを期待すると思いますが、正しく理解すれば、コードはブロック「B」に評価されると思います。

4

2 に答える 2

1

2 つのクリップ間の距離と相対角度の計算は簡単です (単純な三角法)。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 に答える