Swift 如何使一个节点按时间顺序替换另一个节点?

Swift 如何使一个节点按时间顺序替换另一个节点?,swift,sprite-kit,sktexture,Swift,Sprite Kit,Sktexture,假设我有五个骰子,就像这样: 当我点击时,我想用一个点替换一个点的模具面,并且(在一行中移动一个模具,同时在一行中移动另一个模具),如果最后一个模具在末端,让它替换该行中的第一个模具。更换SKT纹理与此有关吗?先谢谢你 编辑: override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { for touch: AnyObject in touches {

假设我有五个骰子,就像这样:

当我点击时,我想用一个点替换一个点的模具面,并且(在一行中移动一个模具,同时在一行中移动另一个模具),如果最后一个模具在末端,让它替换该行中的第一个模具。更换SKT纹理与此有关吗?先谢谢你

编辑:

     override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    for touch: AnyObject in touches {

        let touchLocation = touch.locationInNode(self)
        let touchedNode = self.nodeAtPoint(touchLocation)
       let texRight = SKAction.setTexture(SKTexture(imageNamed: "DieFace1"))
        DieFace2.runAction(texRight)


    }

}
覆盖函数触摸开始(触摸:设置,withEvent事件:UIEvent?){
用于触摸:触摸中的任何对象{
让touchLocation=touch.locationInNode(自身)
让touchedNode=self.nodeAtPoint(touchLocation)
设texRight=SKAction.setTexture(SKTexture(图像名为:“DieFace1”))
DieFace2.运行操作(右)
}
}
编辑2:

    import SpriteKit

     var arrayOfDieFaces = [onE, twO, threE, fouR, fivE]


    class GameScene: SKScene {



      }



    func replace() {
    var count = 1
    while count <= 5 {
        let changeTexture = SKAction.setTexture(SKTexture(imageNamed: "Dice\(count)"))
        if count == 5 {
            arrayOfDieFaces[0].runAction(changeTexture)
        }
        else{
            arrayOfDieFaces[count].runAction(changeTexture)
        }
        count += 1
    }
    arrayOfDieFaces.append(arrayOfDieFaces[0])
    arrayOfDieFaces.dropFirst()

}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {





    for touch: AnyObject in touches {

        let touchLocation = touch.locationInNode(self)
        let touchedNode = self.nodeAtPoint(touchLocation)

        replace()

    }


}
导入SpriteKit
var arrayOfDieFaces=[1,2,3,4,5]
类游戏场景:SKScene{
}
func replace(){
变量计数=1
虽然count我认为这应该有效(未测试),假设您的模具面为1到6:

var arrayOfDieFaces = [DieFace1, DieFace2, DieFace3, DieFace4, DieFace5, DieFace6]


func changeTextures() {
    var count = 1
    while count <= 6 {
        let changeTexture = SKAction.setTexture(SKTexture(imageNamed: "DieFace\(count)"))
        if count == 6 {
            arrayOfDieFaces[0].runAction(changeTexture)
        }
        else{
            arrayOfDieFaces[count].runAction(changeTexture)
        }
        count += 1
    }
    arrayOfDieFaces.append(arrayOfDieFaces[0])
    arrayOfDieFaces.dropFirst()
}
var arrayOfDieFaces=[DieFace1、DieFace2、DieFace3、DieFace4、DieFace5、DieFace6]
func change纹理(){
变量计数=1
虽然count我认为这应该有效(未测试),假设您的模具面为1到6:

var arrayOfDieFaces = [DieFace1, DieFace2, DieFace3, DieFace4, DieFace5, DieFace6]


func changeTextures() {
    var count = 1
    while count <= 6 {
        let changeTexture = SKAction.setTexture(SKTexture(imageNamed: "DieFace\(count)"))
        if count == 6 {
            arrayOfDieFaces[0].runAction(changeTexture)
        }
        else{
            arrayOfDieFaces[count].runAction(changeTexture)
        }
        count += 1
    }
    arrayOfDieFaces.append(arrayOfDieFaces[0])
    arrayOfDieFaces.dropFirst()
}
var arrayOfDieFaces=[DieFace1、DieFace2、DieFace3、DieFace4、DieFace5、DieFace6]
func change纹理(){
变量计数=1

计数这种方法改变每个骰子的位置,而不是改变其纹理。通过改变位置,它保持了唯一识别每个骰子的能力(例如,通过名称)

首先,创建一个名为
dice
SKNode
,并定义每个骰子之间的大小和间距

let dice = SKNode()
let diceSize = CGSizeMake(10, 10)
let spacing:CGFloat = 2
其次,创建骰子节点,并按顺序将它们添加到
骰子
SKNode
中,并使用

for i in 0..<6 {
    let sprite = SKSpriteNode ...
    sprite.physicsBody = SKPhysicsBody( ...
    sprite.physicsBody?.categoryBitMask = UInt32(0x1 << i)
    sprite.position = CGPointMake(CGFloat(i)*(diceSize.width+spacing) , 0)
    dice.addChild (sprite)
}
// Center SKNode in the view
dice.position = CGPointMake (CGRectGetMidX(view.frame),CGRectGetMidY(view.frame))
addChild (dice)

对于0中的i..此方法更改每个骰子的位置,而不是更改其纹理。通过更改位置,它可以保持唯一标识每个骰子的能力(例如,通过名称)

首先,创建一个名为
dice
SKNode
,并定义每个骰子之间的大小和间距

let dice = SKNode()
let diceSize = CGSizeMake(10, 10)
let spacing:CGFloat = 2
其次,创建骰子节点,并按顺序将它们添加到
骰子
SKNode
中,并使用

for i in 0..<6 {
    let sprite = SKSpriteNode ...
    sprite.physicsBody = SKPhysicsBody( ...
    sprite.physicsBody?.categoryBitMask = UInt32(0x1 << i)
    sprite.position = CGPointMake(CGFloat(i)*(diceSize.width+spacing) , 0)
    dice.addChild (sprite)
}
// Center SKNode in the view
dice.position = CGPointMake (CGRectGetMidX(view.frame),CGRectGetMidY(view.frame))
addChild (dice)


对于0中的i.。没问题!(它给了我+25的声誉;))它工作得很好,但是我如何使它在每次点击屏幕时都发生变化?我需要多次调用该函数吗?因为它只会将它们移动一次,然后当我再次点击时,什么都不会发生。你在哪里调用该函数?在touchsbegind函数中?你应该在类的顶部添加数组的代码,而不是在touchesbeated函数中,这应该解决棘手的问题!(它给了我+25的声誉;))它工作得很好,但是我如何使它在每次点击屏幕时都发生变化?我需要多次调用该函数吗?因为它只会将它们移动一次,然后当我再次点击时,什么都不会发生。你在哪里调用该函数?在touchsbegind函数中?你应该在类的顶部添加数组的代码,而不是在touchesbreated函数中,这应该通过改变纹理来完成,你失去了唯一识别每个骰子的能力(如果你在某一点上想要的话)。是的,我想用一个物理体(位掩码)来识别每个骰子。还有其他方法吗?通过更改纹理,您将失去唯一识别每个骰子的能力(如果在某一点上这是您想要的)。是的,我想用物理体(位掩码)来识别每个骰子。还有其他方法吗?好的,我在这里看到一个
从父节点移除
,这不是我想要做的。也许我读错了,但我只是想改变位置,而不是从场景中添加/减去任何节点。它会立即将节点添加回新位置的节点树中(即,在其兄弟节点之前)。你试过上面的代码吗?哦,好的,现在我明白了。我还没有,对不起,我一直很忙,但我会在一点点。这给了我一个NSInvalidArgumentException:试图添加一个已经有父节点的节点。但我只调用了每个节点一次。你测试过吗?代码工作正常。当你调用
ad时会发生错误dChild
在同一个节点上两次。我提供了for循环作为如何设置骰子初始位置的示例。您需要将其集成到您的代码中。好的,我在这里看到一个
removeFromParent
,这不是我想要做的。也许我读错了,但我只是想改变位置,而不是添加/s从场景中复制任何节点。它会立即将节点添加回节点树中的新位置(即在其同级节点之前)。你试过上面的代码吗?哦,好的,现在我明白了。我还没有,对不起,我一直很忙,但我会在一点点。这给了我一个NSInvalidArgumentException:试图添加一个已经有父节点的节点。但我只调用了每个节点一次。你测试过吗?代码工作正常。当你调用
ad时会发生错误dChild
在同一个节点上两次。我提供了for循环作为如何设置骰子初始位置的示例。您需要将其集成到代码中。