1

私はこのコードをあまりにも長い間見つめていたと思いますが、それを見ていません。私は小さなゲームを書いています。その一部は、いくつかのオブジェクト (現在は形状) を生成します。シェイプが作成されると、クラスによって定義されたオブジェクトとして ArrayList に追加されます。シェイプの数が増えると、シェイプが重なる可能性が高くなることに気付きました。これを修正したいと考えています。ArrayList 内の既存の各オブジェクトの Y 座標に対して Y 座標をチェックすることで、そうしようとしています。しかし、私の人生では、一意の Y 値を生成するまでチェック関数を繰り返し続ける方法を思い出せません。

私の最初の解決策は do...while ループですが、何らかの理由で true を返し続けます。

質問に不可欠な部分だけを残して、コードを少し単純化しました。私は何が欠けていますか?助けてくれてありがとう。

編集: また、ゲームの進行に合わせてオブジェクトが ArrayList に追加されたり、ArrayList から削除されたりすることにも注意してください。ゲーム中にオブジェクト (形状) が削除されるたびに、再生成されます。これは、ゲーム中に作成されるすべてのオブジェクトについて、既存のオブジェクトと照合する必要があることを意味します。

int x, y;
int numShapes = 10;
ArrayList<ShapeObject> soArray = new ArrayList<ShapeObject>();


private boolean checkY(int yy) {
  for(int i = 0; i < soArray.size(); i++) {
    if(soArray.get(i).oY == yy) {
      return true;
    }
  }
  return false;
}


public void makeShapes() {
  for(int i = 0; i < numShapes; i++) {
    if(soArray.size() < numShapes) {
      x = rand.nextInt(width - 45) + 45;

      do {
        y = rand.nextInt(height - 4) + 2;
      } while(checkY(y));

      soArray.add(new ShapeObject());
    }
  }
}

class ShapeObject {
  int oX = x;
  int oY = y;
}
4

2 に答える 2

1

クラスの構造を次のように変更してみてください

class ShapeObject {
   int oY = 0;
   int oX = 0;

   public ShapeObject(int x, int y)
   {
     oX = x;
     oY = y;
   }
}

それからあなたは持っています

soArray.add(new ShapeObject(x, y));

何か役に立つことを指摘できれば、私はまだあなたのコードを調べています。

また、試してみてください

if(soArray.get(i).oY == yy) {
    println(soArray.get(i).oY +' = '+ yy); //to debug
    return true;
}
于 2012-08-08T21:05:24.083 に答える
0

基本的に自分で問題を把握したので、回答として投稿しています。

キャンバスの境界によって制限されていることを忘れていたことがわかりました。私のセル サイズは 600px のグリッドで 12px です。ArrayList に 46 個のオブジェクトがあると失敗することに気付きました。したがって、基本的に利用可能なすべての Y 座標が取得されます。100 個のオブジェクトでテストしていたので、実行し続けました。

また、オブジェクトに使用できる行数と列数 (x 座標と y 座標) を完全に制御できるように、checkY() を checkXY() に変更しました。

于 2012-08-17T16:27:39.530 に答える