2017-02-03 10 views
1

Я добавляю экран моей старой записи с высоким рейтингом в мою игру, в котором пользователи нажимают каждую букву, чтобы ввести свое имя.Сделать сенсорную область для SKLabelNode больше для маленьких символов

enter image description here

Каждая буква, символ или фразу («DEL», «SP» и т.д.) является одной SKLabelNode, и это очень трудно нажать на кнопку «» и «» символы и некоторые символы. Каждый кран обнаруживается с помощью обычного touchesBegan

Чтобы облегчить процесс задержания, я планирую разместить более крупный узел за каждой буквой и обновить touchesBegan, чтобы либо обнаружить прикосновение к самой этикетке, либо на этой другой этикетке, и в этом случае просто используйте дочерний узел для касания (который будет буквой или фразой).

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

+0

Просто интересно, что если вы просто сделать «кадр» этих двух узлов же, как и другие этикетки, ваше прикосновение должно Работа. Чем меньше размеры рамок здесь? – Tushar

+0

@Tushar - не уверен. Я узнаю. Я предполагаю, что нет (потому что маленькие ярлыки трудно прикоснуться), и хотя я просто увеличиваю размер, буквы будут больше. –

+0

Они не увеличатся, если вы не установите более большой размер шрифта :), поэтому попробуйте установить для них поддающийся кадр. – Tushar

ответ

1

Только опираясь на то, что сказал @KnightOfDragon, я бы просто создать подкласс SKSpriteNode для каждого ключа. Таким образом, ваш код объективируется и красиво!

Существует так много, что можно сделать здесь, но я быстро взбивал его. У него нет всех букв, и он не знает, как обращаться с del, space, return, но я понял, что ваш код уже знал, что с ними делать.

Ключ класс использует протокол ниспослать какая клавиша была нажата, так что вам не придется беспокоиться о захвате каждой из ключевых областей в сцене

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

enter image description here

import SpriteKit 

protocol KeyDelegate: NSObjectProtocol { 
    func keyWasPressed(sender: Key) 
} 

enum KeyType: Int { 

    case a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, comma, period, del, space, ret, dash, lb, rb, pound, exclaim, quest, filler, halfFiller 

    var height: CGFloat { 
     return 60 
    } 

    var width: CGFloat { 

     switch self { 
      case .del: return 150 
      case .space: return 180 
      case .ret: return 150 
      case .halfFiller: return 30 
      default: return 60 
     } 
    } 

    var keyValue: String { 

     switch self { 

      case .filler: return "" 
      default: return String(describing: self) 
     } 
    } 

    var keyText: String { 

     switch self { 

      case .del: return "DEL" 
      case .space: return "SP" 
      case .ret: return "ENT" 
      case .lb: return "(" 
      case .rb: return ")" 
      case .exclaim: return "!" 
      case .comma: return "," 
      case .period: return "." 
      case .dash: return "-" 
      case .pound: return "#" 
      case .quest: return "?" 
      case .filler, .halfFiller: return "" 

      default: return String(describing: self).uppercased() 
     } 
    } 

    var keyTextColor: SKColor { 

     switch self { 

      case .del, .space, .ret: return .red 
      case .lb, .rb, .exclaim, .dash, .pound, .quest: return .green 
      default: return .blue 
     } 
    } 

    var filler: Bool { 

     switch self { 
      case .filler, .halfFiller: return true 
      default: return false 
     } 
    } 
} 

class Key: SKSpriteNode { 

    var keyType: KeyType = .a 
    private var keyValue = "" 
    var keyText: String = "" 
    weak var keyDelegate: KeyDelegate! 

    init(keyType: KeyType) { 

     //let backgroundColor: SKColor = keyType.filler ? .clear : .red 

     super.init(texture: nil, color: .clear, size: CGSize.zero) 

     self.isUserInteractionEnabled = true 
     self.size = CGSize(width: keyType.width, height: keyType.height) 
     self.anchorPoint = CGPoint(x: 0, y: 0) 
     self.keyType = keyType 
     self.keyValue = keyType.keyValue 
     self.keyText = keyType.keyText 

     guard !keyType.filler else { return } 

//  let square = SKShapeNode(rectOf: size) 
//  square.strokeColor = .white 
//  square.position = CGPoint(x: self.size.width/2, y: self.size.height/2) 
//  square.zPosition = 1 
//  addChild(square) 

     let titleLabel = SKLabelNode(fontNamed: "04b_19") 
     titleLabel.fontColor = keyType.keyTextColor 
     titleLabel.fontSize = 56 
     titleLabel.horizontalAlignmentMode = .center 
     titleLabel.verticalAlignmentMode = SKLabelVerticalAlignmentMode.center 
     titleLabel.position = CGPoint(x: self.size.width/2, y: self.size.height/2) 
     titleLabel.zPosition = 10 
     titleLabel.text = self.keyText 
     self.addChild(titleLabel) 

    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func getKeyValue() -> String { 

     return self.keyValue 
    } 

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 

     guard !keyType.filler else { return } 

     self.keyDelegate.keyWasPressed(sender: self) 
    } 
} 



class GameScene: SKScene, KeyDelegate { 

    private var titleLabel = SKLabelNode() 

    override func didMove(to view: SKView) { 

     titleLabel.fontColor = .white 
     titleLabel.fontSize = 68 
     titleLabel.horizontalAlignmentMode = .left 
     titleLabel.verticalAlignmentMode = SKLabelVerticalAlignmentMode.baseline 
       titleLabel.position = CGPoint(x: 220, y: 800) 
     titleLabel.zPosition = 10 
     titleLabel.text = "" 
     self.addChild(titleLabel) 

     let keys: [[KeyType]] = [[.q, .w, .e, .r, .t, .y, .u, .i, .o, .p], 
          [.halfFiller, .a, .s, .d, .f, .g, .h, .j, .k, .l], 
          [.halfFiller, .filler, .z, .x, .c, .v, .b, .n, .m, .comma, .period], 
          [.del, .filler, .halfFiller, .space, .filler, .halfFiller, .ret], 
          [.filler, .filler, .dash, .lb, .rb, .pound, .exclaim, .quest]] 
     let padding: CGFloat = 8 
     let startPoint = CGPoint(x: 30, y: 700) 
     var xOffset: CGFloat = 0 
     var yOffset: CGFloat = 0 
     var keyHeight: CGFloat = 0 

     for row in keys { 

      for keyType in row { 

       print("keyType \(keyType)") 
       let key = Key(keyType: keyType) 
       key.position = CGPoint(x: startPoint.x + xOffset, y: startPoint.y + yOffset) 
       key.keyDelegate = self 
       addChild(key) 

       xOffset += key.keyType.width + padding 
       keyHeight = key.keyType.height 
      } 

      xOffset = 0 
      yOffset -= (keyHeight + padding) 
     } 
    } 

    //MARK:- KeyDelegate Func 

    func keyWasPressed(sender: Key) { 

     let text = titleLabel.text! 
     titleLabel.text = text + sender.getKeyValue() 
    }  
} 
+0

спасибо Рон - я проверю это и вернусь к вам. –

+0

Нет проблем. Возможно, вы сами это выяснили, но ключи не должны иметь границы вокруг них. Они могут в основном выглядеть как ваш макет, просто удалите узел формы из ключа init и изменив цвет super.init.clear –

+0

Я закончил добавлять сброс ключей, а также некоторые параметры интервала для клавиш и удалил цвет фона клавиш –

Смежные вопросы