질문이 있습니다. 화면을 가로 질러 CCSprite를 움직이는 애니메이션을 만들고 싶지만 (Repeateforever) 가장 중요한 것은 내 물체가 화면 (예 : 공)을 가로 지르고 그 화면의 반대편에있는 부분이 보이길 원합니다.화면에서 스프라이트를 이동하는 방법은 무엇입니까? cocos2d
쿠바.
질문이 있습니다. 화면을 가로 질러 CCSprite를 움직이는 애니메이션을 만들고 싶지만 (Repeateforever) 가장 중요한 것은 내 물체가 화면 (예 : 공)을 가로 지르고 그 화면의 반대편에있는 부분이 보이길 원합니다.화면에서 스프라이트를 이동하는 방법은 무엇입니까? cocos2d
쿠바.
사용이 코드 :
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];
당신은 소행성 스타일을 의미 : 객체가 화면의 한쪽에 영역을 떠나 정확한 반대편에 화면을 시작합니다. 양쪽 (또는 모두 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;
}
}