0

特定のタイプのスプライトを何度もインスタンス化するゲームを作成しています。このスプライトには単純なループ アニメーションが含まれるため、アニメーション プロセスを駆動するために使用される関連付けられたスプライト イメージを利用してキャッシュCCSpriteFrameCacheする必要があると思います。CCSPriteBatchNode

Raywenderlich.com でよく参照されるHow To Use Animations and Sprite Sheets in Cocos2Dを読んでいて、そのプロセスをほぼ理解しています。

私の問題は、シーン ファイルのコード内にアニメーション シーケンス全体が含まれていることです。CCSprite私が作成した子、クラス (または同様のクラス) 内にこの同じコードを配置する方法と、ゲーム シーン内でこの自己完結型のスプライトを使用する方法を解釈するのに問題があります。

言い換えれば、CCSpriteシーンの実装内でインスタンス化できる子クラスを持つことが私の望みです。いくつかのパラメーターが子のコンストラクターに渡され、CCSpriteスプライトがゲーム シーンに追加されると、スプライトのアニメーションがシーン コードとは別に自動的に発生します。

これどうやってするの?

(非) 明確化のポイントまたはなぜ私が混乱しているのか

Ray のチュートリアルのステップ 2 でCCSpriteBatchNode、アニメーション化されたスプライトに使用される をself(ゲーム シーンの)子として追加するように指示しています。子クラスの実装CCSpriteBatchNode内でを定義した場合、私の親シーンに?これを(正しく)どのように行うべきですか?CCSpriteCCSpriteBatchNode

また、シングルトン クラスの場合、コンストラクターCCSpriteFrameCacheに追加する際に問題が発生しますか?それとも、アプリケーションの初期化などでこれを 1 回だけ呼び出す必要がありますか?[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"my_sprite.plist"];CCSprite

一般的に、私はただ混乱しています。シーンに (複数回) 追加できる自己完結型のアニメーション スプライトを作成するにはどうすればよいでしょうか。また、シーンはアニメーション シーケンスの配線について心配する必要がなく、小さな iOS プロセッサの速度が低下することもありません。

この問題をどのように解決するかはあまり気にしません。たぶん、私は間違っているだけのいくつかの壮大な仮定をしました。最終結果が上記のとおりである限り、私はこの問題を解決するために別の方法をとります。

ありがとうございました!

4

1 に答える 1

2

実際には、結果のスプライトはバッチ ノードの子である必要があります (逆ではありません)。バッチ ノードは、ドロー コールを単一のコールに「バッチ処理」するために使用される単なるウィジェットです。要件は、そのすべての子 (この場合はアニメーション化されたスプライト) がバッチ ノードと同じテクスチャから派生することです。バッチ ノードを使用する必要がある唯一の理由は、同じテクスチャから多くのアニメーションを作成する予定があるためです。アニメーションは、バッチ ノード自体とは関係ありません。

だから、あなたのシーンで:

  • バッチ ノードを作成する
  • バッチ ノードを子としてシーンに追加します。
  • 追加する各スプライトを作成します。
    • CCSprite を拡張して、ctor でアニメーションを作成することができます。
    • アニメーションを自分自身でクリーンアップしたい場合は、CCSequence を使用します (以下に示すように)。あなたの場合、スプライトはアニメーションのスプライト 1 である可能性があり、アクションの 1 つは CCAnimate アクションになります。
  • それらをバッチ ノードに追加します。

順序 :

CCSprite *icn = [CCSprite spriteWithFile:[NSString stringWithFormat:@"%@_enabled.png", sk.skillIconPrefix]];
[icn setBlendFunc:(ccBlendFunc) {GL_SRC_ALPHA, GL_ONE}];

icn.opacity = 0;
id fadein = [CCFadeTo actionWithDuration:.5 opacity:165];
id fademax = [CCFadeTo actionWithDuration:.05 opacity:255];
id stallmax = [CCDelayTime actionWithDuration:.05];
id fadeback = [CCFadeTo actionWithDuration:.05 opacity:165];
id stall = [CCDelayTime actionWithDuration:.5];
id fadout = [CCFadeTo actionWithDuration:2.5 opacity:0];
id clean = [CCCallBlock actionWithBlock:^{
    [icn removeFromParentAndCleanup:YES];

}];

CGPoint pos = [self pointLocationOnMapForLocation:theTile.location];
icn.position = ccpAdd(pos, ccp(0, -15));
id enchiladas = [CCSequence actions:fadein, fademax, stallmax, fadeback, stall, fadout, clean, nil];
[icn runAction:enchiladas];

EDIT : 繰り返しアニメーション (クリーンアップなし) の場合、これは私のゲームの 1 つの例です。

CCAction *forever = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:anim]];
于 2013-02-25T14:13:57.247 に答える