2017-02-07 3 views
2

필자는 물리 본문이있는 스프라이트가 있습니다. 이 스프라이트를 이동하려면 update() 함수에서 스프라이트의 속도를 150 단위로 설정하고 오른쪽으로 이동하려면 -150을 계속 설정합니다. (첨부 된 코드를 참조하십시오.)Spritekit/Swift에서 첫 번째 스프라이트의 물리 본문에 두 번째 스프라이트 정렬

저는 첫 번째 스프라이트를 따르고 싶은 두 번째 물리학 체를 가지고 있습니다. 이 두 번째 물리학 체의 좌표는 첫 번째 물리층의 맨 아래에 있고 20 번째 물리학 자의 좌표는 오른쪽에 있습니다.

필자는 두 번째 물리학자가 첫 번째 오프셋을 항상 따르고 싶습니다.

내 코드 대부분이 작동하지만 첫 번째와 두 번째 신체 사이의 거리가 약간 다르다는 것을 알았습니다. 나는 변이가 없기를 바랍니다. 오른쪽으로 움직일 때, 그들 사이의 거리는 조금 압축됩니다. 왼쪽으로 움직일 때, 그들 사이의 거리는 조금 증가합니다. 여기에 비디오를 참조하십시오 https://www.youtube.com/watch?v=K9FhIdMwp7k 여기

내가 사용하고 코드입니다 :

override func update(_ currentTime: TimeInterval) { 

    switch playerDirection { 
    case "stopped": 
     playerSpeed = 0.0 
    case "right": 
     playerSpeed = 150.0 
    case "left": 
     playerSpeed = -150.0 
    default: 
     print("default") 
    } 

    // ball is the first sprite and footBall is the second sprite: 

    ball.physicsBody?.velocity = CGVector(dx: playerSpeed, dy: ball.physicsBody!.velocity.dy) 

    footBall.position = CGPoint(x: (ball.position.x + 20), y: ball.position.y - (ball.size.height/2) + 4) 

    myCam.position = CGPoint(x: round(ball.position.x), y: self.size.height/2) 

... 내가 성공하지() 오버라이드 FUNC의 didSimulatePhysics를 사용하여 주위 놀았 던

도 .

필자는 속도를 사용하여 플레이어를 움직이는 대신에 ball.position.x (ball = player) 및 footBall.position.x를 직접 증가시키는 테스트를 수행했습니다.이 작업을 수행하면 모든 것이 완벽합니다. 정렬. 하지만이 길을 택한다면 게임에서 다른 곳에서 게임 물리학이 어떻게 작동 하는지를 변경해야합니다. 무시하고 싶습니다.

감사합니다.

답변

0

SKPhysicsJoint를 사용하여 문제를 해결했습니다. 여기 내 작업 코드 (이 시점에서 테스트 때문에 아직도 좀 실수,하지만 원칙적으로 작동)입니다 :

//add a nice player 
    ball = SKSpriteNode(texture:spriteArray2[0]) 
    ball.size = CGSize(width: 150, height: 48) 
    //ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.height/2) 
    ball.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 16, height: 48)) 
    ball.zPosition = 1 
    ball.physicsBody?.affectedByGravity = true 
    ball.position = CGPoint(x: 80.0, y: 200.0) 
    ball.physicsBody?.categoryBitMask = 1 
    ball.physicsBody?.collisionBitMask = UInt32(2 | 32 | 256) //2 = floors, 32 and 256= doors. 
    ball.physicsBody?.contactTestBitMask = 0 
    ball.physicsBody?.isDynamic = true 
    ball.physicsBody?.restitution = 0.0 
    ball.physicsBody?.allowsRotation = false 
    ball.physicsBody?.mass = 60.0 
    ball.physicsBody?.friction = 0.00 
    addChild(ball) 

    //add a nice ball for when jumping 
    footBall = SKSpriteNode(color: SKColor.blue, size: CGSize(width: 24, height: 16)) 
    footBall.position = ball.position 
    footBall.name = "footBall" 
    footBall.zPosition = 1 
    footBall.physicsBody = SKPhysicsBody(circleOfRadius: 4) 
    footBall.physicsBody?.affectedByGravity = false 
    footBall.physicsBody?.categoryBitMask = 16 
    footBall.physicsBody?.collisionBitMask = 2 // floors 
    footBall.physicsBody?.contactTestBitMask = UInt32(32 | 64 | 128 | 256) // the doors bear snake 
    footBall.physicsBody?.isDynamic = true 
    footBall.physicsBody?.restitution = 0.0 
    //footBall.physicsBody?.allowsRotation = false 
    //footBall.physicsBody?.mass = 60.0 
    //footBall.physicsBody?.friction = 0.00 
    addChild(footBall) 

    let myCGPoint = ball.position // sets joint position 

    let myJoint = SKPhysicsJointFixed.joint(withBodyA: ball.physicsBody!, bodyB: footBall.physicsBody!, anchor: myCGPoint) 

    scene?.physicsWorld.add(myJoint) 

...

다음 아래로 업데이트 루프에서 나는 그래서 플레이어에 대한 속도를 설정 필요에 따라

내 원래의 코드에서
ball.physicsBody?.velocity = CGVector(dx: playerSpeed, dy: ball.physicsBody!.velocity.dy) 

내 업데이트 루프에서 나는 또한 위치를 공 (플레이어)와 일치하는 축구의 위치를 ​​조정하지만 수정 된 코드에서 공동 존재의에 의해, 사용했기 때문에 발을 공으로 움직여야합니다. y 힘 또는 속도를 변경하거나 footBall의 x 위치를 변경하십시오.풋볼은 타고있는 태그 옆에 붙어 있습니다.

처음에는이 새로운 방법이 제대로 작동하지 않아 시행 착오를 통해 "footBall.physicsBody? .allowsRotation = false"가 footBall의 속성으로 지정 될 수없는 이유가 발견되었습니다. 그러나이 줄의 주석 처리를 제거하면 잘 작동합니다.

이 연습의 요점은 점프 중에 플레이어의 발이 뻗어있는 경우 점프 테스트 점으로 footBall을 사용하는 것입니다. 따라서 발볼은 주 플레이어의 시체보다 약간 앞으로 나아갑니다. 그런 다음 점프에 필요한만큼이 발볼을 동적으로 켜거나 끕니다.

다소 관련 "발 센서"에 다음 페이지는 다음과 같습니다 http://gamedevwithoutacause.com/?p=1076 http://www.iforce2d.net/b2dtut/jumpability

0

첫 번째 노드의 자식으로 두 번째 노드를 추가하면 요구 사항을 충족합니까? 교체

scene.addChild(ball) 
scene.addChild(footBall) 

: 그 대신 같은 수준에서 모두 필요없이, 인 당신에게 오프셋으로 축구 위치를

scene.addChild(ball) 
ball.addChild(footBall) 

그냥 설정이 필요합니다 다음 어떤

footBall.position = CGPoint(x: 20, y: - (ball.size.height/2) + 4) 

볼이 풋을 움직이는 시간 볼은 볼 노드처럼 움직이기 때문에 footBall에 대한 수동 위치 업데이트 코드를 제거 할 수 있습니다.

+0

그런 종류의 다른 스프라이트에 스프라이트를 추가하기위한 위대한 작품을하지만 물리학기구와 작동하지 않습니다. 나는 SKPhysicsJoint https://developer.apple.com/reference/spritekit/skphysicsjoint를 사용하는 나의 문제에 대한 수용 가능한 해결책을 찾아 냈다. 하지만 여전히 원래의 게시물에 가변적 인 "압축/확장"갭이있는 이유는 아직 알지 못합니다. 아마 언젠가 그런 일이 일어난 이유를 알아낼 것입니다. –

+0

답변 해 주셔서 감사합니다. :) –

관련 문제