ラベル flash の投稿を表示しています。 すべての投稿を表示
ラベル flash の投稿を表示しています。 すべての投稿を表示

2014年1月21日火曜日

AS3:ColorTransformでディスプレイオブジェクトの色を変更する

ちょっとハマったので、備忘録。


以下のように直接書き換えることはできないっぽい。

var sprite:Sprite = new Sprite();
sprite.transform.colorTransform.color = 0x00FF00;

一度ColorTrandformオブジェクトを作成してからそれを入れるようにするとうまいこといった。

var sprite:Sprite = new Sprite();
var colorTransform:ColorTransform = new ColorTransform();
colorTransform.color = 0x00FF00;
sprite.transform.colorTransform = colorTransform; 

2014年1月8日水曜日

FlashBuilder(eclipse)で"java heap space"

FlashBuilderを触っていて重いモジュールのコーディングを行っている時に、
"java heap space"
という名のエラーが出た。

「重すぎてメモリが足りない」っていうエラー。
これを回避するために方法を探していたら以下のサイトにあった。

Applications/Adobe Flash Builder 4.6/Adobe Flash Builder 4.6.app/Contents/MacOS
にある
"Adobe Flash Builder 4.6.ini"というファイルにメモリの容量を記述する箇所があり、それを編集すれば良いみたい。


-Xms256m // 初期ヒープサイズの指定。空きメモリーの80%くらいがよい。
-Xmx512m // 最大ヒープサイズの指定。初期ヒープサイズと同じがよい。
-XX:MaxPermSize=256m // クラス定義やメソッド、フィールドなどのメタデータが格納されます。
-XX:PermSize=64m

ここを編集すればいいみたいー

2013年12月7日土曜日

AS3でカスタムイベント

Flash開発する上ではイベントの処理は必要ですよね。 僕はFlashを勉強し始めて、二週間ちょっとですが、もう何回使ったかわかりません。 そのくらい頻繁に用いるイベント処理。 ゲームを制作する時とかは自分でイベントを作りたくなります。 「着地した瞬間」とか「的に当たった瞬間」とか「ゴール地点に到達した瞬間」とかね。 今日、カスタムイベントの定義の方法を勉強したので、復習を込めた備忘録です。

カヤックのブログの説明がよかったです。

今回作成したサンプルです。

壁にボールが当たるとイベントが発生します。

【Main.as】

メインのクラス

package  {
     import flash.display.MovieClip;
     import flash.events.Event;
     import flash.events.MouseEvent;
     /**
      * 円をクリックすれば、ステージを円が跳ね返っていく
      * 跳ね返った瞬間にイベントディスパッチする
      */
     public class Main extends MovieClip {
          // キャラインスタンス
          private var chara:Chara;
          // 壁にあたった回数
          private var cnt:uint;
          public function Main() {
               // キャラのインスタンスを生成
               chara = new Chara();
               // クリックイベントを設定
               chara.addEventListener(MouseEvent.CLICK, onCharaClick);
               // 壁に当たるカスタムイベントを設定
               chara.addEventListener(CharaEvent.HIT_WALL, onCharaHitWall);
               // 中央に配置
               chara.x = stage.stageWidth / 2;
               chara.y = stage.stageHeight / 2;
               addChild(chara);
               // 壁にあたった回数
               cnt = 0;
               // テキスト表示
               outputText.text = cnt.toString() + "回 壁にあたった";
          }
          /**
           * キャラのクリックイベント
           * @param {MouseEvent.CLICK} e : マウスイベントオブジェクト
           * @return {void} :
           */
          private function onCharaClick(e:MouseEvent):void {
               // キャラの毎フレームイベントを設定
               chara.addEventListener(Event.ENTER_FRAME, onCharaEnterFrame);
          }
          /**
           * キャラの毎フレーム関数
           * @param {Event} e : イベントオブジェクト
           * @return {void} :
           */
          private function onCharaEnterFrame(e:Event):void {
               chara.moveChara();
          }
          /**
           * キャラが壁にあたったイベントハンドラ
           * @param {CharaEvent} e : キャライベントオブジェクト
           * @return {void} :
           */
          private function onCharaHitWall(e:CharaEvent):void {
               // 壁にあたった回数をインクリメント
               cnt++;
               trace("壁にあたった" + cnt.toString() + "回");
               // テキスト表示
               outputText.text = cnt.toString() + "回 壁にあたった";
          }
     }
}

【Chara.as】

キャラの動きとイベントの設定

package  {
     import flash.display.MovieClip;
     public class Chara extends MovieClip {
          // キャラのスピード
          private var speedX:int;
          private var speedY:int;
          public function Chara() {
               // ランダムなスピードの値設定
               speedX = Math.random() * 10;
               speedY = Math.random() * 10;
          }
          /**
           * キャラを動かす関数
           * @param {}  :
           * @return {void} :
           */
          public function moveChara():void {
               // 動かす
               x += speedX;
               y += speedY;
               // 壁にあたったかどうかのフラグ
               var isHitWall:Boolean = false;
               // 壁にあたった時のはねかえり処理
               if(x < width / 2) {
                    x = width / 2;
                    speedX *= -1;
                    isHitWall = true;
               } else if(x > stage.stageWidth - width / 2) {
                    x = stage.stageWidth - width / 2;
                    speedX *= -1;
                    isHitWall = true;
               }
               if(y < height / 2) {
                    y = height / 2;
                    speedY *= -1;
                    isHitWall = true;
               } else if(y > stage.stageHeight - height / 2) {
                    y = stage.stageHeight - height / 2;
                    speedY *= -1;
                    isHitWall = true;
               }
               // ヒットイベントをブロードキャスト( = 登録されたリスナーのメソッドを実行する)する
               if(isHitWall == true) {
                    var evt:CharaEvent = new CharaEvent(CharaEvent.HIT_WALL);
                    dispatchEvent(evt);
               }
          }
     }
}

【CharaEvent.as】

このクラスでイベントを定義している

package  {
     import flash.events.Event;
     public class CharaEvent extends Event {
          // イベントの種類を定義(静的なプロパティ)
          public static const HIT_WALL:String = "hitWall";
          public function CharaEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false) {
               // 継承元のEventクラスのコンストラクタを呼び出す
               super(type, bubbles, cancelable);
          }
          // EventDispacherを呼び出すためのオーバーライド
          override public function clone():Event {
               return new CharaEvent(type, bubbles, cancelable);
          }
          // toString()出力用
          override public function toString():String {
               return formatToString("CharaEvent", "type", "bubbles", "cancelable");
          }
     }
}

as3でlzma圧縮

FlashPlayer11.3から搭載された新機能。

今まではzip圧縮しかできなかったのが高効率のlzma圧縮も対応できるようになっているらしい。

Adobe純正の flex sdk4.6 では compress('lzma') に対応していなくて、コードから直接読み込むのは不可能でした。

flex sdkはAdobeではもう作っていなくて、apache flex sdkになっているらしい。
apache flex sdk 4.11 をダウンロードして使ってみたら、lzma呼び出せました。

ByteArray形式のデータを保存するだけなので、すごい簡単です。

// 保存したいファイルのデータ(本当はこのデータを外部ファイルを読み込む形になる)
var file:FileReference = new FileReference();
// ByteArrayのデータを抽出
var data:ByteArray = new ByteArray();
data.writeBytes(file.data);
// 圧縮するとき
data.compress(CompressionAlgorithm.LZMA);
file.save(data);
// 解凍するとき
data.uncompress(CompressionAlgorithm.LZMA);
file.save(data);



2012年3月19日月曜日