2012-09-11 2 views
1

게임 스페 인에는 적과 플레이어 스프라이트가 z : 0에 추가되어 있습니다. GameScene에 z : -1의 배경 레이어를 추가하면 주 배경에 잘 작동합니다. 유일한 것은 내가 구름을 보이기를 원한다는 것과 플레이어와 적의 스프라이트에 대한 z : 1 존중이어야한다는 것입니다.iOS 용 Cocos2d : z 레이어 이해

내 접근 방식은 배경 레이어의 z : 2에 구름을 추가하는 것이지만 여전히 적군과 플레이어 스프라이트 아래에 표시되기 때문에 충분하지 않습니다.

저는 z 값 (2)이 절대 값 (GameScene 부모 레이어와 비교하여) z 값이 1 인 따라서 배경 레이어 z 값 (-1)에 추가되었다고 생각했을 것입니다. z : 0의 적과 플레이어 스프 라이트.

분명히 틀 렸습니다.

그런 다음 레이어에 스프라이트를 추가하면 마지막 레이어에 추가 된 스프라이트는 이전 스프라이트의 맨 위에 표시됩니다 (예 : 플레이어 스프라이트를 추가하면 적을 맨 위에 표시 함). 플레이어 스프라이트). 이상한 그래픽 효과 (색을 섞어 놓은 두 개의 이미지의 오버레이)를 피하기위한 협약이라고 생각합니다. 이것이 맞습니까?

내 유일한 해결책은 여러 배경 레이어 (구름과 실제 배경 지형을위한 레이어)를 여러 개 가지고 GameScene의 다른 z 레벨에 추가하는 것입니다. 이게 맞을까요? 이 단점은 논리적으로 비슷한 클래스를 유지해야한다는 것입니다.

답변

2

다가오는 Cocos2D Essential Reference에서 cocos2d의 sample chapter about how draw order works입니다 (자세한 내용은 곧 내 블로그를 참조하십시오). 여기

순서를 그리는 방법에 대한 간략한 요약 작동의 : 노드가 동일한 부모가

  • : 노드가 그려집니다 : 노드가 가장 낮은에서 높은 zOrder를 당겨진다 노드가 동일한 부모와 같은 zOrder를이
  • 순서대로 그들은 순서대로 그려집니다 다른 부모의
  • 노드는 자신의 부모 노드가 빼앗아

가장 중요한 일을 그려 자식으로 추가되었다 그 zOrder는 같은 레벨의 자식 노드에만 영향을줍니다. 장면에 두 개의 자식 노드 A와 B가 있고 A가 먼저 그려지면 A의 모든 자식 노드도 노드 B 아래에 그려집니다.

+0

감사합니다. 환상적인, 매우 유용한 참조 :). 온라인 최종 가이드의 전체 버전을보기 위해 기다릴 수 없습니다. :). – mm24

1

드로잉 요소가 zOrder 속성과 동일한 순서로 그려지는 동안, zOrder가 -3 인 항목은 zOrder가 -2 인 항목 앞에 그려지 며, zOrder가있는 항목은 zOrder가 0 인 항목 뒤에 그려지는 식으로 그려집니다. . 모든 노드의 내용이 그려지기 때문에 모든 노드가 하나의 노드 내부에서 작동합니다. draw 메서드입니다. CCNode의 visit 메소드를 확인하면 코드에 나타납니다.

이렇게 서로 다른 "심도"관련 게임 개체를 추가 할 수 있도록 다른 레이어를 만들 수 있습니다. 예를 들어, 배경 레이어, 장애물 레이어, 적과 영웅을위한 레이어, 보너스 레이어 등

1

Morion은 CCNodezPosition에 대한 의구심을 분명히 나타냅니다. 그러나 두 번째 질문에 대한 답을 추가하고 싶습니다.

GameScene에 두 개의 배경 레이어가있는 것은 정확합니다. 특히 구름과 지형이 상호 작용하지 않거나 동일한 코드를 공유하지 않는 경우에 특히 적합합니다. 이것은 실제로 코드 분리 및 모듈성 측면에서 더 나을 것입니다. IMHO. 우리는 단지를 추가 할 부모를 부르는,

// Don't call this in the init, since the parent is obviously nil there... 
[[self parent] addChild:cloud z:kBackgroundLayerCloudsZ tag:kBackgroundLayerCloudsTag]; 

주의 사항 : (때문에 어떤 이유) 하나 개의 클래스로 만들 좋아하면

그러나, 당신이해야 할 모든 통화이다 자식을 가지고 있으며 우리는 레이어를 유지하는 데 도움이되는 미리 정의 된 상수를 가지고 있습니다. 나중 단계에서 중간 배경 레이어를 추가하려는 경우 상수를 변경하고 새 레이어에 대해 새 레이어를 추가하십시오.

이 방법을 많이 사용하지만 TBH, 두 가지 클래스가 더 좋을 것이라고 생각합니다. 이 접근법을 사용하는 경우는 을 사용하여 스프라이트를 레이어로 분리하고 (더 나은 유지 관리, 코드 분리 등) 다른 레이어의 스프라이트를 인터리브하는 경우가 있습니다 (때로는 스프라이트가 layer1이 위에 있고, 때로는 layer2의 스프라이트가 위에 있습니다).