2011-09-15 4 views
0

CCSpriteBatchNode에 대한 객체 그룹을 식별 할 수 있기를 원하지만 해당 그룹의 하위 그룹을 식별 할 수 있기를 원합니다. 모든 병은 노란색되어 될 것이며, 병도 깨진로 태그 한 경우 작게 할 것 예에서이Cocos2d에서는 단일 객체에 여러 개의 태그를 사용할 수 있습니까?

CCArray *listOfGameObjects = [sceneSpriteBatchNode children]; 

for (GameObject *tempObject in listOfGameObjects) { 

    if ([tempObject tag] == kBottleTagValue) { 

      //make bottle yellow 

      if ([tempObject tag] == kBrokenBottleTagValue) { 
       //also make bottle smaller 
      } 
    } 
} 

비슷한 일을합니다. 깨진 병은 kBottleTagValue와 kBrokenBottleTagValue 태그가 필요합니다. 이것을 할 거리가 있습니까? 두 태그를 추가하려고하면 실패합니다.

답변

5

예 비트 마스크를 사용하면됩니다. 예를 들어 그런 태그를 정의

CCArray *listOfGameObjects = [sceneSpriteBatchNode children]; 
for (GameObject *tempObject in listOfGameObjects) 
{ 
    if ([tempObject tag] & kBottleTagValue) 
    { 
      //make bottle yellow 
      if ([tempObject tag] & kBrokenBottleTagValue) 
      { 
       //also make bottle smaller 
      } 
    } 
} 
:

[yoursprite setTag:kBottleTagValue|kBrokenBottleTagValue]; 

은 스프라이트가 그런 일을 수행하여 깨진 병을 경우 당신이 확인할 수 있습니다 완료하려면 :

enum 
{ 
    kBottleTagValue = 1 << 0; 
    kBrokenBottleTagValue = 1 << 1; 
}; 

이 그런 다음 스프라이트 태그

도움이되기를 바랍니다.

1

나는 실제로 Cocos2d를 알지 못하지만 빠른 읽기를 기반으로 GameObject을 우회하여 CCNode에서 로터리 경로를 찾았습니까? 이 경우 tag 필드는 정수입니다. 여러 값을 저장할 수는 없지만 비트 필드로 사용할 수 있습니다. 그런 다음, 예를 들어, 같은 유형을 지정 것

#define kTagValueBottle   0x0001 
#define kTagValueBroken   0x0002 
#define kTagValueAnotherAttribute 0x0004 
#define kTagValueAThirdAttribute 0x0008 
#define kTagValueAFourthAttribute 0x0010 
/* etc */ 

: 예를 들어

object.tag = kTagValueBottle | kTagValueBroken; 

은 그래서 새로운 태그와 비트 OR kTagValueBottlekTagValueBroken, 저장을의를 계산합니다. 또한 비트 OR 사용하여 언제든지 속성을 추가 할 수 있습니다

object.tag |= kTagValueBroken; 

을 아니면 비트를 사용하여 제거하고 역 마스크 :

object.tag &= ~kTagValueBroken; 

당신은 테스트와 직접 비교 테스트를 대체 할 것 개별 비트 단위를 통해 비트 AND :

// if ([tempObject tag] == kBottleTagValue) // old test 
if ([tempObject tag] & kBottleTagValue) // new test 

이 애플이 UIViewautoresizingFlags 같은 속성에 사용하는 시스템의 같은 종류이다.

Objective-C가 아닌 PHP에서 예제 코드를 처리 할 수 ​​있다면,이 seemed이 날씬한 피킹에서 비롯된 것으로 보아도 Google을 통해 빠르게 찾을 수있는 가장 유용한 기사가 될 것입니다.

2

비트 마스킹을 사용하면 잔인하며 태그 속성을 남용 할 필요가 없습니다.

말하기 : : 클래스에 부울 속성을 추가하고 첫 번째 논리 게이트에 if ([tempObject isClass:[BottleClass class]])을 사용할 수 있습니다.

관련 문제