我正试图通过将相同的小精灵发芽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]];
}
它与我之前的代码完全相同,但避免使用精灵批处理节点,这可能是一件好事。我没有测试性能,看看这是否有所改善。
答案 0 :(得分:1)
你可以画一个或几个单独的草叶,随机选择它们:
CCSprite *leaf=[CCSprite spriteWithSpriteFrameName:[NSString stringWithFormat:@"grass%i.png",arc4random%5+1]];
此示例假设您有5个不同的叶子可供随机选择,您可以在循环中迭代这个叶子,将leaf
添加到您的父亲中,就像您想要草叶一样多次。
然后,无论是单独还是在同一个循环中,添加一个CCMoveTo以从下面向上推动叶子,因此它们似乎正在增长。您可以同时添加CCScaleTo,以便它们同时执行这两项操作。会有很好的效果。