Во-первых, вам нужно добавить распознаватель жестов для касания в ваш viewDidLoad, например:
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
myScnView.addGestureRecognizer(tapGesture)
Затем реализуйте функцию обработчика:
@objc
func handleTap(_ gestureRecognize: UIGestureRecognizer) {
// HERE YOU NEED TO DETECT THE TAP
// check what nodes are tapped
let location = gestureRecognize.location(in: myScnView)
let hitResults = myScnView.hitTest(location, options: [:])
// check that we clicked on at least one object
if hitResults.count > 0 {
// retrieved the first clicked object
let tappedPiece = hitResults[0].node
// HERE YOU CAN SHOW POSSIBLE MOVES
//Ex. showPossibleMoves(for: tappedPiece)
}
}
Теперь, чтобы показатьвозможные ходы, вам нужно идентифицировать все квадранты и положение вашего узла на шахматной доске.
Для этого вы можете назначить имя или номерили комбинация буквы и цифры, или, кроме того, комбинация цифр.(Я предлагаю комбинацию чисел, например строку 1, столбец 1, как матрицу).
давайте возьмем мое предложение, чтобы вы могли назвать каждый квадрант 1.1 1.2 ... 2.1 2.2 и так далее.
Теперь, чтобы определить, где находится ваша фигура, вы можете проверить контакт с PhysicsContactDelegate.
Теперь у вас есть tappedPiece и место, где он находится, поэтому вам нужно определить правило для фигурНапример:
let rules = ["tower":"cross"] //add the others
NB Вы можете выбрать, что вы хотите определить правила.
Давайте хорошо примем мое предложение,теперь вы должны создать функцию для выделения:
func highlight(quadrant: SCNNode){
quadrant.geometry?.firstMaterial?.emission.contents = UIColor.yellow
}
Наконец showPossibleMoves (for: tappedPiece) может быть чем-то таким:
func showPossibleMoves(for piece: SCNNode){
let pieceType = piece.name //You have to give the name as you did into your rules variable
//ex. if you have rules like ["tower":"cross"] you have to set all towers name to "tower"
let rule = rules[pieceType]
switch rule{
case "cross":
//you have to highlight all nodes on the right, left, above and bottom
// you can achieve this by selecting the start point and increase it
//assuming you named your quadrants like 1.1 1.2 or 11 12 13 ecc...
let startRow = Int(startQuadrant.name.first)
let startColumn = Int(startQuadrant.name.last)
//Now loop the highlight on right
for column in startColumn+1...MAX_COLUMN-1{
let quadrant = myScnView.scene.rootNode.childNode(withName:"\(startRow).\(column)" , recursively: true)
// call highlight function
highlight(quadrant: quadrant)
}
//Now loop for above quadrants
for row in startRow+1...MAX_ROW-1{
let quadrant = myScnView.scene.rootNode.childNode(withName:"\(row).\(startColumn)" , recursively: true)
// call highlight function
highlight(quadrant: quadrant)
}
//DO THE SAME FOR ALL DIRECTIONS
}
// ADD ALL CASES, like bishop movements "diagonals" and so on
}
ПРИМЕЧАНИЕ: В функции handlerTap вы должны проверить, что вы нажимаете, например, чтобы проверить, нажимаете ли вы на квадрант после выбора части(вы хотите переместить ваш кусок) вы можете проверить логическое значение и имя сеЛектированный узел
//assuming you have set the boolean value after selecting a piece
if pieceSelected && node.name != "tower"{
//HERE YOU CAN MOVE YOUR PIECE
}