0

我有一个问题,我想制作一个动画,让我的 CCSprite 在屏幕上移动(Repeateforever),但对我来说最重要的是当我的对象穿过屏幕(例如一个球)并且它开始消失我想在屏幕的另一部分看到那部分,有可能吗?

库巴。

4

2 回答 2

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];
于 2012-07-07T12:47:32.937 回答
1

您的意思是小行星式:物体离开屏幕一侧的区域并在正好相反的一侧进入屏幕。可能在两个(或全部四个)屏幕边框上部分显示。

是的,这是可能的,但不能不使用 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;
    }
}
于 2012-07-07T12:55:42.343 回答