2007年08月10日
beginFill と endFill のケーススタディ
Graphics クラスの beginFill と endFill あたりの挙動がよく分からなかったので調べてみた。
Case 1
package { import flash.display.*; public class erase extends Sprite { public function erase() { graphics.beginFill(0xff0000); graphics.drawCircle(0, 100, 100); graphics.drawCircle(100, 100, 100); graphics.drawRect(-30, 100, 300, 50); graphics.endFill(); } } }
奇数回重なっている部分が塗りつぶされているのが分かる。

XOR な領域が塗られる、と言い換えてもいいかもしれない。
Case 2
1つ目の円描画あとに endFill を持ってきてみる。
graphics.beginFill(0xff0000); graphics.drawCircle(0, 100, 100); graphics.endFill(); graphics.drawCircle(100, 100, 100); graphics.drawRect(-30, 100, 300, 50); graphics.endFill();
1つ目の円しか描画されない。

endFill を呼んだ段階で、塗りの情報は初期化されて、それ以降は endFill されても何も塗られないんだと推測できる。
Case 3
毎回、beginFill してみる。
graphics.beginFill(0xff0000); graphics.drawCircle(0, 100, 100); graphics.beginFill(0xff0000); graphics.drawCircle(100, 100, 100); graphics.beginFill(0xff0000); graphics.drawRect(-30, 100, 300, 50);
全部塗られる。Case 1 のように XOR になることもない。

これは、たぶん、beginFill を実行した段階で、自動的に前の塗りの endFill が呼ばれてるんだろう。
まとめ
なんとなく内部実装が見えてきた気がする。endFill せずに2回塗れば XOR になる、という技は使えそうだ。