연락처를 사용하여 SKNode에서 하나의 솔리드 SKPhysicsBody 또는 SKNode 개체를 얻는 방법은 무엇입니까?

핑크 팬더

하우스 스택과 같은 게임 ( https://apps.apple.com/gb/app/house-stack/id1458713825?l ) 을 만들려고하는데 물리 메커니즘을 할당하는 데 문제가 있습니다.

내 주요 문제는 노드가 떨어질 때 단일 객체를 만들고 다른 사람과 접촉하고 특정 높이에 도달하면 솔리드 형태로 아래로 이동하는 것입니다.

노드 사이의 접촉으로 고정 조인트를 만들고 마지막 노드 위치 y = 0 일 때 이동하려고 시도했지만 고정 조인트가 생각대로 작동하지 않습니다. 노드는 뱀처럼 흔들리고 움직일 때 무너집니다.

또한 접촉이있는 새로운 단일 객체를 만들고 높이를 계산하려고했지만 init (bodies : [SKPhysicsBody])를 어떻게 사용해야하는지 알 수 없습니다. 새 객체에 물리 바디 속성을 할당하더라도 높이를 측정하거나 호출 할 수 없으며 다른 노드 접점으로 바디를 업데이트 할 수 없습니다.

어떤 아이디어 나 예도 좋을 것입니다. 미리 감사드립니다.

SKNode (inside touchesBegan to create same node 여러 번) :

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let Node1 = SKSpriteNode(imageNamed: "Object1")
        Node1.position = MovingObject.position
        Node1.zPosition = 2
        Node1.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: Node1.size.width, height: Node1.size.height))
        Node1.physicsBody?.friction = 0.9
        Node1.physicsBody?.restitution = 0.1
        Node1.physicsBody?.allowsRotation = true
        Node1.physicsBody!.contactTestBitMask = Node1.physicsBody!.collisionBitMask
        Node1.physicsBody!.categoryBitMask = Node1Category
        addChild(Node1)
    }

움직이는 물체 :

Inside GameScene;
var MovingObject = SKSpriteNode(imageNamed: "Object1")
let ObjectMove = SKAction.sequence([(SKAction.moveBy(x: 200, y: 0, duration: 0.5)),(SKAction.moveBy(x: -400, y: 0, duration: 1)),(SKAction.moveBy(x: 200, y: 0,  duration: 0.5))])

Inside override func didMove(to view: SKView);
        MovingObject.position = CGPoint(x: 0, y: frame.maxY * 0.55)
        MovingObject.zPosition = 1
        MovingObject.run(SKAction.repeatForever(ObjectMove))
        addChild(MovingObject)

관절과 움직임 :

func didBegin(_ contact: SKPhysicsContact) {
if contact.bodyA.node?.name == "Node1" && contact.bodyB.node?.name == "Node1"
        {
            let joint2 = SKPhysicsJointFixed.joint(withBodyA: contact.bodyA , bodyB: contact.bodyB, anchor: CGPoint(x: contact.contactPoint.x, y:contact.contactPoint.y))
            
            let pos2 = (contact.bodyA.node?.position.x)!-(contact.bodyB.node?.position.x)!

            if pos2 <= Node1.size.width * 0.5 && pos2 >= -Node1.size.width * 0.5{
                physicsWorld.add(joint2)
            }

            if (contact.bodyB.node?.position.y)! >= 0 {
                let movenodedown = SKAction.moveBy(x: 0, y: -Node1.size.height, duration: 0.5)
                contact.bodyB.node?.run(movenodedown)
                ground.run(movenodedown)     
            }   
        }
핑크 팬더

비슷한 문제에 대해 깨달을 필요가있는 사람들을 위해;

고정 관절 대신 enumerateChildNodes(withName:using:)physicsBody.isDynamic = false함께 사용하여 솔루션을 찾았습니다 . 코드는 다음과 같습니다.

func didBegin(_ contact: SKPhysicsContact)
    {
if contact.bodyA.node?.name == "Node1" && contact.bodyB.node?.name == "Node1"
        {
let pos2 = (contact.bodyA.node?.position.x)!-(contact.bodyB.node?.position.x)!

            if pos2 <= Node1.size.width * 0.5 && pos2 >= -Node1.size.width * 0.5.
            {
                contact.bodyB.node?.physicsBody?.isDynamic = false
                contact.bodyA.node?.physicsBody?.collisionBitMask = 0
                contact.bodyA.node?.physicsBody?.contactTestBitMask = 0
                
                if (contact.bodyB.node?.position.y)! >= 0
                {
                    let movenodesdown = SKAction.moveBy(x: 0, y: Node1.size.height , duration: 0.5)

                    enumerateChildNodes(withName: "Node1") { (nodes, stop) in
                        let Node1 = nodes as! SKSpriteNode
                        Node1.run(movenodesdown)
                    }
                }
            }
        }
    }

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관