Starling + Feathers で、FeathersのButtonクラス(のサブクラス)においてロールアウトを検知する。

starlingはスマホを前提として作られたフレームワークなので、マウス処理に関してやや難がある。その一つが、ロールアウトを拾えない、という点だろう。
いや、うまくやれば拾えるのかもしれない。というか、きっと拾えるに違いない。世の中の優れたプログラマFlashデベロッパの人たちはそうしたことを軽々と実装しているに違いない!
ただ、自分は優秀でもなければ技術力もないので、ソースファイルをいじって強引に実装したw

package feathers.controls内の「Button」クラスのソースファイルを開くと、いちばん下にtouchHandlerという関数がある。
ここに処理を足す。

protected function touchHandler(event:TouchEvent):void
{
  if(!this._isEnabled)
  {
    return;
  }

  const touches:Vector. = event.getTouches(this, null, HELPER_TOUCHES_VECTOR);
  if(touches.length == 0)
  {
    //end of hover
    this.currentState = STATE_UP;
    this.dispatchEvent(new UIEvent(UIEvent.ROLL_OUT));
    this._isHoverSupported = false;
    return;
  }
       //以下略

このように、touches.length が 0、というのが、ロールアウトのケースらしい。確かに「STATE_UP」を代入している。
なので、ここで自作のカスタムイベントをdispatchするようにした。これで、ロールアウトを拾いたいボタンにのみaddEventListenerしておけば、ロールアウトを拾うことができる。
マウスオーバーもイベントを拾いたかったので、同じ関数の中で処理を見つけてやはりイベント配信の処理を書いて実装した。

ボタンに関しても、別途TouchEvent.TOUCHで処理をすれば、それでいける気もするんだが。。。

#2078: タイムラインに配置されたオブジェクトの name プロパティは修正できません。

#2078: タイムラインに配置されたオブジェクトの name プロパティは修正できません。

というエラーが出て、原因が分からずに途方に暮れていたのだが、TextFieldのインスタンスに対して

"name"

というインスタンス名を付けてしまっていたために起こっているエラーだった。
なんか微妙に、エラー文言と実際の内容がずれているような気がするんだけど、まあ間違えた自分が悪いか。。。

Error #1180: 未定義である可能性が高いメソッド addFrameScript の呼び出しです。

Error #1180: 未定義である可能性が高いメソッド addFrameScript の呼び出しです。

ドキュメントクラスのスーパークラスに「Sprite」を指定したうえで、メインのタイムラインにスクリプトを記入するとこのエラーが出る。
Sprite はタイムラインを持たないので、当然といえば当然なんだけど、見たことのないエラーなんで、初見はちょっと驚いた。

Error #1014: クラス flash.display::Stage3D が見つかりません。

ActionScriptでStarlingを使用していて

Error #1014: クラス flash.display::Stage3D が見つかりません。

と出たら、FlashPlayerのバージョンが11未満になっている可能性大。
このミスは恥ずかしくて、誰も見ていなくても一人で悶絶するレベル。

MacBookAirのトラックパッド上のジェスチャとActionScript

MacBookAirのトラックパッド上のジェスチャをActionScriptで拾えるのかどうか、小一時間調べてしまったのだが、結論は「AIRのみ対応」ってことなのね。
もうちょっとデカくどこかに書いていただけないでしょうか>Adobe様。

「Error #1065: 変数 hoge は定義されていません。」と、getDefinitionByName

以下のような処理を書いて

var myClass:Class = getDefinitionByName("hoge") as Class;

これで「Error #1065: 変数 hoge は定義されていません。」とエラーが出てしばらく悩んだのだが、何のことはない、クラス「hoge」のコンストラクタに引数を設定していたのだった。

public class hoge
{
  public function hoge(num:int)
  {
    //処理
  }
}

こんな感じ。
でもそれならそれで、引数がないってエラーを出して欲しいよなあ。。