Java,如何更改类中每个构造函数对象的值?

时间:2012-06-23 01:03:10

标签: java constructor

我正在尝试制作游戏,而对于枪类,我需要每个子弹都是构造函数对象,如何一次编辑每个构造函数?比如改变每个子弹的x值?

4 个答案:

答案 0 :(得分:1)

让我猜一想。

class Gun{
  Bullet bullet;
  public Gun(){
   bullet = new Bullet();
  }
}
class Bullet{
 public int x=0;
 public Bullet(){
   x=10;
 }
}

你想一次改变所有子弹的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;
}

希望这有帮助。

答案 1 :(得分:0)

我认为你误解了构造函数的用途。在创建类的实例时调用构造函数,并且通常初始化该单个实例的属性。如果要更改对象的所有实例的值,则必须将引用存储在数组(或其他类似的数据结构)中,然后迭代它们并单独更改每个值。

答案 2 :(得分:0)

没有子弹的迭代。不,不,一百万次,没有。 封装 x的值,因此您只需进行一次更改。这是一个简单的代码示例,说明了您应该考虑的设计模式。谷歌“发布 - 订阅模式”或“观察者模式”的完整想法。

public class Bullet {
    public static int globalEffect = 0;
    private int myX;
    public int x() { 
     return myX + globalEffect;
    }
}

答案 3 :(得分:-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;
    }
}