2012-03-23 49 views
3

背景:我正在研究一個合理的大型遊戲項目來提高我的面向對象技能。我一直在使用固體原理和搜索(實際上比我更多的代碼)。JavaSE:使用單一/靜態類來保存資源?或者是什麼?

問題:我一直在努力與資源(精靈,具體)。在fisrt的地方,我做了一個可以加載遊戲資源的類(基於一個字符串,該字符串指定了Spritesheet在jar文件中的位置),並允許全局訪問它。它基於靜態變量工作。然後我讀到,靜態變量對於OO設計是邪惡的,並且變成了單身。然後,我讀到單身人士是邪惡的,因爲我沒有找到任何其他選擇。我明白全局狀態會創建很多依賴關係(事實上,我已經在這個資源類的皮膚上感受到了它)。但是我沒有找到避免使用它的好方法。

問題:在問題的底部,您會看到我的資源類和精靈類的實現。每個需要做的類都有一個圖形解釋(怪物,玩家,瓦片,itens等等)取決於Sprite類。並且每個類都可以通過Resource類(它只在樣本中加載了兩個資源,但這是offtopic)訪問它。 S * o,最好的解決方案是什麼? *(我寧願如果你回答的概念,而不是給我的代碼:))

OBS:我幾乎有與瓷磚類型持有數據庫(見下面的代碼)相同的問題。 OBS2:在遊戲運行期間,數據庫和資源都不會改變。他們是「不變的」,我只會改變它們在編譯時添加新的tile /資源。 OBS2:我有一個想法可能是好的,但我不知道: - 創建精靈/資源的超類,然後爲我需要的每種類型的資源創建子類。我不認爲這個解決方案將解決耦合問題,並且它會將sprite實現分解爲不同的包。

public final class Resources { 

private static HashMap<String, Sprite> sprites = new HashMap<String, Sprite>(); 

static { 
    loadSprites(new SpriteSheet("spritesheets/spritesheettest.png")); 
} 

private static void loadSprites(SpriteSheet s) { 

    sprites.put("Grass1", s.getRawSprite(0, 0).recolor(Color.GREEN)); 
    sprites.put("Cave1", s.getRawSprite(0, 0).recolor(Color.GRAY)); 

} 

public static Sprite getSprite (String name) { 

    return sprites.get(name); 

} 

}

public final class Sprite { 

public static final int SIDE = 32; 
private static SpriteFilter spriteFilter; 
private static MySpriteRotator spriteRotator; 
private BufferedImage image; 

static { 

    spriteFilter = new MySpriteFilter(); 
    spriteRotator = new MySpriteRotator(); 

} 

public Sprite(BufferedImage img) { 

    image = img; 

} 

public Sprite rotate (double angle, BufferedImage sprite) { 


    return (spriteRotator.rotate(angle, this)); 

} 

public Sprite recolor(Color c) { 

    MySpriteFilter sf = new MySpriteFilter(); 
    return (spriteFilter.recolor(c, this)); 

} 

public void render(Graphics2D g, int x, int y) { 

    g.drawImage(image, x, y, null); 

} 

public BufferedImage getImage() { 
    return image; 
} 

}

public final class TileDataBase { 

private static HashMap<Integer, Tile> database = new HashMap<Integer, Tile>(); 
private static HashMap<Integer, Tile> rgbDatabase = new HashMap<Integer, Tile>(); 

private static final Tile grass = new MyTile(1, new Color(0, 255, 0), Resources.getSprite("Grass1")); 
private static final Tile cave = new AnimatedTile(2, new Color(127, 127, 127), Resources.getSprite("Cave1"), new Animator(new Sprite[] {Resources.getSprite("Grass1"), Resources.getSprite("Cave1")})); 

private TileDataBase() { 
} 

public static Tile getTileByID(int id, int x, int y) { 

    Tile t = database.get(id).cloneTile(); 
    if (t == null) { 

     try { 
      throw new Exception("No tile for such id"); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
    t.setX(x); 
    t.setY(y); 
    return t; 

} 

static Tile getTileByRGB(int rgb, int x, int y) { 

    Tile t = rgbDatabase.get(rgb).cloneTile(); 
    if (t == null) { 

     try { 
      throw new Exception("No tile for such rgb"); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
    t.setX(x * Sprite.SIDE); 
    t.setY(y * Sprite.SIDE); 
    return t; 

} 

static void putToDatabase(int id, Tile tile) { 

    database.put(id, tile); 

} 

static void putToRGBDatabase (Color c, Tile t) { 

    rgbDatabase.put(c.getRGB(), t); 

} 

}

+0

這些答案有幫助嗎? – 2012-03-30 01:14:49

回答

0

你有沒有考慮使用像springguice依賴注入框架?它可以將資源訪問器類注入到所有使用它的地方。在資源類下,資源類可以像單個實例一樣緩存實際的資源數據。但是你不會遭受單身人士或全球國家的「惡性」。您可以將資源類定義爲接口,並在單元測試中輕鬆地進行嘲諷。

+0

我想保持它純javaSE,但如果任何其他答案滿足這一要求,我可能會嘗試guice(我實際上已經搜索了春天,但它看起來像它主要是由javaEE程序員:)) ty爲您回答 – user1288851 2012-03-23 22:00:11

+0

依賴注入是一種在企業開發中非常普遍的模式,但並不侷限於此領域。你提到了SOLID:依賴倒置原則是DI所強調的問題。你可以在沒有任何框架的情況下實現它。只需通過構造函數或setter注入爲合作者配線即可。但是guice很好:-) – nansen 2012-03-23 23:58:51

0

普通的香草javase解決方案是傳遞參考資源類。通常,您的類將分爲兩類:1個更大或更少的實例,更小和多個實例。對於前者,通常通過引用Resources類來實例化它們(或者,該類可能已經引用了另一個引用Resources類的類)。對於後者,您通常會將Resources類作爲參數添加到可能需要它的方法上(這允許類很小並且沒有大量額外的引用)。

另外,我假設你會設置你的資源類,因此它有處理所有資源(例如,你可以從它得到的精靈和瓷磚)。

最後,您將在您的程序入口點(例如main方法)實例化您的Resources類,並將它傳遞給其他創建的頂級對象。

相關問題