質問があります。CCSprite を画面上で移動するアニメーションを作成したいのですが (Repeatforever)、私にとって最も重要なことは、オブジェクトが画面上を横切り (ボールなど)、動き始めていることです。その部分が画面の反対側にあるのを見たいのですが、それは可能ですか?
くば。
質問があります。CCSprite を画面上で移動するアニメーションを作成したいのですが (Repeatforever)、私にとって最も重要なことは、オブジェクトが画面上を横切り (ボールなど)、動き始めていることです。その部分が画面の反対側にあるのを見たいのですが、それは可能ですか?
くば。
あなたは小惑星スタイルを意味します:画面の片側に領域を残し、正反対の側に画面に入るオブジェクト。おそらく両方(または4つすべて)の画面境界に部分的に表示されます。
はい、それは可能ですが、2つまたは4つのスプライトを使用しないとできません。スプライトが画面を左/右または上/下にのみ残すことができる場合は、2つのスプライトで十分です。画面境界での完全なラップアラウンドタイプのワールドが必要な場合は、4つのスプライトが必要です。
一般的な考え方は、スプライトのcontentSizeと画面サイズを使用して、スプライトが(部分的に)画面を離れたかどうかをテストすることです。次に、他のスプライトを画面の幅や高さのプラスまたはマイナスの位置に表示して、スプライトが1つの境界から別の境界にシームレスに折り返されているように見せます。
コーナーには4つのスプライトが必要です。スプライトの中心点が正確に0.0にあると想像してください。これは、スプライトの右上の4分の1が左下隅に描画されていることを意味します。画面の境界で世界が折り返されている場合は、スプライトの他の4分の1が左上、右上、右下の隅にも表示されるはずです。
いいえ、単一のスプライトだけでこれを実行できるトリックはありません。2つまたは4つ必要で、それらの位置を「マスター」スプライトと同期させます。
私はかつてこれを実装しました。「スプライトダブル」プロパティをそのまま更新するコードを投稿します。保証はなく、コピーアンドペーストソリューションではありません。スプライトを同期する方法の一般的な考え方を示しています。ダブルスは配列に格納され、次の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;
}
}
このコードを使用します:
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];