2012-07-07 4 views

답변

1

사용이 코드 :

CCSprite *sprite = [CCSprite spriteWithFile:@"Actor.png"]; 
[self addChild:sprite]; 

CGSize size = [[CCDirector sharedDirector] winSize]; 
sprite.position = ccp(0, size.height/2.0f); 

id move  = [CCMoveTo actionWithDuration:2.0f position:ccp(size.width, size.height/2.0f)]; 
id moveBack = [CCMoveTo actionWithDuration:2.0f position:ccp(0, size.height/2.0f)]; 
id sequence = [CCSequence actions:move, moveBack, nil]; 
id repeate = [CCRepeatForever actionWithAction:sequence]; 

[sprite runAction:repeate]; 
1

당신은 소행성 스타일을 의미 : 객체가 화면의 한쪽에 영역을 떠나 정확한 반대편에 화면을 시작합니다. 양쪽 (또는 모두 4)의 화면 경계에 부분적으로 표시 될 가능성이 있습니다.

네, 가능 합니다만 2 개 또는 4 개의 스프라이트를 사용하지 않아도됩니다. 스프라이트가 왼쪽/오른쪽 또는 위/아래 방향으로 만 화면을 떠날 수 있다면 2 개의 스프라이트로 충분합니다. 화면 경계선을 완벽하게 처리하려면 4 개의 스프라이트가 필요합니다.

일반적인 생각은 스프라이트의 contentSize 및 화면 크기를 사용하여 스프라이트가 (부분적으로) 화면을 벗어 났는지 여부를 테스트하는 것입니다. 그런 다음 다른 스프라이트를 화면 너비 및/또는 높이를 플러스 또는 마이너스로 표시하여 스프라이트가 한 테두리에서 다른 테두리로 자연스럽게 감싸는 것처럼 보이게하십시오.

모서리에는 4 개의 스프라이트가 필요합니다. 스프라이트의 중심점이 정확하게 0,0이라고 가정하면 스프라이트의 오른쪽 위 1/4이 왼쪽 하단 모서리에 그려진다는 것을 의미합니다. 월드가 화면 경계에서 랩하는 경우 스프라이트의 다른 부분은 왼쪽 위, 오른쪽 위 및 오른쪽 아래 모퉁이에서도 볼 수 있습니다.

아니, 단 하나의 스프라이트만으로이 작업을 수행 할 수있는 트릭이 없습니다. 2 또는 4가 필요하고 "마스터"스프라이트와 위치를 동기화하십시오.

한 번 이것을 구현했습니다. 나는 "sprite double"프로퍼티를 그대로 업데이트하는 코드를 게시 할 것이고 아무런 보증도하지 않으며 복사 - 붙여 넣기 솔루션이 아닙니다. 스프라이트를 동기화하는 방법에 대한 일반적인 아이디어를 보여줍니다. 복식은 배열로 저장되며 그 중 4 개가 있습니다.

-(void) updateSpriteDoublesProperties 
{ 
    CCSprite* sprite = (CCSprite*)self.owner.node; 

    for (int i = 0; i < kNumOpposingSprites; i++) 
    { 
     CCSprite* spriteDouble = spriteDoubles_->arr[i]; 
     spriteDouble.rotation = sprite.rotation; 
     spriteDouble.scale = sprite.scale; 
     spriteDouble.flipX = sprite.flipX; 
     spriteDouble.flipY = sprite.flipY; 

     CGPoint pos = self.owner.node.position; 
     CGPoint oppositePosition = pos; 

     if (i == 0 || i == 1) 
     { 
      if (pos.x > boundaryCenter_.x) 
      { 
       oppositePosition.x = pos.x - (boundary_.size.width - boundary_.origin.x); 
      } 
      else 
      { 
       oppositePosition.x = pos.x + (boundary_.size.width - boundary_.origin.x); 
      } 
     } 
     if (i == 0 || i == 2) 
     { 
      if (pos.y > boundaryCenter_.y) 
      { 
       oppositePosition.y = pos.y - (boundary_.size.height - boundary_.origin.y); 
      } 
      else 
      { 
       oppositePosition.y = pos.y + (boundary_.size.height - boundary_.origin.y); 
      } 
     } 

     spriteDouble.position = oppositePosition; 
    } 
} 
관련 문제