【问题标题】:How to add physicsBody as child to SKSpriteNode?如何将physicsBody作为孩子添加到SKSpriteNode?
【发布时间】:2014-10-22 21:57:12
【问题描述】:

我创建了一个名为chainsawHolder 的容器SKSpriteNode,它有一个名为longChainsaw 的子SKSpriteNode。我想对电锯架施加一个脉冲,这样当它移动时,它的子节点也会随之移动。我已经尝试了几件事,但我无法做到这一点。看来只有我的容器 SKSpriteNode 只能有一个physicsSize。但它的 childNode 不能有大小 - 如果有,它不会与容器节点一起移动。

我需要子节点成为物理节点,因为当它与我的英雄碰撞时,它需要调用一个函数。

当应用脉冲时,如何让我的子节点与容器节点一起移动?

代码如下:

let chainsawHolderWidth = size.width
    let chainsawHolderHeight = size.height
    chainsawHolder.size = CGSize(width: chainsawHolderWidth, height: chainsawHolderHeight)
    chainsawHolder.anchorPoint = CGPoint(x: 0, y: 0)
    chainsawHolder.position = CGPoint(x: 0, y: 0)


    chainsawHolder.physicsBody = SKPhysicsBody(rectangleOfSize: chainsawHolder.size)
    chainsawHolder.physicsBody?.dynamic = true
    chainsawHolder.physicsBody?.categoryBitMask = bgCategory
    chainsawHolder.physicsBody?.contactTestBitMask = boCategory
    chainsawHolder.physicsBody?.collisionBitMask = noneCategory



    //LONG CHAINSAW
    let longChainsawWidth = size.width/3
    let longChainsawHeight = size.height*0.20

    longChainsaw.size = CGSize(width: longChainsawWidth, height: longChainsawHeight)
    let textures = [SKTexture(imageNamed: "chainsaw1"), SKTexture(imageNamed: "chainsaw2")]
    let animation = SKAction.animateWithTextures(textures, timePerFrame: 0.1)
    let runSawAnimation = SKAction.repeatActionForever(animation)
    longChainsaw.runAction(runSawAnimation)



    let longChainsawPhysicsSize = CGSizeMake(longChainsawWidth - longChainsawWidth/14, longChainsawHeight - longChainsawHeight/12)
    longChainsaw.physicsBody = SKPhysicsBody(rectangleOfSize: longChainsawPhysicsSize)


    longChainsaw.position = CGPoint(x: size.width*0.5, y: size.height*0.5)

    longChainsaw.physicsBody?.dynamic = true
    longChainsaw.physicsBody?.categoryBitMask = chainsawCategory
    longChainsaw.physicsBody?.contactTestBitMask = boCategory
    longChainsaw.physicsBody?.collisionBitMask = noneCategory


    chainsawHolder.addChild(longChainsaw)
    self.addChild(chainsawHolder)

【问题讨论】:

    标签: ios swift sprite-kit game-physics skphysicsbody


    【解决方案1】:

    物理引擎没有父子关系的概念。

    你可以做的是用一个关节连接两个身体。然而,这意味着在向身体施加力时总会有一定的灵活性。

    另一种方法是对支架施加力,然后在场景的更新方法中将长链锯的位置设置为支架位置加上偏移量。

    【讨论】:

    • 谢谢!我希望物理引擎能够识别这种关系。但是您使用场景更新方法的解决方案似乎可行!
    【解决方案2】:

    实际上,您快到了。您只需要在两个电锯片之间创建一个物理关节:

    // Where your joint will be .. you really should position your chainsaw
    //     holder & longchainsaw first before you join them. 
    
    let my_joint_point_in_scene_coordinates = chainsawHolder.position
    
    let myJoint = SKPhysicsJointFixed.jointWithBodyA(
                   chainsawHolder.physicsBody!,
                   bodyB: longChainsaw.physicsBody!,
                   anchor: my_joint_pt_in_scene_coords )
    self.physicsWorld.addJoint(myJoint)
    

    另外,如果您希望长链锯在链锯支架内​​旋转(就像手腕从前臂旋转),而不是使用 SKPhysicsJointFixed,请使用 SKPhysicsJointPin,然后您可以旋转 longChainsaw 节点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      相关资源
      最近更新 更多