Sprite Kit игровой дизайн для игры в шахматы - PullRequest
2 голосов
/ 31 мая 2019

Я новичок в Swift и iOS, я планирую разработать игру для шахмат (китайские шахматы) в iOS, используя Sprite Kit. Я проводил мозговой штурм в разработке стратегий. У меня есть вопрос относительно создания шахматной доски и как движутся фигуры.

В отличие от шахмат, каждая фигура перемещается в точку пересечения, я вижу людей, которые делают шахматную доску, создавая каждую плитку как отдельный UIview, так как китайскую шахматную доску сложнее рисовать, я планировал просто использовать изображение доски как один узел, и каждая фигура просто перемещается на вершине доски. влево вправо вверх вниз путем расчета расстояния каждого квадрата. (например, деление ширины доски на 8, так как в строке 8 равных квадратов) Является ли это хорошей стратегией или есть лучший способ реализации. Я считаю, что этот способ не самый эффективный, поскольку, если устройство изменится, размер платы и фигур останется прежним?

enter image description here

Буду признателен, если кто-нибудь даст мне совет.

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Вот учебник, использующий подобную сетку.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)
  }
1 голос
/ 31 мая 2019

Я сделал именно такие вещи для порта классической игры «Погоня!». В моем случае фоновая графика не была статичной, так как при желании пользователь мог изменить макет платы.

По сути, все, что я делал, это использовал границы UIView и нашел наименьшее измерение, которое является узким направлением экрана. Затем я масштабировал сетку до этого размера и поместил ее в середину UIView.

Поскольку количество плиток в вашем случае фиксировано, легко рассчитать местоположение сетки для заданного местоположения экрана и наоборот.

Итак, чтобы ответить вам более прямо: «Да, это способ сделать это».

...