Files
2020-10-02 13:51:18 +09:00

65 lines
1.6 KiB
Swift

//
// BoardManager.swift
// LifeGameApp
//
// Created by Yusuke Hosonuma on 2020/08/24.
//
import SwiftUI
import LifeGame
import Combine
// Important ✅
// このクラスのプロパティ`board`はアニメーション中に頻繁に更新されるため、本当に必要な箇所以外では`GameManager`を経由して処理すること。
final class BoardManager: ObservableObject {
static let shared = BoardManager()
@Published var board: LifeGameBoard = LifeGameBoard(size: 40)
private let setting = SettingEnvironment.shared
private var cancellables: [AnyCancellable] = []
init() {
setting.$boardSize
.dropFirst()
.sink { [weak self] size in
guard let self = self else { return }
self.board.changeBoardSize(to: size)
}
.store(in: &cancellables)
}
func setBoard(board: Board<Cell>) {
let newSize = (board.size <= self.board.size)
? self.board.size
: PresetSizes.first(where: { board.size < $0 }) ?? board.size // fail-safe
setting.boardSize = newSize
let newBoard = Board(size: newSize, cell: Cell.die).setBoard(toCenter: board)
self.board = LifeGameBoard(board: newBoard)
}
func setLifeGameBoard(board: LifeGameBoard) {
self.board = board
}
func next() {
board.next()
}
func clear() {
board.clear()
}
func generateRandom() {
board = LifeGameBoard.random(size: board.size)
}
func tapCell(x: Int, y: Int) {
board.toggle(x: x, y: y)
}
}