2016-01-15 63 views
2

我還沒有找到任何好方法來設計面向協議的遊戲項目體系結構。如何以面向協議的方式創建我的遊戲架構?

繼承人的第一個版本對於結構:

protocol Usable { 
    func useItem() 
} 
protocol Item { 
    var name: String { get } 
    var amount: Int { get } 
    var image: String { get } 
} 
struct Sword: Item, Usable { 
    var name = "" 
    var amount = 0 
    var image = "" 
    func useItem() { 

    } 
} 
struct Shield: Item, Usable { 
    var name = "" 
    var amount = 0 
    var image = "" 
    func useItem() { 

    } 
} 

的問題,這是我要複製粘貼它們的代碼在多個項目有很多的變量。

繼承人的第二個版本帶類:

protocol Usable { 
    func useItem() 
} 
class BaseItem { 
    var name = "" 
    var amount = 0 
    var image = "" 
} 
class SwordClass: BaseItem, Usable { 
    func useItem() { 

    } 
} 

這看起來相當不錯,但問題是這些都是引用類型和我寧願他們是值類型。

解決此問題的正確方法是什麼?

+0

大概事情確實有不同的名稱,數量和圖像需要設置在某個地方?你有沒有考慮過使用擴展? – Wain

+0

我正在考慮解析一些JSON並動態設置名稱,圖像文件。在任何情況下,首次初始化時,金額始終爲0。協議擴展不會存儲價值屬性不幸的 – Esqarrouth

回答

1

您應該創建一個符合您的協議,並且需要使用默認值和「使用」封初始化一個泛型結構:

protocol Usable { 
    func useItem() 
} 
protocol Item { 
    var name: String { get } 
    var amount: Int { get } 
    var image: String { get } 
} 
struct UsableItem: Item, Usable { 
    var name = "" 
    var amount = 0 
    var image = "" 
    let use: (Void -> Void) 

    init(name: String, image: String, use: (Void -> Void)) { 
     self.name = name 
     self.image = image 
     self.use = use 
    } 

    func useItem() { 
     self.use() 
    } 
} 

那麼你的JSON處理將創建實例與適當的邏輯:

var sword = UsableItem(name: "sword", image: "sword") { 
    print("cut") 
} 
+0

我只有一個問題,如果某種類型的項目,讓我們說聖光的盾牌。當它受到損害時,它會對用戶或隨機事件進行治療。這個系統是一個很好的方法,但如果我想在未來自定義項目,它並不會真正起作用。你有什麼替代品嗎? – Esqarrouth

+1

這應該使用一些其他結構/類來處理,這些結構/類將關聯對象作爲參數並對它們進行操作。它也有自己的邏輯和數據,比如直接不適合作爲數據一部分的時間方面。 – Wain