Вот учебник, использующий подобную сетку.https://www.raywenderlich.com/55-how-to-make-a-game-like-candy-crush-with-spritekit-and-swift-part-1
Сначала вы должны создать вспомогательный класс Array <2D> для своих фишек и шахмат.
struct Array2D<T> {
let columns: Int
let rows: Int
private var array: Array<T?>
init(columns: Int, rows: Int) {
self.columns = columns
self.rows = rows
array = Array<T?>(repeating: nil, count: rows*columns)
}
subscript(column: Int, row: Int) -> T? {
get {
return array[row*columns + column]
}
set {
array[row*columns + column] = newValue
}
}
}
Вы можете создать собственный класс Chess, например,
import SpriteKit
// MARK: - ChessType
enum ChessType: Int {
case unknown = 0, Horse, King, etc.
}
// MARK: - Chess
class Chess: CustomStringConvertible, Hashable {
func hash(into hasher: inout Hasher) {
hasher.combine(row)
hasher.combine(column)
}
static func ==(lhs: Cookie, rhs: Cookie) -> Bool {
return lhs.column == rhs.column && lhs.row == rhs.row
}
var description: String {
return "type:\(chessType) square:(\(column),\(row))"
}
var column: Int
var row: Int
let chessType: ChessType
var sprite: SKSpriteNode?
init(column: Int, row: Int, chessType: ChessType) {
self.column = column
self.row = row
self.chessType = chessType
}
}
Чтобы найти конкретную точку / плитку, вы можете использовать следующие вспомогательные методы в вашей игровой сцене:
private func pointFor(column: Int, row: Int) -> CGPoint {
return CGPoint(x: CGFloat(column) * tileWidth + tileWidth/2,
y: CGFloat(row) * tileHeight + tileHeight/2)
}
private func convertPoint(_ point: CGPoint) -> (success: Bool, column: Int, row: Int) {
if point.x >= 0 && point.x < CGFloat(numColumns) * tileWidth {
if point.y >= 0 && point.y < CGFloat(numRows) * tileHeight {
return (true, Int(point.x/tileWidth), Int(point.y/tileHeight))
}
}
return (false, 0, 0)
}