我想实现一个带有“彩色突出显示”的spritenode。 “突出显示可以有多种颜色。这是在沙盒应用中完成的,可以尝试一下。
我已经考虑过使用SKTextures来表示节点的“突出显示”。但是,使用这种方法,我将必须将许多“突出显示”文件上传到主机spritenode png文件中,这些文件必须“预先附加”。因此,如果我有5个spritenode“主机” png文件和5个“高亮” png文件,那么我将总共拥有5x5 = 25 png文件,这些文件代表所有可能的组合。那将是太多文件无法准备和维护的方式。
因此,我宁愿使spritenode“主机”有一个子spritenode,这是重点。
主机和高亮spritenode都需要一起移动,并且高亮spritenode在“主机” spritenode的前面是1 zPosition。因此,两个spritenode的位置应该相同。
我为主机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)
}
}
在GameScene类中,我在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“跟随”宿主spritenode,但是突出显示spritenode位置的屏幕外观不在宿主spritenode的“顶部”。但是奇怪的是,两个精灵节点的位置相同。
我认为它可以协调GameScene和Highlight类的系统,但我不知道该如何解决以及为什么会发生这种情况。
答案 0 :(得分:0)
不知道为什么要做所有这些复杂的事情,但是您不应该碰这个位置。将其保留为0,0,切勿将其添加到场景中。而是将其放在精灵上,它将始终跟随您的精灵。
当然,您始终可以使用colorBlendFactor
将精灵颜色与纹理混合以创建高光
您的课程应如下所示:
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)
}
}
无需添加其他与其他init具有完全相同功能的init
您的触摸代码应如下所示:
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)
}
}
}