iOS Swift SpriteKit:如何使子spritenode的位置和移动与其父spritenode相同?

时间:2018-08-20 16:05:39

标签: ios swift sprite-kit skspritenode coordinate-systems

我想实现一个带有“彩色突出显示”的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类的系统,但我不知道该如何解决以及为什么会发生这种情况。

1 个答案:

答案 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)
        }
    }
 }