2014-12-16 6 views
2

좋아요, 우주 발파공 게임 코드를 작성하고 있습니다.이 모든 중요한 문제를 제외한 모든 것이 잘 진행되고있는 것처럼 보입니다.SpriteKit Physics Bodies 여러 레이어의 충돌

먼저 자기 (GameScene)의 자식으로 우주선 (PhysicsBody 포함)을 추가했습니다.

다음으로 노드의 배경 레이어를 자기 자신, 우주선 뒤에 그리고 조이스틱 컨트롤을 통해 우주선 뒤의 배경을 움직여 시뮬레이션 한 노드도 추가했습니다.

boundary physics Edge Loop body가있는 노드를 추가하여 배가 배 이상으로 이동하지 못하도록하고 해당 노드를 bgLayer의 자식으로 추가했습니다.

나는 우주선을 쏠 수있는 물건을 가지고있다. 그러나 나는 배경을 따라 움직이기를 바란다. 그래서 나는 그들을 bgLayer의 자식으로 추가했다.

우주선이 터지면 나는 레이저가 필요했기 때문에 bgLayer의 자식뿐만 아니라 이것을 추가했습니다.


_spaceship.physicsBody = (custom physicsBody code); 
[self addChild:_spaceship]; 

_bgLayer = [SKNode node]; 
[self addChild:_bgLayer]; 

_bounds = [SKNode node]; 
_bounds.physicsBody = (physicsBody edgeLoop code); 
[_bgLayer addChild:_bounds]; 

_otherObjects.physicsBody = (custom physicsBody code); 
[_bgLayer addChild:_otherObjects]; 

_laser.physicsBody = (custom physicsBody code); 
[_bgLayer addChild:_laser]; 

모두 잘

는 우주선을 넘어 이동하지 않는 배경, 다른 객체는 배경의 움직임에 따라 이동하고, 레이저 화재는에 전화했을 때.

내 첫 번째 커다란 딜레마는 내 레이저가 발사 될 때, 배경이 움직일 때 움직이지 않지만 배경은 뒤로 움직입니다. 나는 아마 할 수 있었지만 레이저가 항상 우주선과 평행하게 움직인다면 우스운 것처럼 보입니다. _bgLayer의 자식으로 레이저를 추가 한 이후로 이상하게 보입니다.

둘째로, 내 레이저의 물리학 바디는 EdgeLoop 본체를 인식하지 못하는 것 같아요. 또한, 우주선의 physicsBody가 EdgeLoop 본문을 인식하는 것처럼 보이지만 _bgLayer의 하위 개체를 인식하지 못합니다.

동일한 레이어의 하위가 아닌 물리 단체가 서로를 인식합니까? 내 레이저가 왜 같은 층의 다른 아이들과 비슷하게 행동하지 않습니까?

+0

물리 엔진에 레이어가 없습니다. 장면마다 하나의 물리 세계가 있습니다. 충돌 범주와 그 종류의 것을 설정하고 개체가 물리에 참여하는 경우와 정의하는 방법을 모두 설정해야합니다. – uchuugaka

+0

코딩 예에서이 내용을 추가하지 않은 것에 대해 사과드립니다.하지만 범주 및 콜리 전 비트 마스크를 설정했지만 레이저가 이러한 설정을 무시하는 것 같습니다. – wtivie05

답변

0

  • 어린이 힘/충동을 적용하여 세상을 움직이는 물리 기관
  • 없이 또는 설정의 속도로 물리 기관과

    1. 어린이에 영향을 미칠 것 위치를 변경하여 세계 이동 영향을 받음

      1. 신체가없는 어린이

      속도를 설정하여 세계를 움직이는 대신 세계에 카메라 (SKNode)를 추가하고 속도를 설정하여 카메라를 이동 한 다음 세계의 위치를 ​​다음과 같이 업데이트 할 수 있습니다. 카메라를 가운데에 놓습니다. didFinishUpdate 방법으로 카메라를 중앙에 배치 할 수 있습니다.

    +0

    코딩 예에서이 내용을 추가하지 않았 음을 사과드립니다.하지만 setVelocity 메서드를 사용하여 모션에서 레이저를 설정했습니다. 내 레이저는 내가 언급 한 다른 물체와 상호 작용하지만 edgeLoop과는 상호 작용하지 않습니다. 당신의 마지막 코멘트가 나를 자극합니다. 레이저 벡터의 dx와 dy에서 배경 벡터의 dx와 dy를 간단히 빼면 되나요? – wtivie05

    +0

    사실, 레이저를 월드 노드에 추가 한 경우 조정없이 레이저가 적절히 움직여야합니다. – 0x141E

    +0

    그건 내가 생각하기에 너무. 그러나 _bgLayer 노드 대신 장면과 관련하여 여전히 이동합니다. – wtivie05

    0
    -(void)fireLaser 
    { 
        _laser = [SKSpriteNode spriteNodeWithImageNamed: [NSString stringWithFormat:@"blueLaser"]];; 
        _laser.zRotation = _spaceShip.zRotation; 
        CGVector rotationVector = RadiansToVector(_spaceShip.zRotation); 
        _laser.position = (Custom code for positioning the laser just in front of the spaceship); 
    
        _laser.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_laser.size]; 
        [_bgLayer addChild:_laser]; 
    
        _laser.physicsBody.velocity = CGVectorMake(rotationVector.dx * LASER_SPEED, rotationVector.dy * LASER_SPEED); 
    } 
    

    특정 SpriteNode를 터치하면 touchesBegan에서 [self fireLaser]가 호출됩니다. 레이저는 아름답게 발사되지만 배경과 함께 스크롤하지 않고 오히려 우주선과 관련하여 움직입니다. PhysicsBody 및 setVelocity 메서드가있는 배경 스크롤은 조이스틱이 움직일 때 호출되므로 실제로 우주선이 화면 중앙을 벗어나지 않을 때 우주선 모션을 시뮬레이션합니다. 물리 카테고리는 배경 물리학 체가 어떤 것과도 충돌하는 것을 방지합니다. LASER_SPEED는 단순히 정적 const float입니다.

    +0

    레이저 코드 @ 0x141E – wtivie05

    관련 문제