【问题标题】:How to make SKSpriteNode with fixed position (after adding physics)?如何使 SKSpriteNode 位置固定(添加物理后)?
【发布时间】:2014-12-04 01:03:59
【问题描述】:

我有几个以编程方式制作的 SKSpriteNode。其中一些我想四处走动,一些我想保持静止(有一个固定的位置)。当向节点添加物理(需要能够进行碰撞检测,对吗?)并设置physicsBodyXXXX.dynamic = false 时,它们在将其他对象移动到它们上方时保持在相同的位置。没关系!

但是,我仍然能够抓取我想要静态定位的节点,然后移动它们。如何屏蔽掉我不想在触摸功能中移动的节点?还是有其他解决方案?

试图找到像static 这样的属性,它使节点的位置固定,但找不到...

这是我的自动生成节点代码(override func didMoveToView(view: SKView):

for Character in englishWord{

   // Make letters:
   let letterToMove = SKSpriteNode(imageNamed: "\(Character)")
   //then setting size and position
   var physicsBodyLetterToMove = SKPhysicsBody(rectangleOfSize: letterToMove.size)
   physicsBodyLetterToMove.affectedByGravity = false
   physicsBodyLetterToMove.allowsRotation = false
   physicsBodyLetterToMove.dynamic = false 
   letterToMove.physicsBody = physicsBodyLetterToMove

   self.addChild(letterToMove)

   // Make empty boxes for the letters:
   let letterRecBox = SKSpriteNode(imageNamed: "EmptyBox")
   //then setting size and position
   var physicsBodyLetterRecBox = SKPhysicsBody(rectangleOfSize: letterRecBox.size)
   physicsBodyLetterToMove.affectedByGravity = false            
   physicsBodyLetterRecBox.dynamic = false
   letterRecBox.physicsBody = physicsBodyLetterRecBox

   self.addChild(letterRecBox)
}

所以 touches func 的:

var selected: [UITouch: SKNode] = [:]

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    /* Called when a touch begins */

    selected = [:]
    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)
        selected[touch as UITouch] = nodeAtPoint(location)
    }
}

override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)

        for (touch, node) in selected{
            if !contains([self], node){
                let action = SKAction.moveTo(location, duration: 0.1)
                node.runAction(SKAction.repeatAction(action, count: 1))
            }
        }

    }

}

有什么想法吗?

【问题讨论】:

    标签: swift sprite-kit skphysicsbody touches


    【解决方案1】:

    将 dynamic 设置为 false 将使节点不受物理影响。 SKActions 和触摸事件不被认为是物理的,所以它们仍然会影响你的非动态节点。

    你可以这样做:

    YourSpriteNode.name = @"staticNode"; //Right after you create it
    

    然后改变你的触摸方式:

    for (touch, node) in selected{
            if !contains([self], node){
                if(![node.name isEqualToString:@"staticNode"])
                {
                   let action = SKAction.moveTo(location, duration: 0.1)
                   node.runAction(SKAction.repeatAction(action, count: 1))
                }
            }
        }
    

    新引入的 if 语句将防止任何名为“staticNode”的节点因您的 SKAction 而移动。其他节点将按预期移动。

    【讨论】:

      【解决方案2】:

      谢谢,成功了。

      只是,我不得不这样写:

      letterRecBox.name = "staticNode"
      
      ...
      
      if !(node.name == "staticNode"){
         ...then do something...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多