ゲームを作成しようとしていますが、銃のクラスでは、すべての弾丸をコンストラクタ オブジェクトにする必要があります。すべてのコンストラクタを一度に編集するにはどうすればよいですか? 各箇条書きの x 値を変更しますか?
質問する
4330 次
4 に答える
1
難しい推測をさせてください。
class Gun{
Bullet bullet;
public Gun(){
bullet = new Bullet();
}
}
class Bullet{
public int x=0;
public Bullet(){
x=10;
}
}
すべての Bullet の x 値を一度に変更したい (私が理解しているように)。次に、すべての Bullet インスタンスをデータ構造に保持する必要があります。
static List<Bullet> bullets = new ArrayList<Bullet>();
次に、以下のように Bullet のコンストラクタを更新します。
class Bullet{
public int x=0;
public Bullet(){
x=10;
Gun.bullets.add(this);
}
}
次に、箇条書きリストを繰り返し、必要な変更を行います。
for(Iterator i = bullets.iterator(); i.hasNext();){
i.next().x = 12;
}
お役に立てれば。
于 2012-06-23T02:14:12.437 に答える
0
コンストラクタの目的を誤解していると思います。コンストラクターは、クラスのインスタンスが作成されるときに呼び出され、通常、その単一のインスタンスのプロパティを初期化します。オブジェクトのすべてのインスタンスの値を変更したい場合は、参照を配列 (または他の同様のデータ構造) に格納してから、それらを反復処理して各値を個別に変更する必要があります。
于 2012-06-23T01:05:44.900 に答える
0
弾丸の繰り返しはありません。いいえ、いいえ、百万回、いいえ。 の値をカプセル化x
して、一度変更するだけで済みます。考えるべき設計パターンを示す簡単なコード例を次に示します。完全なアイデアについては、Google の「パブリッシュ/サブスクライブ パターン」または「オブザーバー パターン」を参照してください。
public class Bullet {
public static int globalEffect = 0;
private int myX;
public int x() {
return myX + globalEffect;
}
}
于 2012-06-23T02:19:36.170 に答える
-1
箇条書きを作成しながら収集し、コレクションを反復して更新します。たとえば、次のようなものです。
public abstract class Projectile {
private static final Collection<Projectile> activeProjectiles = new ArrayList<Projectile>();
static {
//update the position of any in-flight projectile approximately once per second
Runnable updater = new Runnable() {
public void run() {
while (true) {
synchronized(activeProjectiles) {
for (Projectile projectile : new ArrayList<Projectile>(activeProjectiles)) {
projectile.travel();
}
}
try {
Thread.sleep(1000);
}
catch (Throwable ignored) {}
}
}
};
new Thread(updater).start();
}
protected int x;
protected int transitTime;
public abstract int getMuzzleVelocity();
public Projectile() {
this.x = 0;
synchronized(activeProjectiles) {
activeProjectiles.add(this);
}
}
public int getFriction() {
return 0;
}
private void travel() {
this.x += this.getMuzzleVelocity() + (this.getFriction() * this.transitTime);
this.transitTime++;
if (this.transitTime * this.getFriction() >= this.getMuzzleVelocity()) {
//this projectile is done
synchronized(activeProjectiles) {
activeProjectiles.remove(this);
}
}
}
}
public class Bullet extends Projectile {
public Bullet() {
super();
}
@Override
public int getMuzzleVelocity() {
return 600;
}
@Override
public int getFriction() {
return 25;
}
}
于 2012-06-23T02:23:02.817 に答える