SpriteStudio / SS5PlayerForCocos2d-x

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

v1.3.0 インスタンスパーツにユーザーデータコールバックを設定するとコールバックが2連続で呼ばれる #48

Open yukio55 opened 8 years ago

yukio55 commented 8 years ago

あるアニメーションのインスタンスパーツに対してユーザーデータコールバックを設定すると コールバック関数が2連続で呼ばれます。(フレーム番号は同じ)

そのインスタンスパーツを親アニメーションとして単体で表示した場合、正しく(一回のみ)コールバックが 呼ばれるため、データ自体には問題がないと思うのですが 2回呼ばれてしまうのをなんとか1回にできないでしょうか。

DKAlpha commented 8 years ago

ご報告ありがとうございます。 お手数ではございますがこちらで現象が確認できずにおります。 問題となっているユーザーデータコールバックが2回行われるアニメーションデータを github-spritestudio@webtech.co.jp あてに送っていただく事は可能でしょうか? sspjとプロジェクトに含まれるファイル一式(ssae,ssce,ssee,png)を送っていただけますと助かります。 ご検討ください、よろしくお願いいたします。

yukio55 commented 8 years ago

問題となる部分をピンポイントで再現するプロジェクトを作成しますので直ぐには返信できませんが 近いうちに送ります。 その際にはよろしくお願いします。

yukio55 commented 8 years ago

いや、そのまえに質問の仕方が悪かったので内容が正しく伝わっていないと思いました。 質問を正確に書き直します。

あるアニメーションに存在するインスタンスパーツのパーツにユーザーデータが設定されていますが、 このインスタンスパーツのパーツに設定されているユーザーデータのコールバックが親のアニメーションに コールバク関数を設定しても呼ばれません。

大元のアニメーションから見えれば孫なので管理外なのかも?と推測し、 アニメーションパーツに対してコールバック関数を設定したところ、 正しいタイミングで取得できるようになりました。

ですが2連続で呼び出されてしまいます。 2回呼ばれてしまうのをなんとか1回にできないでしょうか。

具体的にコードはこんな感じです。

int ix = ssplayer->indexOfPart("NewAnimation:anime_1_1"); ss::CustomSprite* sp = ssplayer->getSpriteData(ix); sp->_ssplayer->setUserDataCallback(CC_CALLBACK_2(HelloWorld::userDataCallback, this));

以上、よろしくお願いします。

DKAlpha commented 8 years ago

ソースアニメの方に設定したユーザーデータをアクセスしたいという事ですが、こちら https://github.com/SpriteStudio/SS5PlayerForCocos2d-x/issues/10 にあります通り、ソースアニメに設定したユーザーデータには対応しておりません。

getSpriteDataはpublicで定義されていますが、プレイヤー内部で使用するために作成した関数であり、それについてインスタンス用プレイヤーにアクセスする使用方法は想定していませんでした。 インスタンスパーツ内のプレイヤーは親から時間を指定されるためポーズ状態で待機しております、2回呼ばれるのはその影響ではないかと思います。

他の解決策もあるかもしれませんので、ソースアニメのユーザーデータを参照する意図をお聞かせいただけますでしょうか。 NULLパーツをインスタンスパーツの子に作成し、そこにデータを設定する事では難しいでしょうか?

DKAlpha commented 8 years ago

2回呼ばれる原因について調査してみましたが、おそらくゲームのFPSが60で稼働していて、作成したアニメーションのFPSが30であるために、同じフレームのユーザーデータが2回送信されるのだと思います。 インスタンスはプレイヤーがポーズ状態になっているため、プレイヤー内部でアニメーションの更新を行えない状態になっております。 よって、前回送信したフレームと今回送信するフレームが同じかはインスタンス用プレイヤー内部では判断が付かない状態です。 ゲーム側のコールバック内で同じフレームであればデータを捨てる等の処理を取得していただくのがよいかもしれません。

インスタンスアニメーションを独立させて、親アニメーション依存させずデータ取得したいという事であれば、パーツとなっているCustomSpriteがcocos2d::Spriteを継承していますので、ゲーム側で用意したプレイヤークラスをaddChildでパーツの子供として登録する事ができます。 void Player::setPartsParentage()関数ないで、インスタンス用プレイヤーをaddChildして関連つけています。 この形であれば、インスタンスアニメーションの再生停止制御やユーザーデータのコールバックも通常のプレイヤーの操作で行えるのではないかと思います。

yukio55 commented 8 years ago

お返事、大変参考になりました。

合体ロボやロケットパンチのような親アニメーションとしても使いたいしインスタンスパーツとしても 使いたいといった欲求からこのような質問内容になっていました。

ご教授頂いた内容から適切な実装を模索したいとおもいます。 ありがとうございました。