2016-05-04 24 views
2

私は単純なゲームを作っています。 私は6つのボタンを持っていて、毎回異なる場所でシャッフルしたいと思っています。ボタンのランダムな位置を生成する

私はこれを達成するための簡単な方法を作りました。

private void changeButtonPlace(ImageView button) { 
    Random r = new Random(); 
    int newXloc = r.nextInt(getScreenWidth() - (2 * button.getLayoutParams().width)); 
    int newYloc = r.nextInt(getScreenHeight() - (3 * button.getLayoutParams().height)); 
    button.setX(newXloc); 
    button.setY(newYloc); 
} 

これはかなりうまくいきますが、ボタンがオーバーライドしてほぼ同じ位置にあることを意味します。私はそれぞれのボタンをユニークな場所に置いて、他のボタンに触れないようにしたい。

どのように私はこれを達成することができますか? ありがとうございます!

答えて

3

あなたが探しているのは衝突検出で、私の答えはこのプロセスを大幅に単純化します。私はより多くを学ぶために衝突検出アルゴリズムを検索することを提案する。

スーパーシンプルスタートの場合、2つのボックスの位置、長さ、高さを比較できます。私の例では、ボックスの原点は左上にあると仮定します。

if((boxA.xPos + boxA.length) < boxB.xPos || boxA.xPos > (boxB.xPos + boxB.length)) 

2つのボックスは、x軸に沿って接触しているかどうかをチェックし、我々は同様に今

if((boxA.yPos + boxA.height) < boxB.yPos || boxA.yPos > boxB.yPos + boxB.height) 

y軸の値を変更することができるが、これは非常に効率的ではありませんこれを行う方法。このロジックを単純化し、リソースを節約するためのより良い方法がたくさんあります。しかし、それは素早く汚れていて、6つのボタンだけを含む単純なゲームのような小さなアプリケーションには十分かもしれません。

ので、これら二つの式で、このような1つの方程式に一緒に、あなたはどちらかの巣彼らはその後、内部のあなたの衝突のコードを実行したり、したり、それら:

if(((boxA.yPos + boxA.height) < boxB.yPos || boxA.yPos > (boxB.yPos + boxB.height)) || ((boxA.xPos + boxA.length) < boxB.xPos || boxA.xPos > (boxB.xPos + boxB.length))) 

1のために読むことがたくさんありますあなたがちょうど始めるなら、それらを入れ子にして、方程式を通して論理の流れをよく見られるようにすることを提案します。しかし、将来のために、パフォーマンスのそれらのいくつかの余分なビットを絞る必要がある場合、またはそれらを一緒に1つのifステートメントが始まるために適切な場所です。

+0

非常に良い答え: –

+0

ありがとう、私はできるだけ詳細にしようとする – JakeGill70

+0

これは受け入れる必要があります。なぜOPはまだ確認されていないのですか? –

0

アカウントでボタンの幅を取り、彼らはちょうど交差するボタンをランダム化しなければ、

をプログラムの開発が容易であるべきで、場合、ボタンの位置を設定する前に、何のボタンはシンプルで交差していないことを確認する必要があり

編集:1,0 B:2,0 C:5、

を使用すると、それらはこれらの座標 Aと2D軸上に配置されている3つのボタンを想定していると仮定し、それが少し簡単にすることができます0 ボタンの幅:X = 2 Y = 2

一見するとこの例では、ボタンが交差していないように見えますが、Bに幅を追加すると、実際の位置はB [1,3]、[ - 1,1 ]は、座標がボタンの中心であると仮定して、C [4,6]、[ - 1,1]の実際の位置と交差する

最初[、]はX軸を表す[、]はY軸を表します したがって、チェックは次のようになります:

For each Button x 
    For each button x 
    calculate real coordinates of button x and y check intersection 
     if exists recalculate the coordinates and start the loop over 

このソリューションは、実行時間について話すときに少し高価ですが、一度あなたは何かを見つけるのが簡単になります。

+0

ご返信ありがとうございます!どのように私はそれを行うことができます任意のヘルプやアドバイスですか?私はどこかでRectを読んでいますが、どうやって使うのか分かりません。チェックについては、例えば、ボタン1のようなすべての可能な組み合わせをチェックする必要があると言っています。ボタン2,3,4,5,6と交差しません。 2ボタンと交差しないで3,4,5,6 – usrnvm43894

+0

私の編集希望を見てくださいそれはあなたに役立ちます – 2D3D

1

グリッドを作成する方法があります。画面上のランダムな場所の代わりに、グリッド上のランダムな点を使用します。そうすれば、現在のグリッド位置にボタンが既にあるかどうかを確認できます。

もっと散らばっているようにするには、各ボタンを配列に追加し、新しいボタンが他のボタンに触れないことを確認します。ランダムな場所を無期限にループし、配列内の他のボタンに当たらないことを確認するループをループします。新しい場所が見つかると、ボタンを追加して、無限ループから脱出します。

関連する問題