2010-04-12 160 views
3

我正在做一個小小的策略遊戲,以幫助我以有趣的方式學習Java。事情是我將這些單位視爲自己在遊戲地圖上繪製的對象(使用圖像和緩衝),並且會對附加在其上的偵聽器的鼠標動作做出反應。Java遊戲編程課程?

現在,基於我一直在閱讀的有關基本遊戲編程的一些教程,所有內容似乎都在我的Map類的Graphics方法中繪製。如果出現一個新的單元,我只需更新Map.Graphics方法,這並不像創建一個可以自己繪製的新Unit對象那麼簡單......在這種情況下,我會被困在一大堆Map方法中,而不是使用類來渲染新事物。

所以我的問題是,是否有可能使用渲染單元,接口對象等類,或者我將不得不創建方法,只做一些結構編程而不是面向對象?我有點困惑,我希望有一個關於如何組織的精神藍圖。

謝謝!

回答

1

正如CK說,你可以用繪製界面做到這一點,是這樣的:

public interface GameElement { 
    public void draw(Graphics g); 
} 

public class Sprite implements GameElement{ 
    private Image image; 
    private int x; 
    private int y; 
    public void draw(Graphics g) { 
       g.drawImage(image,x,y,null); 
    } 
} 

public class GameLoop { 

     public void drawElements(final Graphics2D g, final List<GameElement> elements) { 
       for (final GameElement gameElement : elements) { 
         gameElement.draw(g); 
       } 
     } 


} 

,但你說你想這樣做,有一個監聽器,可以讓你在未來的問題的方式。 正如破折號砰的聲音已經指出的那樣,所有的元素都在一個單獨的遊戲循環中渲染,所有的元素都已經被更新。如果你用一個監聽器來做這件事,並且你有一個遊戲循環或者其他線程修改單元列表,那麼你最終可以進行併發訪問修改。 此外,通過這種方式,您可以將所有元素繪製在一個點上,這樣可以避免遊戲中出現一些奇怪的閃爍現象。

4

聽起來像你的對象需要有一個共同的接口,他們都可以下載到渲染。

E.g.有一個你的接口類型的通用列表,用遊戲對象填充它,然後枚舉列表並調用通用方法來進行渲染。


這是C#代碼,但是當對象在列表中舉行了它應該是對Java

public interface IRenderable 
{ 
    void RenderMe(Graphics graphics) 
} 

List<IRenderable> myGameObjects; 

foreach (IRenderable myGameObject in myGameObjects) 
{ 
    myGameObject.RenderMe(myMap); 
} 

相似,它們可以對事件做出響應,並更新其內部狀態準備下一個渲染週期。

1

雖然「真實」的遊戲項目有許多形式,最終你有這樣的事情:

while True: 
    ProcessUserInput() 

    for o in objects: 
     o.Update() 

    for o in objects: 
     o.Render() 

使用任何機制找到親愛實現任何和所有的這些功能。 :)多態是好的,所以你應該隨時使用,如果你對此感到滿意。 「世界地圖」可能應該是列表中的第一項,除非您的渲染系統足夠先進以處理亂序繪圖(基本上是深度排序)。

從你的問題來看,這可能是單位屬於地圖?在這種情況下,Map.Render函數會遍歷它擁有的所有單元,並依次對它們中的每一個調用Render。無論如何,如果繪製單元的代碼在該單元的類中,它可能是最乾淨的。

祝你好運!