0

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

4

4 回答 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因此您只需进行一次更改。这是一个简单的代码示例,说明了您应该考虑的设计模式。谷歌“发布-订阅模式”或“观察者模式”以获得完整的想法。

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 回答