合并 SKShapeNode 和 SKLabelNode
Merge SKShapeNode and SKLabelNode
我想合并一个 SKShapeNode 和一个 SKLabeNode 只做一个节点
这是我的"Bloque"class画了一个矩形并在上面添加了一个sklabelnodechild:
class Bloque : SKShapeNode
{
var color : String!
var numero : Int!
var type : Int!
var labelNumeroBloque : SKLabelNode!
init(type : Int, numero : Int, tailleBloque : CGSize)
{
super.init()
self.numero = numero
self.type = type
switch (type)
{
case 0: color = "#4aaddb"
default: color = "#ccc"
}
var rect = CGRect(origin: CGPoint(x: 0.5, y: 0.5), size: CGSize(width: tailleBloque.width, height: tailleBloque.height))
self.path = CGPathCreateWithRoundedRect(rect, 2.0, 2.0, nil)
self.fillColor = UIColor(rgba: color)
self.name = "\(numero)"
self.lineWidth = 0.0
self.zPosition = 200
labelNumeroBloque = SKLabelNode(text: String(numero))
labelNumeroBloque.position = CGPointMake(tailleBloque.width/2, tailleBloque.height/2)
labelNumeroBloque.verticalAlignmentMode = .Center
labelNumeroBloque.horizontalAlignmentMode = .Center
labelNumeroBloque.fontName = "ArialMT"
labelNumeroBloque.fontSize = 20
labelNumeroBloque.name = "\(numero)"
self.addChild(labelNumeroBloque)
}
required init?(coder aDecoder: NSCoder)
{
fatalError("init(coder:) has not been implemented")
}
}
使用该代码,当我点击彩色 space 时,它会起作用,但如果用户点击数字,它就不起作用。
看起来 SKShapeNode 和 SKlabelNode 不是一个完整的节点
这是 touchesBegan 函数:
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)
{
for touch in (touches as! Set<UITouch>)
{
let location = touch.locationInNode(self)
let cliqueNode = nodeAtPoint(location)
if let bloque = cliqueNode as? Bloque
{ // verifie que le bloque est du type Bloque
nb++
bloque.removeFromParent()
}
else
{ // mauvais bloque cliqué
println("Debug : mauvais bloque")
}
}
}
我想知道如何将两个 SKNode 合并为一个,所以当用户点击彩色区域或点击数字时它会起作用。
有人能帮我吗 ?
抱歉我的英语不好:/
您可能需要继承 SKLabelNode
,覆盖 func calculateAccumulatedFrame() -> CGRect
和 return 零大小 CGRect
。正在对标签进行 return 编辑,因为 func nodeAtPoint(_ p: CGPoint) -> SKNode
Returns 与点相交的最深后代。 并且它使用 calculateAccumulatedFrame()
来检查交叉点,所以通过 returning 零大小的矩形它不会相交因此 returning 你的 SKShapeNode
.
代码可能如下所示:
class SpecialLabelNode: SKLabelNode {
override func calculateAccumulatedFrame() -> CGRect {
return CGRectZero
}
}
class Bloque : SKShapeNode {
...
var labelNumeroBloque : SpecialLabelNode!
...
}
既然你让 Bloque 成为 SKShapeNode 的子class,而 SKShapeNode 是 SKNode 的子class,也许你可以设置 userInteractionEnabled 属性 的 Bloque 实例为真。然后你可以直接在class Bloque里面写touchesBegan touchesEnd函数。这样您就不必计算触摸是否在区域内。这些功能只会在 Bloque 实例的区域内触发。
我想合并一个 SKShapeNode 和一个 SKLabeNode 只做一个节点
这是我的"Bloque"class画了一个矩形并在上面添加了一个sklabelnodechild:
class Bloque : SKShapeNode
{
var color : String!
var numero : Int!
var type : Int!
var labelNumeroBloque : SKLabelNode!
init(type : Int, numero : Int, tailleBloque : CGSize)
{
super.init()
self.numero = numero
self.type = type
switch (type)
{
case 0: color = "#4aaddb"
default: color = "#ccc"
}
var rect = CGRect(origin: CGPoint(x: 0.5, y: 0.5), size: CGSize(width: tailleBloque.width, height: tailleBloque.height))
self.path = CGPathCreateWithRoundedRect(rect, 2.0, 2.0, nil)
self.fillColor = UIColor(rgba: color)
self.name = "\(numero)"
self.lineWidth = 0.0
self.zPosition = 200
labelNumeroBloque = SKLabelNode(text: String(numero))
labelNumeroBloque.position = CGPointMake(tailleBloque.width/2, tailleBloque.height/2)
labelNumeroBloque.verticalAlignmentMode = .Center
labelNumeroBloque.horizontalAlignmentMode = .Center
labelNumeroBloque.fontName = "ArialMT"
labelNumeroBloque.fontSize = 20
labelNumeroBloque.name = "\(numero)"
self.addChild(labelNumeroBloque)
}
required init?(coder aDecoder: NSCoder)
{
fatalError("init(coder:) has not been implemented")
}
}
使用该代码,当我点击彩色 space 时,它会起作用,但如果用户点击数字,它就不起作用。 看起来 SKShapeNode 和 SKlabelNode 不是一个完整的节点
这是 touchesBegan 函数:
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)
{
for touch in (touches as! Set<UITouch>)
{
let location = touch.locationInNode(self)
let cliqueNode = nodeAtPoint(location)
if let bloque = cliqueNode as? Bloque
{ // verifie que le bloque est du type Bloque
nb++
bloque.removeFromParent()
}
else
{ // mauvais bloque cliqué
println("Debug : mauvais bloque")
}
}
}
我想知道如何将两个 SKNode 合并为一个,所以当用户点击彩色区域或点击数字时它会起作用。 有人能帮我吗 ? 抱歉我的英语不好:/
您可能需要继承 SKLabelNode
,覆盖 func calculateAccumulatedFrame() -> CGRect
和 return 零大小 CGRect
。正在对标签进行 return 编辑,因为 func nodeAtPoint(_ p: CGPoint) -> SKNode
Returns 与点相交的最深后代。 并且它使用 calculateAccumulatedFrame()
来检查交叉点,所以通过 returning 零大小的矩形它不会相交因此 returning 你的 SKShapeNode
.
代码可能如下所示:
class SpecialLabelNode: SKLabelNode {
override func calculateAccumulatedFrame() -> CGRect {
return CGRectZero
}
}
class Bloque : SKShapeNode {
...
var labelNumeroBloque : SpecialLabelNode!
...
}
既然你让 Bloque 成为 SKShapeNode 的子class,而 SKShapeNode 是 SKNode 的子class,也许你可以设置 userInteractionEnabled 属性 的 Bloque 实例为真。然后你可以直接在class Bloque里面写touchesBegan touchesEnd函数。这样您就不必计算触摸是否在区域内。这些功能只会在 Bloque 实例的区域内触发。