graphics.drawGraphicsData (2)
2009/06/05 20:33 - AS3.0
graphics.drawGraphicsData のやることは実に簡単明瞭。 簡単なのは良いことなんですが、でもその流れを見ると何だかなぁ…… と思わないでもない。
今まで使っていた Graphics クラスのメソッドを単純にクラスに置き換えてるだけです。
ここで再び Flash Player 9 での図形描画を以下に掲げます。 線と塗りのある図形の描画です。
で、3~7行目のコマンドと座標の指定は graphics.drawPath でパッケージングして、以下のようにコードを簡略化できることは先にやりましたね。
上記の4行のコードは、1行ごとにそれぞれひとつの機能を担っています。 上から「塗りの指定と開始」「線の指定」「パスの指定」「塗りの終了」という機能。
graphics.drawGraphicsData を使う場合は、その各機能をメソッドからクラスに置き換えるわけです。 以下のような対応になります。
メソッド | クラス |
---|---|
graphics.beginFill() | GraphicsSolidFill |
graphics.lineStyle() | GraphicsStroke |
graphics.drawPath() | GraphicsPath |
graphics.endFill() | GraphicsEndFill |
厳密にいうと lineStyle と GraphicsStroke は単純な対応ではありません。 これについては次回あたりで述べます。
で、このメソッドを置き換えたクラスを Vector 配列に突っ込みます。 Vector 要素として指定するクラスは IGraphicsData。 以下のような感じです。
ところでこの drawGraphicsData の引数となる Vector は、ややブービートラップっぽい仕様あり。
それは Vector への格納の順番です。
ここで再び drawPath を使用したときのコードを示します。
上記コードは入れ替え可能な行と入れ替え不可能な行がありますよね。
1行目(塗りの指定)と2行目(線の指定)はどっちが先でも問題ありません。 しかし3行目と4行目はそれぞれこの位置以外はあり得ません。
drawPath は beginFill と lineStyle が記述された後でないと期待どおりの動きをしないし、endFill は最後固定ですから。
で、drawGraphicsData の引数となる Vector への格納順ですが、これに準じます。
drawPath を使用したコードで順番を入れ替えると期待どおりにならないのと同様、Vector への格納順はセンシティブです。
たとえば以下のような記述(path と stroke を入れ替えた)をすると塗りは描かれますが、線は描かれません。
これは、moveTo、lineTo を使ったときも同じですよね。 lineTo が終わった後に lineStyle を置くと線が描かれません(ビミョーにウソですが、これについては回を改め後述すると思います)。
コレクションに突っ込む要素の順番がセンシティブだなんて、オブジェクト指向的に如何なものかと思わないでもないけれど、そういう仕様なんで仕方ありませぬ。
関連エントリー