나는 턴 순서에 의존하는 지역 게임을하고있다.스위프트 - 순서 관리를 어떻게 관리 할 수 있습니까?
규칙;
- 게임에서
phases
가 있습니다 : 각phase
동안 - (즉, 주문 판매), 플레이어는 다시 (모든 선수까지
- 각
phase
이 완료된 것으로 간주되지 않는 하나의 회전을한다 주문)이 완료되었습니다.
이 데이터를 관리하는 방법이 확실하지 않습니다. 추적해야 할 여러 가지가 있습니다.
- 모든 플레이어가 턴 순서의 끝에 도달 할 때 그래서 우리는 다음 단계로 이동할 수 있습니다 자신의 턴
- 을 완료하면 우리가 차례
- 에
- 현재 플레이어에있는 단계입니다. 모든 단계가 내가 구독 모델이에 가장 좋은 방법이라고 생각하고
완료되면 모든 재설정
현재 위상 자체가 완전하거나 불완전한 것으로 표시 될 수있는 유사한 시스템을 사용하고 있습니다.
이것은 스위프트 놀이터에서 현재 턴 순서와 단계를 처리하고있는 방식입니다.
// Turn order management
class TurnOrderManager: NSObject
{
static var instance = TurnOrderManager()
var turnOrder: [Player] = [Player]()
private var turnOrderIndex = 0
var current: Player {
return turnOrder[turnOrderIndex]
}
func next() {
if (self.turnOrderIndex < (self.turnOrder.count-1)) {
turnOrderIndex += 1
}
else {
print("Reached end of line")
}
}
}
class Player: NSObject {
var name: String = ""
override var description: String {
return self.name
}
init(name: String) {
super.init()
self.name = name
}
}
let p1:Player = Player.init(name: "Bob")
let p2:Player = Player.init(name: "Alex")
TurnOrderManager.instance.turnOrder = [p1,p2]
print (TurnOrderManager.instance.current)
TurnOrderManager.instance.next()
print (TurnOrderManager.instance.current)
TurnOrderManager.instance.next()
print (TurnOrderManager.instance.current)
// ---------------------------------
// Phase management
enum PhaseType: Int {
case buying = 1
case selling
}
struct Phase {
var id: PhaseType
var title: String
var completed: Bool = false {
didSet {
// Notify subscribers of completion
guard completed else { return }
handlers.forEach { $0(self) }
}
}
var description:String {
return "Phase: \(self.title), completed: \(completed)"
}
// Task queue
var handlers = [(Phase) -> Void]()
init(id: PhaseType, title: String, initialSubscription: @escaping (Phase) -> Void =
{_ in})
{
self.id = id
self.title = title
subscribe(completion: initialSubscription)
}
mutating func subscribe(completion: @escaping (Phase) -> Void) {
handlers.append(completion)
}
}
class MyParentController {
lazy var phase1: Phase = {
return Phase(id: .buying, title: "Phase #1") {
print("Do something with phase: \($0.title)")
}
}()
}
let controller = MyParentController()
controller.phase1.completed = true
질문 : 통지 꿔
:
- 전원을 켜고이 완료
- 모든 턴이 완료되었습니다 (다음 단계로 넘어갈 수 있도록)
TurnOrderManager가 현재 턴이 완료되었음을 PhaseManager에게 알리는 방법은 무엇입니까?
다음 단계로 이동하기 위해 모든 회전이 완료되면 PhaseManager에 알리는 방법.
내 검색어에 대한 자세한 내용을 사과드립니다.
많은 감사
이 말이 더 합리적입니다. 도와 주셔서 감사합니다. 구독 모델을 사용할 수 있다고 생각했습니다. 하지만 실제로 어떻게 작동하는지 이해하지 못합니다. 그러나 대표/프로토콜 방법이 나에게 의미가있는 것처럼 보이므로 확실히 새로운 놀이터 파일에서 시도해보고 처음부터 시작합니다. – zardon
문제 없습니다! NSNotifications (구독 모델)은 실제로 많은 객체와 통신해야하거나 시스템 알림 (예 : 키보드 알림)에 가입해야하는 경우에만 사용해야합니다. –