2

私はまだ Java に少し慣れていないので、オブジェクトの使用方法についてかなり混乱しています。私は知っている

object object = new object();

ただし、これらには手動でアクセスする必要があります。

パーティクル エフェクトを作成したいとします。小さな白い点が画面の中央に表示され、ランダムな角度で画面の端にゆっくりと移動します。彼らが近づくにつれて、彼らはより速く進みます。最後に、それらがビュー領域の外に出ると削除されます。

オブジェクトでこれを行うには、次のことができる必要があります。

  • オブジェクトを自動的に作成する
  • すべてのオブジェクトからデータ (X 座標と Y 座標) を収集して、レンダリングできるようにする
  • 速度を上げることができるように、オブジェクトをフレームごとに更新する
  • オブジェクトが範囲外に出たときにオブジェクトを破壊します。

存在するオブジェクトの数に関係なく、オブジェクトを自動的に作成/破棄し、それらすべてからデータを取り込むにはどうすればよいですか? 現在、私のゲーム (Java で作成したのは 1 つだけです) は、配列と一種のセルオートマトンの使用に制限されていますが、これはより大きなゲームでは機能しません。

これは以前に尋ねられたか、これに関するチュートリアルがあるかもしれませんが、私が見つけたのは手動でオブジェクトを作成することだけでした。私の探し方が悪かったのかもしれませんが、もしそうでしたら申し訳ありません。

4

3 に答える 3

2

Java では、オブジェクトを破棄しません。使用されていないオブジェクトを破棄するガベージ コレクターがあります。オブジェクトを保持する変数に null 値を代入するだけで十分です。

System.gc() によってガベージ コレクターを手動で呼び出すことができます。

于 2012-09-21T13:03:28.950 に答える
0

オブジェクトを自動的に作成する

回答:new newInstanceオブジェクトは常に Java で作成する必要があります。これはアルゴリズムに基づいています。例を挙げるだけです。オブジェクトを保持する 2 次元配列を持つことができ、X、Y 位置に基づいてオブジェクトをその配列に配置し、Random クラスを使用して X、Y 位置を生成できます。

例えば

    //Initialize pallete
    Point [][] pallete = Point int [800][600];
    //Generate Objects

    Random random = new Random();
    int x = random.nextInt(800);
    int y = random. nextInt(600);

    Point point = new Point(x,y);

    //Put inside Pallete

    pallete[point.x][point.y] = point;

すべてのオブジェクトからデータ (X 座標と Y 座標) を収集して、レンダリングできるようにする

回答:上記のように、Point [x, y] に対して宣言したように、必要なオブジェクトにプロパティを宣言します。

速度を上げることができるように、オブジェクトをフレームごとに更新する

回答:ループやタイマーなどを使用して生成速度を上げます。

オブジェクトが範囲外に出たときにオブジェクトを破壊します。

回答: null に初期化するだけで、GC されます。OutOfMemory の問題に直面した場合、それを解決する方法はいくつかありますが、必要がない限り、それに集中するべきではありません。

 point = null;//This is it.
于 2012-09-21T13:21:09.393 に答える
0

オブジェクトの作成

「オブジェクトを自動的に作成する」とはどういう意味かわかりませんが、これがコンストラクターの目的です。コンストラクターを定義すると、あらゆる種類の実装と初期化の詳細をそこに追加して、作成したい方法で変数を正確に作成できます。「クラスにコンストラクターを提供する」を参照してください。だから、あなたがポイントを持っていると言う...

public Point(int x, int y) {
    this.xPos = x;
    this.yPos = y;
    this.color = Color.BLUE;
    this.size = Constants.DEFAULT_POINT_SIZE;
    // ... etc.
}

オブジェクトからデータを収集する

これらのクラスでの情報の取得と設定は、ゲッターとセッター (アクセサーとミューテーターとも呼ばれます) によって実現されます。

public int getX() {
    return x;
}

public void setX(int x) {
    this.xPos = x;
}

存在するすべてのオブジェクトからデータを収集するには、存在するオブジェクトの数に関係なく、それらすべてListを何らかの種類の に追加するだけです。private static ArrayList<T>それらをコンストラクターの に追加しArrayList<T>、プログラムの別の部分がいくつあるかを「知る」必要なく、情報のために静的にアクセスすることもできます。

段階的な GUI の変更

フレームごとの変更を実装するにはいくつかの方法がありますが、私はTimerとを使用することを好みActionListenerます。これにより、フレームレートを設定し、public void actionPerformed(ActionEvent)メソッドで必要なアクションを実行できます。これは初心者にとってやや複雑なので、かなりの量の読み取りとテストを行う必要があります。開始するには、「アクション リスナーの作成方法」および「Swing タイマーの使用方法」を参照してください。

オブジェクトの破棄

Java には、C++ などの言語にあるようなデストラクタはありません。代わりに、定期的に (そして散発的に) 実行されるガベージ コレクターがあり、それらを指す参照がなくなったと見なされるすべてのオブジェクトを破棄します。したがって、オブジェクトが範囲外になったときにガベージ コレクターがオブジェクトを取得するようにするには、オブジェクトへのすべての参照をnullに割り当てるだけです。これによりオブジェクトがすぐに破棄されることはありませんが、次の実行時にガベージ コレクターによって確実に "タグ付け" されます。

前述のようにSystem.gc()、ガベージ コレクターを「呼び出す」メソッドです。ただし、これを呼び出すとガベージ コレクターが強制的に実行されるとは限りません。API では、この呼び出しは、ガベージ コレクターを実行する必要があることをシステムに「示唆する」と述べています。最終的には、信頼性が低く、ガベージ コレクションは通常、制御の範囲外です。

APIから:

gc メソッドを呼び出すということは、Java 仮想マシンが未使用のオブジェクトをリサイクルして、現在占有しているメモリをすばやく再利用できるようにすることを示唆しています。メソッド呼び出しから制御が戻ると、Java 仮想マシンは、破棄されたすべてのオブジェクトからスペースを再利用するために最善を尽くしています。

また、副次的なピックとして、オブジェクトを作成するときは必ずクラス名を大文字にしてください。:)

Object object = new Object();

OPの特定の目的のために:「存在するものすべてを描画する」ゲーム環境が心配な場合(したがって、ゲームが正しく実行されるようにするためにオブジェクトをすぐListに破棄したい場合)、 orSetを使用してそれを設定することを検討してください描きたいものが画面から消えたら削除します。


参考文献:

于 2012-09-21T13:19:07.943 に答える