Esqarrouth
Esqarrouth

Reputation: 39201

How to create my game architecture in a protocol oriented way?

I haven't found any good ways to design a protocol oriented item architecture for games.

Heres the first version with Structs:

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() {

    }
}

The problem with this is I have to copy paste the variables which are A LOT of code across items.

Heres the second version with Classes:

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

    }
}

This looks pretty good, but the problem is these are reference types and I would prefer them to be value types.

What is the right way to solve this problem?

Upvotes: 2

Views: 155

Answers (1)

Wain
Wain

Reputation: 119031

You should create a generic struct which conforms to your protocols and which requires initialisation with default values and a 'use' closure:

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()
    }
}

Then your JSON processing would create instances with the appropriate logic:

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

Upvotes: 1

Related Questions