Does a parent have its children's physicsBodies?

隐身守侯 提交于 2019-12-23 06:20:48

问题


I was wondering what the physicsBody of a parent would be if all I do is this:

let combinedBodies = SKSpriteNode()
addChild(combinedBodies)

//Create its children like this as an example:
let child = SKSpriteNode(color: UIColor.red, size: CGSize(width: 10, height: 20))
child.physicsBody = SKPhysicsBody(rectangleOf: child.size)
child.physicsBody?.categoryBitMask = collisionType.child.rawValue
combinedBodies.addChild(child)
allBodies.append(child.physicsBody?)

Would the physicsBody of combinedBodies be the combination of all its children's physicsBodies, or would it have none and I would have to manually add it? Also, what would the categoryBitMask of the parent be? Would it be collisionType.child.rawValue if all of its children had that category, or would I manually have to give it its own category?

Edit: I have used this:

combinedBodies.physicsBody = SKPhysicsBody(bodies: )

I have a list where I store all the children's physicsBodies and then put that list into this command (I keep updating the combinedBodies.physicsBody when new and old children get deleted). However, now I have the problem that the physicsbodies of the parent aren't where the original physicsbodies of the children were (they are at different positions on the screen), they are in the middle of the screen. Is there a way to fix this?

I have also changed the physicsBody of the combinedBodies like this:

combinedBodies.physicsBody = SKPhysicsBody(bodies: allBodies)
combinedBodies.physicsBody?.isDynamic = true
combinedBodies.physicsBody?.categoryBitMask = collisionType.combinedBodies.rawValue
combinedBodies.physicsBody?.collisionBitMask = 0
combinedBodies.physicsBody?.contactTestBitMask = 0
combinedBodies.physicsBody?.affectedByGravity = false
combinedBodies.physicsBody?.friction = 0.0

Please note that all the code in this question is basically my code, just that the new children are created through an iteration with different positions, rotations, and colors.

EDIT WITH EXAMPLE CODE: I have been able to recreate my issue in a test program which I have added here (the allLine is the parent of ScreenLine and line in this code).

class GameScene: SKScene, SKPhysicsContactDelegate {

enum type: UInt32 {
    case line = 1
    case screenLine = 2
    case allLine = 4
}

override func didMove(to view: SKView) {

    let allLine = SKSpriteNode()
    addChild(allLine)
    var points = [CGPoint]()
    var bodies = [SKPhysicsBody]()

    points = [CGPoint(x: 0, y: 300), CGPoint(x: -200, y: 100)]
    let width = 5.0
    let height = {() -> Double in
        let distX = abs(points[1].x - points[0].x)
        let distY = abs(points[1].y - points[0].y)
        let dist = sqrt((distX * distX) + (distY * distY))
        return Double(dist)
    }()
    let ScreenLine = SKSpriteNode(color: UIColor.init(red: 1.0, green: 1.0, blue: 0.0, alpha: 1.0), size: CGSize(width: width, height: height))
    ScreenLine.position = CGPoint(x: ((points[1].x + points[0].x)/2), y: ((points[1].y + points[0].y)/2))
    let rotation = {() -> CGFloat in
        let m = (points[1].y - points[0].y)/(points[1].x - points[0].x)
        let angle = CGFloat(Double.pi/2) - atan(m)
        return -angle
    }()
    ScreenLine.zRotation = rotation
    ScreenLine.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: width, height: height), center: CGPoint(x: 0, y: 0))
    ScreenLine.physicsBody?.contactTestBitMask = type.screenLine.rawValue
    ScreenLine.physicsBody?.collisionBitMask = 0
    ScreenLine.physicsBody?.contactTestBitMask = 0
    ScreenLine.physicsBody?.isDynamic = true
    ScreenLine.physicsBody?.affectedByGravity = false
    allLine.addChild(ScreenLine)
    bodies.append(ScreenLine.physicsBody!)

    points = [CGPoint(x: -100, y: 300), CGPoint(x: -300, y: 100)]
    let line = SKSpriteNode(color: UIColor.init(red: 1.0, green: 1.0, blue: 0.0, alpha: 1.0), size: CGSize(width: width, height: height))
    line.position = CGPoint(x: ((points[1].x + points[0].x)/2), y: ((points[1].y + points[0].y)/2))
    line.zRotation = rotation
    line.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: width, height: height), center: CGPoint(x: 0, y: 0))
    line.physicsBody?.contactTestBitMask = type.screenLine.rawValue
    line.physicsBody?.collisionBitMask = 0
    line.physicsBody?.contactTestBitMask = 0
    line.physicsBody?.isDynamic = true
    line.physicsBody?.affectedByGravity = false
    allLine.addChild(line)
    bodies.append(line.physicsBody!)

    allLine.physicsBody = SKPhysicsBody(bodies: bodies)
    allLine.physicsBody?.isDynamic = true
    allLine.physicsBody?.categoryBitMask = type.allLine.rawValue
    allLine.physicsBody?.collisionBitMask = 0
    allLine.physicsBody?.contactTestBitMask = 0
    allLine.physicsBody?.affectedByGravity = false
    allLine.physicsBody?.friction = 0.0
}
}

UPDATE: Now by centering the physicsBody of the children to where the node is (not CGPoint.zero), but where I place the child on the screen, the physicsBody is in the right position when I add it to the list. I set the line and screen line physicsBody positions like this:

ScreenLine.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: width, height: height), center: ScreenLine.position)
line.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: width, height: height), center: line.position)

PROBLEM THAT I'M CURRENTLY TRYING TO FIGURE OUT: This makes the physicsBodies of allLine centred. However, they aren't rotated like they should be. They don't preserve their rotations. How do I fix this??

Thanks for any answers and help :D

来源:https://stackoverflow.com/questions/41530366/does-a-parent-have-its-childrens-physicsbodies

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!