私は、同じ小さなスプライトを500回発芽させて芝生の畑をアニメーション化しようとしています。私が達成しようとしている効果は、個々の草の塊が成長する(この場合スケールY)、フィールドは3秒間でいっぱいになるということです。私はCCSpriteBatchNodeを使用しています。これは、現在読んでいるのは、1つのスプライトファイルだけを使用する効率的な方法ではありません。ここに希望の効果を与える私のコードがありますが、私はスピードを得ることができません。Cocos2dで草の生育をアニメーション化するにはどうすればよいですか?
//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秒あたり1クランプになります。その番号を10にすると、500個の集団を10個のグループにまとめ、各グループを1秒間にアニメーション化します。私は、各塊(または塊の群)を3秒間に均等に時間をずらして1ずつアニメーション化したい。これの上にあるプラスは、波の効果のような方向にアニメートすることになるので、草は左から右または下から上へ成長します。
同じ.pngファイルを使用する個別に成長するスプライトを500個作成する方がよいでしょうか?
EDIT:
OK、私は、私はランダム()%と、次の整数の使用をよりよく理解する必要なんだろうね。私はその期間中に500を得て、実際にアニメーションを500秒に押し上げるでしょう。私は1未満を使いたい、小数点以下の値(例えば0.6)は拒否されました。分数は明らかに機能します。私が働いているものに近いものを得るために、上記のコードを次のように調整しました。
まず私は、スケールのアクションにランダムを追加しました:
CCScaleTo *grassScale = [CCScaleTo actionWithDuration:random()%7 scale:1];
をして、遅延に分数を使用:
CCDelayTime *grassDelay = [CCDelayTime actionWithDuration:random()%1/20];
私はこのルートを行くこと私が欲しい効果をacheiveすることを知っています管理するデバイスにかなり課税されています。 iPad2では、フレームレートが60から48に低下した後、かなり早く60に戻りますが、CPU使用率は20%から85%に増加します。主な視覚的欠点は、前のシーンからこのシーンへの移行の遅れです。少ないデバイスでは間違いなく、フレームレートの遅延と低下が増えます。
私はこれがおそらくこのアニメーションにアプローチする正しい方法ではないことを知っています。そして、私はまだそれが方向に移動するように、これにローリング、または波型アニメーションをしたいと思います。誰もこの効果について考えていますか?
EDIT 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]];
}
それは私の前のコードと同じに動作しますが、おそらく良いことですスプライトバッチノードを、回避。私はこれが改善かどうかを確認するためにパフォーマンスをテストしていません。この例では、ランダムから選択する5枚の葉を持っていると仮定し
CCSprite *leaf=[CCSprite spriteWithSpriteFrameName:[NSString stringWithFormat:@"grass%i.png",arc4random%5+1]];
を、そしてあなたがこのを反復処理できます。
私はこれらのスプライトを連続して表示させる方法を理解できません。私はこれを試みましたが、それでも上記と同じ効果があります。私はまだ性能比較をテストしていない。私は私の質問にあなたの提案に基づいてコードを掲載しました。 – BobbyScon
「逐次」とはどういう意味ですか?また、私はすべてのarc4randomを使用することをお勧めします、あなたは多くのランダム()があります。最後に、私の提案はバッチノードでもうまく動作します。 – johnbakers
申し訳ありませんが、逐次的には正しい単語ではありません。遅延を5に設定すると、500個のスプライトが5つのグループに分割され、アニメーションが完了した後、1つのグループがアニメーション化されます。たとえば、1番目のスプライトが10%のアニメーションを取得した後、2番目のスプライトが開始された後など、より流動的になります。各スプライト上での時間をずらしたアニメーションは、より良いフレーズかもしれません。 arc4randomとrandom()の比較では、私は失われています。私はこれを動作させるために数十の異なるフォーラムや例をコピーしてきましたが、違いや実際の作業の仕方を本当に理解していません。 – BobbyScon