2013-12-11 126 views
1

我使用LibGDX爲你可能會關注的任何人,但是我試圖創建一個基本的太空射擊遊戲,玩家在其中圍繞使用WASD Keys,並面向鼠標位置(我已經完成了這個,耶; D)無論如何,我的問題是我無法弄清楚如何渲染子彈。更新和渲染子彈

這裏是我的子彈類

public class Bullet extends Entity 

{ 私人Vector2指定startPosition,targetPosition,位置;

private float rotation; 

private Sprite sprite; 

private SpriteBatch batch; 

public Bullet(Texture texture, Vector2 startPosition, float rotation, Vector2 targetPosition) 
{ 
    this.startPosition = startPosition; 
    this.targetPosition = targetPosition; 
    this.position = startPosition; 
    this.rotation = rotation; 
    this.sprite = new Sprite(texture); 
    this.batch = new SpriteBatch(); 
} 

public void update() 
{ 

} 

}

我試圖實現Runnable,做這樣的說法,但是你不能使用多線程,因爲它無法找到的OpenGL的實例或別的什麼東西。

這裏的目標是讓玩家在當時面對的方向射擊子彈。所以,我會創建一個新的子彈如下

new Bullet(new Texture("bullet.png"), new Vector2(getX(), getY()), getRotation(), new Vector2(mouseX(), mouseY()); 

我的問題是再次,呈現它。我不知道我在這裏做什麼。

回答

0

OpenGL對於它在多線程環境中的工作方式有一些限制。查看http://www.equalizergraphics.com/documentation/parallelOpenGLFAQ.html並選擇建議的解決方案之一。這裏

簡單的解決辦法是在一個單獨的線程做的一切。

某處在你的代碼應該是這樣的

while (!shouldExit) { 
    Update window stuff. 
    Read the state of the inputs. 
    Update the state of the scene. { 
    for (bullet : bullets) { bullet.move() } 
    } 
    Render everything once. { 
    for (bullet : bullets) { bullet.draw() } 
    } 
} 
+0

我試圖通過創建一個while(true)循環來處理子彈的所有邏輯和繪圖,這將停留在同一個線程上並允許我訪問OpenGL,但它會立即凍結應用程序。我試圖在循環中添加一個Thread.sleep(),但是這也沒有做任何事情,任何想法? –

+0

嘗試在項目符號上迭代一次,然後將控制權返回給應用程序的其餘部分,以使其不凍結。 – Sorin

+0

不完全確定如何去做這件事。我需要不斷更新子彈。我將要實施歸巢子彈等,所以我會經常需要做邏輯檢查。 也許我不理解你提供給我的信息,你能不能在僞顯示這個? –

0

你應該把創建子彈給一個變量或列表。然後在你的更新代碼中,你把它拿出來並且調用update,然後用一個精靈批處理來渲染它。 多線程渲染不應該用於小型或中型遊戲。儘量考慮並行,而不是平行。