我有一个问题,我想制作一个动画,让我的 CCSprite 在屏幕上移动(Repeateforever),但对我来说最重要的是当我的对象穿过屏幕(例如一个球)并且它开始消失我想在屏幕的另一部分看到那部分,有可能吗?
库巴。
我有一个问题,我想制作一个动画,让我的 CCSprite 在屏幕上移动(Repeateforever),但对我来说最重要的是当我的对象穿过屏幕(例如一个球)并且它开始消失我想在屏幕的另一部分看到那部分,有可能吗?
库巴。
使用此代码:
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];
您的意思是小行星式:物体离开屏幕一侧的区域并在正好相反的一侧进入屏幕。可能在两个(或全部四个)屏幕边框上部分显示。
是的,这是可能的,但不能不使用 2 或 4 个精灵。如果您的精灵只能向左/向右或向上/向下离开屏幕,则 2 个精灵就足够了。如果你想要一个完整的环绕屏幕边框类型的世界,你需要有 4 个精灵。
一般的想法是使用精灵的 contentSize 和屏幕大小来测试精灵是否(部分)离开了屏幕。然后在加或减屏幕宽度和/或高度的位置显示其他精灵,使它们看起来好像精灵从一个边框无缝环绕到另一个边框。
角落需要 4 个精灵。想象一下精灵的中心点正好在 0,0,这意味着精灵的右上四分之一被绘制在左下角。如果世界在屏幕边界处环绕,您应该会在左上角、右上角和右下角看到精灵的其他部分。
不,没有任何技巧可以让你只用一个精灵来做到这一点。您需要 2 或 4 个并将它们的位置与“主”精灵同步。
我曾经实现过这个。我将按原样发布更新“sprite doubles”属性的代码,不能保证,它不是复制粘贴解决方案。它确实显示了如何同步精灵的总体思路。双打存储在一个数组中,其中有四个:
-(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;
}
}