Только опираясь на то, что сказал @KnightOfDragon, я бы просто создать подкласс SKSpriteNode для каждого ключа. Таким образом, ваш код объективируется и красиво!
Существует так много, что можно сделать здесь, но я быстро взбивал его. У него нет всех букв, и он не знает, как обращаться с del, space, return, но я понял, что ваш код уже знал, что с ними делать.
Ключ класс использует протокол ниспослать какая клавиша была нажата, так что вам не придется беспокоиться о захвате каждой из ключевых областей в сцене
Так что я вошел в остальные ключи и добавлены некоторые заготовки варианты заполнения для интервала. Я не один и тот же шрифт, как вы, но это выглядит довольно круто
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()
}
}
Просто интересно, что если вы просто сделать «кадр» этих двух узлов же, как и другие этикетки, ваше прикосновение должно Работа. Чем меньше размеры рамок здесь? – Tushar
@Tushar - не уверен. Я узнаю. Я предполагаю, что нет (потому что маленькие ярлыки трудно прикоснуться), и хотя я просто увеличиваю размер, буквы будут больше. –
Они не увеличатся, если вы не установите более большой размер шрифта :), поэтому попробуйте установить для них поддающийся кадр. – Tushar