SpriteStudio / SS5PlayerForCocos2d-x

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

v1.3.2 cocos2d-x ver3.12で入れ子になっている場合、子要素パーツの座標がまったく変化しない場合、子要素パーツが親パーツに追随しない #57

Open mingos opened 8 years ago

mingos commented 8 years ago

環境

現象

以下のような入れ子のパーツがあり、青い三角形「b」は全てのフレームで座標がまったく変化しません。 sc01

Sprite Studio上で再生すると、親パーツの赤い丸「r」に正しく追随してくれますが、 cocos上で再生すると、青い三角形「b」は最初の位置からまったく動かず置き去りにされてしまいます。

DKAlpha commented 8 years ago

データの方受け取りました。こちらを調査しまして進展がありましたら報告させていただきます。

DKAlpha commented 8 years ago

原因が分かりましたので報告いたします。 SS5Playerではアトリビュート情報からマトリクスを作成し、Nodeのマトリクスに反映させてパーツの表示位置を再現しておりますが、 void Node::setAdditionalTransform(const Mat4* additionalTransform) 内で、Nodeのマトリクスの更新フラグ_transformDirtyがtrueとなっていたものがVer3.12から操作されなくなり、追従しなくなった、という事の様です。 対応方法を検討しておりますのでお待ちいただければと思います。

cocos2d-x Ver1.13.1のCCNode.cppを以下の様に変更すると動作する様です。

void Node::setAdditionalTransform(const Mat4* additionalTransform)
{
    if (additionalTransform == nullptr)
    {
        delete[] _additionalTransform;
        _additionalTransform = nullptr;
    }
    else
    {
        if (!_additionalTransform) {
            _additionalTransform = new Mat4[2];

            // _additionalTransform[1] is used as a backup for _transform
            _additionalTransform[1] = _transform;
        }

        _additionalTransform[0] = *additionalTransform;
    }
    _transformUpdated = _additionalTransformDirty = _inverseDirty = true;
    _transformDirty = true;    //この行を追加
}
mingos commented 8 years ago

さっそく調査して頂いてありがとうございます。 v3.12でCCNode.cppを上記の内容で修正したところ、パーツが追従する事を確認できました。

DKAlpha commented 8 years ago

developブランチにcocos側を変更せずに対応できるようにしたVer3.13.1対応プレイヤーをアップいたしました。 こちらを取得していただき動作を確認していただければと思います。 カラーブレンドが使用できない問題も解決されています。

mingos commented 8 years ago

CCNode.cppの修正を元に戻し、developブランチのSSPlayerを使用して正常にパーツが連動する事を確認しました。 ※現在、開発で使用しているcocosのバージョンがv3.12であり、 SSPlayer.cppのCustomSprite::setTexture()でコンパイルエラーが発生したため、 CustomSprite::setTexture()のオーバーライド部分をコメントアウトして検証しました。

v3.13.1についても後ほど検証してご報告します。

DKAlpha commented 8 years ago

ご報告ありがとうございます。 setTexture()の件Ver3.12では変更が入っていない事を把握しておりませんでした。 お手数をおかけしますがsetTexture()のオーバーライド部分をコメントにしご使用いただければと思います。

mingos commented 8 years ago

cocos v3.13.1でSSPlayerのdevelopブランチをそのまま適用して正常に動作する事を確認しました。 v3.12では、setTexture()のオーバーライド部分をコメントアウトして使用させて頂きます。 ご対応ありがとうございました。

DKAlpha commented 8 years ago

ご報告ありがとうございます。 今後ともSpriteStudioをよろしくお願いいたします。