背景:我正在研究一個合理的大型遊戲項目來提高我的面向對象技能。我一直在使用固體原理和搜索(實際上比我更多的代碼)。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);
}
}
這些答案有幫助嗎? – 2012-03-30 01:14:49