2013-01-15 103 views
1

我想用libgdx做一個簡單的遊戲。我堅持的一件事是讓敵人在特定時間產卵。如果我做類似在特定時間實例化類

if (t == 10) 
    new Enemy(); 

我可能會錯過這個特定時間或者可能產生兩次同一個敵人。我現在所擁有的是一樣的東西

float t = 0 
float timeElapsed = 0; 

update (float delta) { 
    timeElapsed += getDeltaTime(); 
    if (timeElapsed > 0.1) { 
     t++; 
     timeElapsed = 0; 
    } 
} 

這讓我在T秒十分之一的大致經過的時間,但它確實不覺得我應該這樣做的方式。

回答

1

我有一個解決方案,我用在我的遊戲中可能是有用的。其實,我創建了一個Timer類:

public class Timer 
{ 
    protected float remaining; 
    protected float interval; 

    public Timer(float interval) 
    { 
     this.interval = interval; 
     this.remaining = interval; 
    } 

    public boolean hasTimeElapsed() { return (remaining < 0.0F); } 

    public void reset() { remaining = interval; } 

    public void reset(float interval) { 
     this.interval = interval; 
     this.remaining = interval; 
    } 

    public void update(float delta) { remaining -= delta; } 
} 

你初始化定時器到一定的時間段,然後在您的更新(DELTA)方法,你在所有的計時器調用Timer.update(DELTA),然後檢查是否有任何的定時器已經通過調用Timer.hasTimeElapsed()。

就你而言,你只需要一個Timer對象,因爲敵人是按順序產生的。一旦你產生了一個敵人,你重置定時器(如果你想改變產卵期)並等待它再次消失。

您還可以修改Timer對象以使用主題觀察者模式以便在計時器關閉時觸發回調。如果您的邏輯需要知道何時發生定時事件,但此邏輯沒有直接訪問增量時間,這非常有用。

1

此外,如果你有一個緩慢的框架與例如。 getDeltaTime()= 0.2,敵人的產卵會延遲。

想到最簡單的方法是擺脫t - 直接比較timeElapsed,並跟蹤對象引用以知道是否產生了每個敵人。即。

if (enemy1 == NULL && elapsedTime > 10) { 
    enemy1 = new Enemy(); 
} 
if (enemy2 == NULL && elapsedTime > 30) { 
    enemy2 = new Enemy(); 
} 

對於一種更具可擴展性的方法,您可以創建一個產卵時間的鏈表,並且當您產生一個敵人時,就會推進列表指針。這樣你只需要每幀比較一次(當前列表節點的產生時間)。

附錄:在浮點數的上下文中使用==不是一個好主意。血淋淋的細節見http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

+0

謝謝,我以前試過這個解決方案。我認爲你談到的鏈表會是一個更好的方法,因爲我將會使用很多對象。我想我會有一個鏈接,有一個時間遞減,直到它達到零,然後移動到列表中的下一個元素。每個元素也會有一個同時產生的敵人列表,如果我需要延遲,它將是空白的。 – russjohnson09

+0

聽起來像一個很好的方法 - 你也可以通過讓一個行中的多個敵人與時間== 0保持一個列表。 另外請注意,你可能不得不改變你的實例化語義(例如,通過向敵人類添加.spawn()方法而不是在構造函數中產卵),因爲如果你想保留一個敵人列表,你需要在列表創建時實例化敵人(或使用某種工廠模式)。 – sqweek

+0

我實際上最終使用了一個鏈接列表,其中每個節點都是敵人和延遲。敵人被實例化並添加到鏈表中,但在到達之前不會變爲活動狀態。然後將它們存儲在一系列活躍的敵人中。這裏是[github](https://github.com/russjohnson09/bullethell)給任何可能感興趣的人。 – russjohnson09

0

爲什麼你增加t然後你根據t價值產生敵人。你爲什麼不這樣做?使用這種方法,當你的遊戲滯後,你得到三角洲可以說0.5f,你的步伐是0.1,你將創造5個敵人。我不知道你是否想要這樣的行爲