如何在屏幕上移动精灵?的cocos2d

时间:2012-07-07 12:28:10

标签: objective-c animation cocos2d-iphone

我有一个问题,我想制作一个动画,它将我的CCSprite移动到屏幕上(Repeateforever)但对我来说最重要的是当我的对象跨越屏幕时(例如一个球)及其开始消失我想看到屏幕对面的部分是否可能?

库巴。

2 个答案:

答案 0 :(得分: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 :(得分:1)

你的意思是小行星风格:物体离开屏幕一侧的区域,并在完全相反的一侧进入屏幕。可能部分显示在两个(或所有四个)屏幕边框上。

是的,这是可能的,但不是没有使用2或4个精灵。如果您的精灵只能向左/向右或向上/向下离开2个精灵就足够了。如果你想要一个完整的环绕式环绕式世界,你需要有4个精灵。

一般的想法是使用精灵的contentSize和屏幕大小来测试精灵是否(部分地)离开了屏幕。然后在屏幕宽度和/或高度的位置显示其他精灵,使它们看起来好像精灵从一个边框无缝地包裹到另一个边框。

角落需要4个精灵。想象一下精灵的中心点正好在0,0,这意味着精灵的右上四分之一是在左下角绘制的。如果世界环绕屏幕边界,你应该在左上角,右上角和右下角看到精灵的其他四分之一。

不,没有技巧只能用一个精灵来做到这一点。你需要2或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;
    }
}