Help us understand the problem. What is going on with this article?

SpineをStarling1.7で使う:SkeletonAnimationの(変な)特徴

More than 3 years have passed since last update.

地味投稿です。
SkeletenAnimation(=DisplayObjectです)は普段Starlingを使っていると、ちょっと予想をしない動きをする構造なので、ここに投稿としてまとめておきます。

DisplayObjectContainerではない

DisplayObjectではありますが、DisplayObjectContainerを継承していません。中に各ボーン(スロット)のパーツが存在するので、DisplayObjectContainerであるイメージがありますが、違います。各パーツはメッシュ(ポリゴン)として描画されます。
なお、SkeletenAnimationはSkeletenSpriteを継承していて、SkeletenAnimationはDisplayObjectを継承しています。Spriteって名前をつけないで欲しい感じですが、他と合わせているんでしょうか。

SkeletonImageは画面に表示されない

SkeletonImageというImageを継承したクラスが内部処理で使われてますが、SkeletenAnimationはDisplayObjectContainerではないので中にaddChildされません。ではなぜImageを継承しているのか?単純に考えるとテクスチャ情報だけ持っていれば良さそうですが、、その方が便利だったのか、歴史的な経緯なのか。

大きさが常に0を返す

width、heightが常に0を返します。getBounds()で取得したRectangleを見てもx、y値は正しく存在しますが、width、heightが0です。続くhitTest処理では真面目にBounds計算をしているので、なぜこのようになっているのか考えると、パフォーマンスのためではないのかなと思います。boundsの計算はなかなかに処理が重たそうです。アニメーションをして絶えず大きさが変わる事を考えると、こうなるのも致し方ないのか。。とも思えますが、ここを知らないで大きさが0で帰ってくると、面食らいますね。

タッチ/クリック判定は全体のバウンディングBOXで行われる。

スクリーンショット 2016-06-25 0.22.52.png
例ですが、このキャラの場合、

スクリーンショット 2016-06-25 0.21.39.png
各パーツの画像を赤い四角で表すとこのような状態になるのですが、タッチ判定はこの赤い部分ではなく全体のバウンディングBOXに対して行われます。

スクリーンショット 2016-06-25 0.21.39_.png
図にすると、この青いBOX領域で値判定が行われます。パーツが回転していると予想より広い範囲に反応するの注意です。なお、画像パーツ(=りジョンアタッチメント)でなく、メッシュアタッチメントに対してもあたり判定が行われますが、全体のバウンディングBOXであたり判定がまとめて行われうのは同じです。(の、ようです。コードを見る限り。)

このバウンディングBOXを計算する処理は複雑なパーツ構成をもつSkeletenAnimationでは、けっこうな高負荷になりそうなので、SkeletenAnimationのtouchableはfalseにして、自前で座標値などからあたり判定を行うことを推奨したく思います。なお、特定の画像領域などとあたり判定演算をする方法は別記事にまとめる予定です。

フィルタを適用すると消えて無くなり見えなくなる

な ん て こ と だ ! !

まとめぽい事

spine-starlingランタイムspine-as3ランタイムを利用する形で、作られています。spine-as3は基本的なSpineランタイム部分を担当し、NativeのDisplayObjectをSkeletonのViewとして使います。spine-starlingはそのView部分の実装をStarlingのDisplayObjectにすげ替えたものです。spine-as3のSkeletonSpriteは、Spriteの中に各SlotとしてBitmapがたくさん含まれる構造になっていますね。素直なつくりで扱いやすそうですが、ソースを見る限り、spine-as3は メッシュアニメーションをサポートしていないので、実行速度もあわせて考えると、やはりspine-starlingを使う事になりそうです。メッシュを扱うので、ちょっと特殊な作りになっているのかなと思っています。

ところが上に述べたように、SkeletenAnimationは若干残念な作りです。もちろんSpineランタイムは素晴らしいものですが、コア部分が良いだけに余計に悔やまれます。コアなランタイム部分に手を入れるのは大変ですが、幸いspine-starling部分だけなら、カスタマイズするのは辛くないので、自分のスタンスとしては、spine-starling側で使いづらい部分は積極的にカスタマイズしていく心づもりです。特にフィルタのところはなんとかしたいですが、、。

とはいえ、そろそろStraling2.0用のランタイムも作り始めてくれそうなので、可能であればそちらに要望も出してみようと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away