iOS Swift SpriteKit:如何使子精灵节点的位置和动作与父精灵节点相同?
iOS Swift SpriteKit: How to make a child spritenode's position and movements to be the same as its parent spritenode?
我想用 "colored highlight" 实现一个 spritenode。 “突出显示可以有多种颜色。这是在沙盒应用程序中完成的以进行尝试。
我考虑过用SKTextures来表示节点的"highlight"。但是,使用这种方法,我将不得不上传一些必须是 "pre-attached" 的 "highlight" 文件到主机 spritenode png 文件。所以,如果我有 5 个 spritenode "host" png 文件和 5 个 "highlight" png 文件,那么我将总共有 5x5=25 个代表所有可能组合的 png 文件。准备和维护的文件太多了。
所以,我宁愿让 spritenode "host" 有一个子 spritenode,这是亮点。
host和highlight spritenode需要一起移动,highlight spritenode在"host" spritenode前面1个zPosition。所以,2个精灵节点的cgposition应该是一样的。
我为主机 spritenode 创建了一个 Class 文件。
class Host : SKSpriteNode {
var highlight = SKSpriteNode()
init(strPieceName : String) {
let texture = SKTexture(imageNamed: strPieceName)
super.init(texture: texture, color: UIColor.clear, size: texture.size())
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func addHighlight(withColour strColour : String) {
highlight = SKSpriteNode(imageNamed: strColour)
addChild(highlight)
}
}
在GameSceneclass中,我调用了touchesBegan
中的addHighlight函数
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for t in touches {
let cgPointTouched = t.location(in: self)
let skNodeTouched : SKNode = self.atPoint(cgPointTouched)
switch skNodeTouched.name {
case "Highlight":
host.highlight.position = skNodeTouched.position
host.highlight.anchorPoint = CGPoint(x: 0.5, y: 0.5)
host.highlight.size = CGSize(width: 0.2, height: 0.2)
host.highlight.alpha = 1
host.highlight.zPosition = 3
addChild(host.highlight)
}
}
}
这段代码的问题在于虽然高亮spritenode"follows"是host spritenode,但是highlight spritenode位置的屏幕显示并不是"on top"host spritenode。但奇怪的是,2个spritenode的cgposition是一样的
我认为它与 GameScene 和 Highlight class 的坐标系统不一样,但我不知道如何解决这个问题以及为什么会这样。
不确定你为什么要做所有这些复杂的事情,但你不应该接触这个位置。将其保留在 0,0,永远不要将其添加到场景中。而是将其留在 sprite 上,它会始终跟随您的 sprite。
当然,您始终可以使用 colorBlendFactor
将精灵颜色与纹理混合以创建高光
您的 class 应如下所示:
class Host : SKSpriteNode {
var highlight : SKSpriteNode!
func addHighlight(withColour strColour : String) {
highlight.removeFromParent()
highlight = SKSpriteNode(imageNamed: strColour)
//highlight.anchorPoint = CGPoint(x: 0.5, y: 0.5)
highlight.size = CGSize(width: 0.2, height: 0.2)
//highlight.alpha = 1
highlight.zPosition = 3
highlight.moveToParent(self)
}
}
无需添加与其他初始化完全相同的额外初始化
您的触摸代码应如下所示:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for t in touches {
let cgPointTouched = t.location(in: self)
let skNodeTouched : SKNode = self.atPoint(cgPointTouched)
switch skNodeTouched.name {
case "Highlight":
host.addHighlight(withColour:"whatevermycoloris")
}
}
}
当然,你总是可以通过这样做来避免额外的节点:
class Host : SKSpriteNode {
func addHighlight(withColour : UIColor) {
color = withColour
colorBlendFactor = 0.75 //Change this intensity to 1 to add more color
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for t in touches {
let cgPointTouched = t.location(in: self)
let skNodeTouched : SKNode = self.atPoint(cgPointTouched)
switch skNodeTouched.name {
case "Highlight":
host.addHighlight(withColour:UIColor.yellow)
}
}
}
我想用 "colored highlight" 实现一个 spritenode。 “突出显示可以有多种颜色。这是在沙盒应用程序中完成的以进行尝试。
我考虑过用SKTextures来表示节点的"highlight"。但是,使用这种方法,我将不得不上传一些必须是 "pre-attached" 的 "highlight" 文件到主机 spritenode png 文件。所以,如果我有 5 个 spritenode "host" png 文件和 5 个 "highlight" png 文件,那么我将总共有 5x5=25 个代表所有可能组合的 png 文件。准备和维护的文件太多了。
所以,我宁愿让 spritenode "host" 有一个子 spritenode,这是亮点。
host和highlight spritenode需要一起移动,highlight spritenode在"host" spritenode前面1个zPosition。所以,2个精灵节点的cgposition应该是一样的。
我为主机 spritenode 创建了一个 Class 文件。
class Host : SKSpriteNode {
var highlight = SKSpriteNode()
init(strPieceName : String) {
let texture = SKTexture(imageNamed: strPieceName)
super.init(texture: texture, color: UIColor.clear, size: texture.size())
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func addHighlight(withColour strColour : String) {
highlight = SKSpriteNode(imageNamed: strColour)
addChild(highlight)
}
}
在GameSceneclass中,我调用了touchesBegan
中的addHighlight函数override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for t in touches {
let cgPointTouched = t.location(in: self)
let skNodeTouched : SKNode = self.atPoint(cgPointTouched)
switch skNodeTouched.name {
case "Highlight":
host.highlight.position = skNodeTouched.position
host.highlight.anchorPoint = CGPoint(x: 0.5, y: 0.5)
host.highlight.size = CGSize(width: 0.2, height: 0.2)
host.highlight.alpha = 1
host.highlight.zPosition = 3
addChild(host.highlight)
}
}
}
这段代码的问题在于虽然高亮spritenode"follows"是host spritenode,但是highlight spritenode位置的屏幕显示并不是"on top"host spritenode。但奇怪的是,2个spritenode的cgposition是一样的
我认为它与 GameScene 和 Highlight class 的坐标系统不一样,但我不知道如何解决这个问题以及为什么会这样。
不确定你为什么要做所有这些复杂的事情,但你不应该接触这个位置。将其保留在 0,0,永远不要将其添加到场景中。而是将其留在 sprite 上,它会始终跟随您的 sprite。
当然,您始终可以使用 colorBlendFactor
将精灵颜色与纹理混合以创建高光
您的 class 应如下所示:
class Host : SKSpriteNode {
var highlight : SKSpriteNode!
func addHighlight(withColour strColour : String) {
highlight.removeFromParent()
highlight = SKSpriteNode(imageNamed: strColour)
//highlight.anchorPoint = CGPoint(x: 0.5, y: 0.5)
highlight.size = CGSize(width: 0.2, height: 0.2)
//highlight.alpha = 1
highlight.zPosition = 3
highlight.moveToParent(self)
}
}
无需添加与其他初始化完全相同的额外初始化
您的触摸代码应如下所示:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for t in touches {
let cgPointTouched = t.location(in: self)
let skNodeTouched : SKNode = self.atPoint(cgPointTouched)
switch skNodeTouched.name {
case "Highlight":
host.addHighlight(withColour:"whatevermycoloris")
}
}
}
当然,你总是可以通过这样做来避免额外的节点:
class Host : SKSpriteNode {
func addHighlight(withColour : UIColor) {
color = withColour
colorBlendFactor = 0.75 //Change this intensity to 1 to add more color
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for t in touches {
let cgPointTouched = t.location(in: self)
let skNodeTouched : SKNode = self.atPoint(cgPointTouched)
switch skNodeTouched.name {
case "Highlight":
host.addHighlight(withColour:UIColor.yellow)
}
}
}