AS2のテキストフィールドでスクロールするメモ

AS2というかparaflaで。

テキストファイルを追加。テキストファイルのプロパティは
・ダイナミックフォント(先頭に_がついているもの)
・自動サイズではなくサイズは指定
・変数をいれる(仮にhogeとする)
・折り返し、複数行、選択可能にチェック

テキストを配置して、スクリプト側で

textinstance = “hoge”;

とするとスクロール可能になる(デフォルトでマウスホイール使える)。
hoge.scrollでスクロールの状態も書き換えられる(初期が1、1行スクロールごとに+1)

広告

Flashのメモリリーク対応

自戒を込めてメモ。

FlashのAS2でいろいろ作っているけど、長時間稼働させているとクラッシュすることが増えてきた。
Chromeにはタブごとのメモリを見れるタスクマネージャがあるのでFlash起動したタブを見てみると、メモリがどんどん増えている。
特に無限に変数増やしたりすることはないのにどうして……。
(あ、どうでもいいけどSystem.totalmemoryがAS2では使えないのでタスクマネージャーには助けられた)

いろいろ調べたところガベージコレクションの機能が遠因の模様。

いろいろやったところ、
いままで毎度毎度作り変える配列はhoge = new Array();で初期化していたけど、
その前にhoge = null;で削除することで前のデータがガベージからも消えるみたいで、メモリの増加は抑えられた。

まさかメモリ対策まで必要だとは思わなかったなあ。

自分用ActionScript2.0メモ

へっぽこめも。

・if()の中で変数を定義してもよい。if(hoge = muga >5)

追記:よくなかったわ・・・if( (hoge = muga) > 5)こうじゃないと。

・function内でvar付きで変数定義すると、ローカル変数になる。function hoge( var huga = 0;)

・removeMovieClipは深度が正じゃないとできない。dupulicateするときに正の深度を与えること。クリップの中ごとに深度は別々なので気にしない。

AS2.0でString.length()の代用をする

自動文字送りを作っているときに見つけたので。

AS3.0には文字列の長さを測る (文字列変数).length という関数があります。

AS2.0にはありません。こんなに基本的なことなのにどうして……。
でも、↓で代用できました。

(文字列変数).lastIndexOf(“”);

代用できるなら何も問題ないですね。……あるかもしれないけど。


20140626追記
ありました。というか.length();って使ってたのが間違いだった。.length;なら使えました。はずかしい!

Flashのスロットル機能を力技で無効にする方法

Flash Playerにはスロットル機能というものがついています。

参考:CPU 使用率の最小化
http://help.adobe.com/ja_JP/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-8000.html

ようするに表示してないときに実行FPSを2~8ぐらいまで下げる、という機能です。
これを使いたくない(バックグラウンドでそのまま動かしていたい!)場合、

ActionScript3以降ではこれに関するイベントが追加されているそうですが、あいにくこのサイトでとりあつかうのはparafla!なのでActionScript1.0とか2.0でなんとかしなければいけません。

意外と簡単に何とかできます。
サウンドのストリーミング再生です。

サウンドをストリーミング再生している間はFPSは低下しません。
(低下したらサウンドがえらいことになるからだと思います)
これを逆に利用して、無音のサウンドをストリーミング再生して一定間隔でループするようにします。
※ループ間隔はサウンドの再生時間よりも短くしてください。でないとサウンドの再生が終わった途端、挙動が不審になります。

これでブラウザを最小化しても全力で動き続けてくれます。

何のために無音のmp3があるのかなーと思ってましたが、なるほど、このためだったのですね。

ActionScriptで二次元配列を使ってソートするメモ

例によってうちはparaflaが作成環境です。

data = new Array();

for (i = 0; i < 10 ; i++){
data[i] = new Array();
}

//※適当にdata[0][0]からdata[9][9]まで入れてください。たとえばdata[0][0] = 田中; data[0][1] = 10; とか。

data.sortOn(1, Array.DESCENDING | Array.NUMERIC);

//ソート基準のdata[x][y]のyを入れる。例は1。大きい順はDESCENDING、数値としてあつかうのでNUMERIC

エクセル的な並び替えというかそんなのがしたかった。同じ値は最初の並び順と同じ。

ActionScriptとphpを使ってFlashに画像を取り込む

Flashの解析やディレクトリから直接画像を引っ張り出されない工夫をしてみる。

ちなみにAdobeは高くて買えないので、いつもFlashを作るのにはparafla!を使用しています。

parafla!のページ
http://parafla.coaworks.jp/

手順や構成はこんな感じです(わかりづらいね)

1. 「呼び出し側.swf」を作成して、「Flash呼び出し.php」をURLで取得する。
2. 「Flash呼び出し.php」では、「Flash.swf(本体)」を読み込んで表示する。
3. 「表示側.php」を作成して、「呼び出し側.swf」を読み込んで表示する。
4. 「Flash.swf」では、「画像呼び出し.php」を要所要所スクリプトで呼び出してムービークリップに表示する。
5. 「画像呼び出し.php」は、「画像.png」を読み込んで表示する。

ユーザがアクセスするのは[index.php](includeとかで表示側.phpを読み込む)。

[index.php]→[表示側.php]→[呼び出し側.swf]→[Flash呼び出し.php]→[Flash.swf]→(画像が必要な時に)[画像呼び出し.php]→[画像.png]

htaccessで直接アクセスされないように制限
・phpから呼び出すモノのディレクトリはローカルからのみのアクセス制限(PHPはサーバサイドで動くから)
・swfから呼び出すモノのディレクトリはリファラでアクセス制限(SWFはユーザのローカルマシンで動くから)

[index.php]→[表示側.php][呼び出し側.swf][Flash呼び出し.php][Flash.swf]→(画像が必要な時に)[画像呼び出し.php][画像.png]

緑=ローカルからのみ 水色=リファラ制限

とこうすることで肝心のFlash本体や画像は直接アクセスできないディレクトリに置けると思うのですが、どうでしょう。
もっといい方法があったら教えてください(paraflaで動く範囲で)。