2012-06-23 46 views
0

我想製作遊戲和槍類,我需要每個子彈都是構造函數對象,我該如何編輯每個構造函數?像改變每個子彈的x值?Java,如何更改類中每個構造函數對象的值?

+3

你是什麼意思「構造對象」?你的真實意圖是什麼?我很確定你有一個解決方案,但它解決的問題是什麼? – Bohemian

+0

我的意思是一個對象的堅持,假設我創造了很多子彈,它們都在空中,我如何增加每個人的X值相對於X的值,因此x爲13的那個值爲14和一個值爲6將是7.我希望這是有道理的... – user1294270

回答

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; 
} 

希望這會有所幫助。

+0

非常感謝! – user1294270

+0

沒問題。如果您可以將此答案標記爲正確,那將是非常好的,因爲用戶很容易找到正確的答案。謝謝 – Chan

0

我想你是誤解了構造函數的目的。構造函數在創建類的實例時調用,並且通常會初始化該實例的屬性。如果要更改對象所有實例的值,則必須將引用存儲在數組(或其他類似的數據結構)中,然後遍歷它們並單獨更改每個值。

+0

難道他不說他想改變*所有* Bullet對象的'x'值?這只是初始化x。 – Bohemian

+0

你的意思是像一個多態陣列嗎? – user1294270

+0

@ user1294270可以啓發我們,究竟是多態陣列究竟是什麼。 – Shahzeb

0

沒有迭代子彈。不,不是,一百萬次,不是。 封裝價值x所以你只需要做一次改變。下面是一個簡單的代碼示例,說明您應該考慮的設計模式。谷歌的「發佈 - 訂閱模式」或「觀察者模式」爲完整的想法。

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

除了人們預計在不同時間發射的子彈將行進不同的距離(假設'x'是子彈的位置)。人們還期望不同槍支發射的子彈將具有不同的初始速度,並受到摩擦力的不同影響。這種方法不會支持任何這些方法。 – aroth

+0

@aroth - 那麼應該有私有變量的初始速度和摩擦係數以及一些數學運算在'x()'中。任何可以用迭代完成的事情都可以通過在訪問器中放置相同的效果來實現 – djechlin

-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; 
    } 
} 
相關問題