SpriteStudio / SS5PlayerForCocos2d-x

OPTPiX SpriteStudio 5 で制作したアニメーションデータを Cocos2d-x v3 v2 上で再生するためのプログラムです。
MIT License
8 stars 7 forks source link

v1.3.0 アニメーションに含まれるインスタンスパーツを個別に制御する方法がわかりません #47

Open yukio55 opened 8 years ago

yukio55 commented 8 years ago

ss:PlayeのindexOfPart("パーツ名")でパーツ名からパーツインデックスを取得 ss::CustomSprite* sp = player->getSpriteData(index)で任意のパーツCustomSpriteを取得、

インスタンスパーツの場合はCustomSprite._state.cellIndex が -1になっていて CustomSprite._ssplayerにインスタンスパーツのss:Playeが割り当てられている。

例えばgetSpriteDataで取得したCustomSprite._ssplayer.animePause()を呼び出すことにより インスタンスパーツのみアニメーションを停止させれらるかと思ったのですが そのような挙動にはなりません。

何か根本的に認識がちがうのでしょうか? このような場合、どう実装したらよいのでしょうか?

DKAlpha commented 8 years ago

現状の実装ではインスタンスパーツ内のアニメーションを再生や停止させるような制御をアプリケーション側に提供しておりません。

これはインスタンスパーツ内のソースアニメの再生位置は、配置されたアニメーションの表示フレームとFPSによって確定する、というSpriteStudioの仕様によるためです。

親パーツの条件によって表示位置がきまるためプレイヤー内部で再生時間を管理していません。 インスタンスパーツ内のプレイヤーは生成後ポーズした状態で待機しており、アップデートで親パーツが表示フレームからソースアニメの再生フレームを算出して指定しております。 インスタンスパーツは独立動作の場合であっても配置されたアニメーションのFPSを使用して再生位置を決定します。 3146行目 //インスタンス用SSPlayerに再生フレームを設定する sprite->_ssplayer->setFrameNo(_time); で再生するフレームを親から指定しています。

インスタンスパーツをアニメとは個別に停止したい場合、親パーツが指定する時間を上書きする必要があります。 考えられる方法としては、 SpriteStudioの方でインスタンスパーツのインスタンスアトリビュートで独立動作を設定します。 プレイヤーにインスタンスの更新を有効、無効にするようなフラグを設けます。 3075行目で sprite->_liveFrame += delta; と書かれている行が独立動作時に時間を進める処理なので、フラグによって時間を加えない様にします。 sprite->_liveFrameが更新されなければアニメーションは停止しますので、この部分を制御できるように改造する必要があるのだろうと思います。

yukio55 commented 8 years ago

お返事ありがとうございます。 上記の回答、大変参考になりました。

インスタンスパーツからgetInstanceParamでインスタンスパラメータを取得して StartFrameとEndFrameに静止したいフレーム数 (その時点での停止であればCustomSprite->_ssplayer->getFrameNo()の値)を入れ setInstanceParamで上書きすることにより実装できました。

回答にあるようにインスタンスパーツのフレーム数は親によって制御されているので、 インスタンスパラメータを元に戻しても任意のフレームからの再開は無理でしたが。