2011 年 9 月 のアーカイブ

Snow LeopardにMySQLをインストール

2011 年 9 月 26 日 月曜日

下記サイトからmysql-5.5.16-osx10.6-x86_64.dmgをダウンロード。
(MySQL Community Serverのページにある)

http://dev.mysql.com/downloads/

GUIでインストールしたいので
>> Mac OS X ver. 10.6 (x86, 64-bit), DMG Archive
を選択。
(ユーザー登録的な画面にいくので適当に登録を済ませる)

以下のファイルを実行してインストールを完了させる。
1)mysql-5.5.16-osx10.6-x86_64.pkg
2)LySQLStartupItem.pkg
3)MySQL.prefPane

/user/localにmysql-5.5.16-osx10.6-x86_64フォルダが作成される。
これでインストール完了らしい。

Flashのレイヤーマスクをスクリプト制御する場合の挙動[AS3]

2011 年 9 月 5 日 月曜日

Flashのタイムラインパネルで設定するマスクの挙動が「ん?」って感じだったので色々検証してみました。
具体的には、パネル上で適用したマスクをスクリプトで制御する場合。

いろいろ検証してみました

手前にマスク用のムービークリップ[masker](グレー)と、その下にマスクを適用するムービークリップ[mc](イエロー)を配置。

マスク適用前

マスク適用前

レイヤーマスクを適用。
masker(グレー)にmc(イエロー)がマスクされて表示される。
タイムラインパネル

タイムラインパネル

マスク適用後

マスク適用後


通常だとこの状態は下記のスクリプトと同じ状態になる。

// mcのマスクとしてmaskerを適用
mc.mask = masker;
このマスクをスクリプトで解除しようとしてみたところ、うまくいかない。

// mcのマスクを解除
mc.mask = null;

スクリプトでマスクを解除

マスクが解除されない


マスクが解除されない。
試しにmcのマスクを出力してみると

// mcのマスクを出力してみる
trace(mc.mask) // 出力 null

となる。

visibleをfalseにしても解除されない。
maskerをremoveChildするとmcのマスクが解除される。

// maskerを表示リストから削除
removeChild(masker);

removeChildした後

マスクが解除された

じゃあremoveChildしたmaskerをaddChildすればマスクは復活するかと思いきや、addChildしただけではmaskerは何も表示されなくなってしまう。

// maskerを再配置
addChild(masker);

addChildした後

マスクは適用されない

なので、removeChildしたmaskerを使い回したい場合は、addChildした後にスクリプトでmaskを適用してやる必要がある。

// removeChildしたmaskerをもう一度
// マスクとして適用
removeChild(masker);

// もう一度マスクをセット
// これで正常に表示される
addChild(masker);
mc.mask = masker;

addChildした後にマスクを設定

正常にマスクが適用された

もしくは、addChildではなくてaddChildAtで、mcよりも下に配置してやると正常にmaskが復活する。
この場合はマスクを再設定する必要はない。

// removeChildしたmaskerをもう一度
// マスクとして適用
removeChild(masker);

// mcよりも下に配置
addChildAt(masker,0);

addChildAtで深度を指定

これでも正常に適用される

ここからがさらに不思議なところで、レイヤーマスクを適用している状態で試しにmaskerのmaskを出力してみると当然のことながらnullが返ってくる。

// maskerのマスクを出力
trace(masker.mask) // 出力 null

ところが、maskerのマスクを解除するスクリプトを書くと、なぜかmcのマスクが解除される。
しかも、mcの上に配置されているはずのmaskerはmcの下に深度が変更される。

// maskerのマスクを解除
masker.mask = null;

マスクオブジェクトのmaskを解除

マスクが解除された

さらに掘り下げてみた。レイヤーマスクは適用せず、スクリプトでマスクを設定。その状態でmc、maskerのmaskを出力してみると、お互いをmaskとして出力する。

// お互いのマスクを出力してみる
mc.mask = masker;

trace(mc.mask.name); // 出力 masker
trace(masker.mask.name); // 出力 mc

最後に、マスクされている状態でそれぞれの深度を出力してみると、マスクオブジェクトの深度が変更されている。

// マスクを適用
mc.mask = masker;

// 深度を出力
trace(getChildIndex(mc)); // 出力 1
trace(getChildIndex(masker)); // 出力 0

結論

検証の結果からわかったこと。

  1. レイヤーマスクはremoveChildするとマスクが解除される
  2. レイヤーマスクはレイヤーマスク自身のmaskプロパティをnullにすると解除される
  3. レイヤーマスクをaddChildするとマスク自身が表示されなくなる(マスクは解除される)
  4. removeChildしたレイヤーマスクは再度適用するにはaddChildだけでは適用されない、再度maskプロパティを設定する必要がある
  5. removeChildしたレイヤーマスクを再度適用するにはaddChildAtで対象オブジェクトの下に配置する(対象より下なら深度はいくつでもよい)
  6. マスクオブジェクトは、適用時に対象となるオブジェクトのひとつ下の深度に再配置される
  7. マスクオブジェクトは常に対象オブジェクトより下の深度に配置しないと適用されない
  8. マスクオブジェクトは、自身のmaskプロパティに対象オブジェクトが設定される(レイヤーマスクではnullが返る)
なので再利用するときはremoveChildした後でaddChildAt(0)で再配置、もしくはmaskプロパティを再設定するというのが妥当そうです。
マスクオブジェクトと対象オブジェクトの間に別のオブジェクトが存在すると、挟まれたオブジェクト側が表示されなくなるようです。
レイヤーマスクは複数のオブジェクトでマスクを共有できる、という点でスクリプトとは挙動が違うのでいろいろあるのではと思います。(スクリプトではmaskは1つしか設定できないはず)
あとTextFieldにマスクかけるとダイナミックテキストが消えちゃうやつとかもあるし。(これはBlendMode.layerで対応できる)
個人的にマスクオブジェクトは対象を上からマスクするのではなく、自分の上に配置された対象オブジェクトを自分の領域に描画するっていう仕様なのかなぁと推測してます。(細かい仕様まで調べてないのでわからないですけど)
「いや、それ違うよ」とか見落としてる部分があれば教えていただければと思います。