2014-12-09 1 views
0

맨 위에 튀지 않지만 양쪽과 바운더리에서 튀는 것을 허용하는 복잡한 SKPhysicsBody를 만들려고합니다. 현재 두 개의 노드를 만들고 있습니다. 스프라이트의 이미지와 상상의 물리학 바디가없는 이미지.스프라이트 키트 - SKPhysicsBody를 측면에만 반품으로 만듭니다.

내 두 번째 노드는 첫 번째 노드와 일치하지만 첫 번째 노드와 크기가 같습니다. 앞면과 뒷면에 PhysicsBody가 있고 그만큼 손해가 있습니다. 내 주인공이 아래쪽과 앞쪽으로 튀어 오를 수있게 해줍니다. 스크린 샷 NDA 미만으로

//This is the top part. 
- (void)nodePhysicsBodySetup:(SKSpriteNode *)node 
{ 
    CGPoint topStart = CGPointMake(0, node.size.height); 
    CGPoint topEnd = CGPointMake(node.size.width, node.size.height); 
    SKPhysicsBody *topEdge = [SKPhysicsBody bodyWithEdgeFromPoint:topStart toPoint:topEnd]; 
    node.physicsBody = topEdge; 
    //[SKPhysicsBody bodyWithBodies:@[topEdge, frontEdge, bottomEdge]] 
    //node.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:node.frame.size]; 
    node.physicsBody.dynamic = NO; 
    node.physicsBody.restitution = 0.0; 
    node.physicsBody.affectedByGravity = NO; 
    node.physicsBody.categoryBitMask = groundCategory; 
    node.physicsBody.collisionBitMask = mainHeroCategory; 
    node.physicsBody.contactTestBitMask = mainHeroCategory; 
} 
//This is the bottom physicsbody that matches up with the image of the main node. 
- (void)bottomNodePhysicsBodySetup:(SKSpriteNode *)node 
{ 
    CGPoint topStart = CGPointMake(0, node.size.height); 
    CGPoint frontEnd = CGPointMake(0,0); 
    CGPoint bottomEnd = CGPointMake(node.size.width,0); 
    SKPhysicsBody *frontEdge = [SKPhysicsBody bodyWithEdgeFromPoint:topStart toPoint:frontEnd]; 
    SKPhysicsBody *bottomEdge = [SKPhysicsBody bodyWithEdgeFromPoint:frontEnd toPoint:bottomEnd]; 
    bottomNode.physicsBody = [SKPhysicsBody bodyWithBodies:@[frontEdge, bottomEdge]]; 
    bottomNode.physicsBody.dynamic = NO; 
    bottomNode.physicsBody.affectedByGravity = NO; 
    bottomNode.physicsBody.restitution = 0.5; 
    bottomNode.physicsBody.categoryBitMask = otherCategory; 
    bottomNode.physicsBody.collisionBitMask = mainHeroCategory; 
    bottomNode.physicsBody.contactTestBitMask = mainHeroCategory; 
} 

사진 : 여기

는 내 현재 설정을위한 코드입니다 enter image description here

현재, 녹색 PhysicsBody이 노드에 연결되고, 빨간색 PhysicsBody가 부착 제 1 노드와 동일한 위치를 갖는 투명한 제 2 노드로 전송한다.

이것은 실제로 작동하지 않습니다. 내 주인공 (mainHeroCategory)은 노드 코너에서 때로는 튕겨 나옵니다. 반점이있는 PhysicsBody와 만나지 않은 노드입니다. 이 작업을 수행하는 더 좋은 방법은 무엇입니까?

답변

0

필자는 물리 바디를 하나만 사용하여이 작업을 수행하고 접촉이 발생한 위치와 정상 벡터가 무엇인지 (대리자 메서드에서 전달 된 SKPhysicsContact 개체에 있음) 확인하기 위해 연락처 대리인 메서드를 살펴볼 것입니다.

정보를 얻으면 연락처가 발생한 위치에 따라 mainHeroCategory 개체에 충동을 적용할지 여부를 결정합니다.

+0

물리 구조체의 어느 부분에 충돌했는지 감지하는 데 문제가 있습니다. 어떤 방법을 권하고 있습니까? 이것은 좋은 방법 인 것 같습니다. – Siriss

+0

SKPhysicsContactDelegate를 구현하면 didBeginContact 메소드가 SKPhysicsContact 객체를 제공합니다. 해당 객체 https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKPhysicsContact/index.html#//apple_ref/doc/c_ref/SKPhysicsContact는 연락처가 발생한 위치에 대한 정보를 제공합니다. –

0

신체 기관을 SKPhysicsJointFixed으로 가입 시키거나 시체를 SKConstraint 또는 2 개로 제한하는 것이 좋습니다. SpriteKit은 둘 이상의 바디를 bodyWithBodies으로 병합 할 때만 모양을 사용합니다. 문서에서 ...

질량이나 마찰 같은 속성은 무시됩니다. 하위 본문의 모양 만 사용됩니다.

restitution 속성은 무시됩니다.

+0

하위 노드가 하위 노드로 추가되지 않습니다. 그것은 단지 같은 크기이고 최상위 노드에 맞도록 배치됩니다. – Siriss

+0

질문에 주석이 달린 코드에서 'bodyWithBodies'를 사용하여 위와 아래를 연결 한 것으로 보입니다. 이 경우, 아이들은 물리학 자입니다. 어떻게 위에서 아래를 연결하고 있습니까? – 0x141E

+0

오, 혼란스러워. 나는 현재 그들을 연결시키지 않고있다, 나는 그들을 만났을 뿐이다. 하나의 물리학자는 노드의 상단을 덮고, 두 번째 노드는 첫 번째 노드의 물리 물리학 자와 정렬됩니다. 나는 사진을 게시 할 수 있었으면 좋지만 그것은 NDA하에있다. 나쁘게 새로운 프로젝트에서 다시 만들려고 노력하십시오. – Siriss