我怎样才能在Cocos2d中生长草?

时间:2012-02-29 16:59:23

标签: xcode cocos2d-iphone ccsprite

我正试图通过将相同的小精灵发芽500次来使一片草地生长。我试图实现的效果是每个单独的草丛将会增长(在这种情况下是scaleY),并且该场将在3秒的时间内完整。我正在使用CCSpriteBatchNode,我现在正在阅读它并不是一个只使用一个精灵文件的有效方法。这是我的代码,它给了我想要的效果,但我无法获得我想要的速度。

    //GRASS batchNode
    CCSpriteBatchNode *grassBatch1 = [CCSpriteBatchNode batchNodeWithFile:@"grass1.png" capacity:500];
    grassBatch1.position = CGPointMake(0, -10);
    [self addChild:grassBatch1 z:1 tag:201];
    for (int x=0; x<500; x++) 
    {
        CCSprite *s = [CCSprite spriteWithBatchNode:grassBatch1 rect:CGRectMake(0, 0, 32, 32)];
        [s setOpacity:255];
        [grassBatch1 addChild:s];
        [s setPosition:ccp(arc4random()%1024-0, arc4random()%75-0)];
        [s setScaleY:0];
        [s setAnchorPoint:CGPointMake(0, 0)];
        CCScaleTo *grassScale = [CCScaleTo actionWithDuration:0.4 scale:1];
        CCEaseElasticOut *grassBounce = [CCEaseElasticOut actionWithAction:grassScale period:0.2f];
        CCDelayTime *grassDelay = [CCDelayTime actionWithDuration:random()%500];
        [s runAction:[CCSequence actions:grassDelay,grassBounce, nil]];
    }

在CCDelayTime中,500数字会使每个块单独动画,但每秒会产生1个团块。如果我将该数字设为10,那么它将500个团块组合成10个组,并且每组每组1个动画。我想让每个丛(或一组丛)在3秒的过程中均匀地定时动画。最重要的是在一个方向上制作动画,就像波浪效果一样,草从左到右或从下到上开始生长。

有没有更好的方法来生产使用相同.png文件的500个单独增长的精灵?

修改

好的,所以我想我需要更好地理解random()%和后面的整数的使用。我在持续时间部分得到500,确实会将动画推到500秒。我想使用少于1,并且小数值(例如0.6)被拒绝。分数显然有效。为了得到接近我正在努力的东西,我对上面的代码进行了以下调整。

首先,我在比例操作中添加了一个随机数字:

CCScaleTo *grassScale = [CCScaleTo actionWithDuration:random()%7 scale:1];

然后在延迟时使用了一小部分:

CCDelayTime *grassDelay = [CCDelayTime actionWithDuration:random()%1/20];

我知道走这条路来实现我想要的效果对要管理的设备非常重要。在iPad2上,我的帧速率从60降至48,然后相当快地回到60,但CPU使用率从20%左右增加到85%。主要的视觉缺点是从前一场景转换到这一场景的延迟。较小的设备无疑会遇到更多延迟和帧速率下降。

我知道这可能不是接近这个动画的正确方法。并且,我仍然喜欢在这上面进行滚动或波浪式动画,以便它在一个方向上移动。有没有人对这种影响有任何想法?

编辑2:

这是根据andrewx的建议尝试的代码:

    for (int i = 0; i < 500; i++) 
    {
        CCSprite *grassClump = [CCSprite spriteWithFile:@"grass1.png"];
        grassClump.anchorPoint = CGPointMake(0.5, 0);
        grassClump.position = ccp(arc4random()%1024-0, arc4random()%180-0);
        grassClump.scaleY = 0;
        CCScaleTo *grassScale = [CCScaleTo actionWithDuration:random()%7 scale:1];
        CCEaseElasticOut *easeGrassScale = [CCEaseElasticOut actionWithAction:grassScale period:0.3f];
        CCDelayTime *grassDelay = [CCDelayTime actionWithDuration:random()%5];
        [self addChild:grassClump z:5];
        [grassClump runAction:[CCSequence actions:grassDelay, easeGrassScale, nil]];
    }

它与我之前的代码完全相同,但避免使用精灵批处理节点,这可能是一件好事。我没有测试性能,看看这是否有所改善。

1 个答案:

答案 0 :(得分:1)

你可以画一个或几个单独的草叶,随机选择它们:

CCSprite *leaf=[CCSprite spriteWithSpriteFrameName:[NSString stringWithFormat:@"grass%i.png",arc4random%5+1]];

此示例假设您有5个不同的叶子可供随机选择,您可以在循环中迭代这个叶子,将leaf添加到您的父亲中,就像您想要草叶一样多次。

然后,无论是单独还是在同一个循环中,添加一个CCMoveTo以从下面向上推动叶子,因此它们似乎正在增长。您可以同时添加CCScaleTo,以便它们同时执行这两项操作。会有很好的效果。