カテゴリ: FLASH (AS3)
投稿者: terada
プロジェクターやディスプレイなど、サブディスプレイをつないでFlashコンテンツをフルスクリーンにしつつ、本体のディスプレイで別の操作をしたいような場合に気をつけなければならないことをメモしておきます。

<問題>
サブディスプレイでブラウザでFlashのフルスクリーンモードモードにし、メインの方で別のウィンドウをアクティブにすると(つまりFlashのフォーカスが外れると)、フルスクリーンモードが解除されてしまいます。サブとメインを入れ替えても同じでした。

これだと、別のディスプレイでコンテンツの入替えなどの操作ができないので、以外に不便ですし、この仕様は結構気づきにくいのではないかと思います。僕も、以前イベント当日の設営の段階までこのことに気づいておらず苦労した経験があります・・・。

<解決方法>
・Flash付属のスタンドアローンのFlashPlayerを使う
・Chromeの「表示>プレゼンテーションモードを開始」でフルスクリーンにする

要はプラグインのFlashPlayerには制限があるので、それ以外の方法でやりましょう。ということですね。
カテゴリ: FLASH (AS3)
投稿者: mio
FlashDevelopの
メニュー > プロジェクト > プロジェクト設定 >
コンパイラー設定タブ > SWC Libraries



C:\Program Files\Adobe\Adobe Flash CS5\Common\Configuration\ActionScript 3.0\libs\tlfruntime.swc
C:\Program Files\Adobe\Adobe Flash CS5\Common\Configuration\ActionScript 3.0\libs\11\textLayout.swc

を追加すればOKです。
※上記2行をコピペでいけます。

Flash CS5内のswcを読み込む感じなので、FlashDevelopのプロジェクトウィンドウにSWCのアイコンなどが表示されたりするので、表示されない他の方法があれば知りたいです。。(分かる方がいれば是非教えてください)


↓コンパイラー設定タブ

FlashDevelop

情報ソースはこちら(英語)

試してないけど、これも参考になりそうです。
カテゴリ: FLASH (AS3)
投稿者: terada
FlashLiteだとOxygenというのを使ってるんですが、そういえばAS3のがなかったので調べてみると、kappa-labさんのAS3でFPSメータのコンポーネント というのがあったので、これを少し改変して使うことに。

-

FPSCounter

FPSCounter Image

AS3で使えるフレームレート計測用のFlashコンポーネントです。

FPSCounter.zip

※自作ではなくて、を少しいじっただけです。
本家の「ASTachoMeter」は、動的に配置する場合にエラーが出てしまうようだったので、その部分を書き換えたのと、デザインを変更しました。勝手に利用してしまったので、圧縮ファイルにはソースも付けています。

改変前本家サイト

<使い方>
DLファイルを解凍後、「FPSCounter.swc」を下記に保存してFlashを起動。メニューのウィンドウ>コンポーネントを選択すると、「標準のコンポーネント」下に「FPSCounter」が読み込まれているはずです。ステージ上に配置するだけで使えます。

WindowsXP:
C:\Documents and Settings\user\Local Settings\Application Data\Adobe\Flash CS3\ja\Configuration\Components
MacOSX:
Macintosh HD/Applications/Adobe Flash CS3/Configuration/Components


<コンポーネントインスペクタの設定項目>
interval
何フレームごとに集計結果を表示するか
digit
フレームレートの小数点以下の表示桁数
カテゴリ: FLASH (AS3)
投稿者: mio
以下のような関数かませば動きます。
_src:ソースとなるイメージ(Bitmap)
_scale : 拡大縮小のスケール

BitmapData.copyPixels()
とかの方が、
BitmapData.draw()
より速いらしいのですが、
やり方がよく分からなかったので、
とりあえずdrawにmatrixを投げる関数です。

最後の方で、scaleXと、scaleYを1にしているのは、
一応元のデータの方も使いまわすことを想定して、
それの邪魔にならないように元に戻すようにしています。
smoothing が trueのままで良い場合は最後の1行を除けばOKです。

ご自由にカスタマイズしてご利用いただければと。
あと、もっとうまいやり方があったらぜひリンクなど教えてください。


function copyResizeBitmap( _src:Bitmap, _scale:Number):Bitmap
{
_src.scaleX = _scale;
_src.scaleY = _scale;
_src.smoothing = true;

var bmpMatrix:Matrix = new Matrix();
bmpMatrix.scale( _scale, _scale );

var rBmpData:BitmapData = new BitmapData(_src.width, _src.height);
rBmpData.draw(_src, bmpMatrix);

var bitmap:Bitmap = new Bitmap(rBmpData);

_src.smoothing = false;
_src.scaleX = 1;
_src.scaleY = 1;

return bitmap;
}
カテゴリ: FLASH (AS3)
投稿者: mio
線の太さを変えない

描画オブジェクトまたはシェイプを選択している状態で、
プロパティパネルで、伸縮:「なし」にする。

ムービークリップの中にある線でも
この設定をしておけば、
線がやたら太くなったり細くなったりすることはなくなります。

プログラムで処理するときは、
linestyleを調整する。
カテゴリ: FLASH (AS3)
投稿者: mio
Flash Develop

Tools > Program Settings を開いて、
Plugins > ASCopletion の中の、
Flash IDE : Path To Flash をクリックして、
書き出したいFlashのパスを指定すればOKです。

日本語版ですと、
ツール > 環境設定 >
プラグイン(左のメニュー) > ASCompletion の設定の一番上にある、
Path To Flash IDE のパスを書き換えればOK

C:\Program Files\Adobe\Adobe Flash CS4

といった部分の最後の数字を、3、4、5 と
入れ替えればだいたいの場合はOKかと思います。
カテゴリ: FLASH (AS3)
投稿者: terada
カスタムクラスでイベントの発行を行いたい、でもすでに他のクラスを継承しちゃってる場合、AS3は多重継承できないのでIEventDispatcherインターフェースを実装するんですよね。リファレンスをみるとこんなサンプルがあります。

元のサンプルコード
package {
import flash.events.Event;
import flash.display.Sprite;

public class IEventDispatcherExample extends Sprite {
public function IEventDispatcherExample() {
var decorDispatcher:DecoratedDispatcher = new DecoratedDispatcher();
decorDispatcher.addEventListener("doSomething", didSomething);
decorDispatcher.dispatchEvent(new Event("doSomething"));
}

public function didSomething(evt:Event):void {
trace(">> didSomething");
}
}
}

import flash.events.IEventDispatcher;
import flash.events.EventDispatcher;
import flash.events.Event;

class DecoratedDispatcher implements IEventDispatcher {
private var dispatcher:EventDispatcher;

public function DecoratedDispatcher() {
dispatcher = new EventDispatcher(this);
}

public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void{
dispatcher.addEventListener(type, listener, useCapture, priority);
}

public function dispatchEvent(evt:Event):Boolean{
return dispatcher.dispatchEvent(evt);
}

public function hasEventListener(type:String):Boolean{
return dispatcher.hasEventListener(type);
}

public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void{
dispatcher.removeEventListener(type, listener, useCapture);
}

public function willTrigger(type:String):Boolean {
return dispatcher.willTrigger(type);
}
}


でも、これってよく見るとDecoratedDispatcherクラスが別のクラスを何も継承してないのです!例えば、DecoratedDispatcherのスーパークラスをSpriteとかにした場合、下の赤字の部分を修正する必要があります。

サンプルコード修正
package {
import flash.events.Event;
import flash.display.Sprite;

public class IEventDispatcherExample extends Sprite {
public function IEventDispatcherExample() {
var decorDispatcher:DecoratedDispatcher = new DecoratedDispatcher();
decorDispatcher.addEventListener("doSomething", didSomething);
decorDispatcher.dispatchEvent(new Event("doSomething"));
}

public function didSomething(evt:Event):void {
trace(">> didSomething");
}
}
}

import flash.events.IEventDispatcher;
import flash.events.EventDispatcher;
import flash.events.Event;
import flash.display.Sprite;

class DecoratedDispatcher extends Sprite implements IEventDispatcher {
private var dispatcher:EventDispatcher;

public function DecoratedDispatcher() {
dispatcher = new EventDispatcher(); // 引数のthisを消す
}

public override function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void{
dispatcher.addEventListener(type, listener, useCapture, priority);
}

public override function dispatchEvent(evt:Event):Boolean{
return dispatcher.dispatchEvent(evt);
}

public override function hasEventListener(type:String):Boolean{
return dispatcher.hasEventListener(type);
}

public override function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void{
dispatcher.removeEventListener(type, listener, useCapture);

}

public override function willTrigger(type:String):Boolean {
return dispatcher.willTrigger(type);
}
}


リファレンスのサンプルがよくない気がします。
オーバーライドのとこはエラーが出るからすぐわかるんですが、引数のthisをはずすところ、気付かずに結構はまってしまいました・・・。元のままではイベントが発行されないので、気を付けましょう。
カテゴリ: FLASH (AS3)
投稿者: mio
Windows Vistaで、
swfを、スタンドアローンプレイヤーで立ち上げて、
Loaderクラスを使って外部がファイルを読み込むときに、

本来ならば、
URLRequestの内容が、"dirctory/aaa.jpg"のところを、
うっかり
URLRequestの内容が、"dirctory//aaa.jpg"
のように、
/(スラッシュ)がダブってしまうと、
Windows XPだと、
そのまま //(スラッシュ2個)を、1個扱いにしてくれて、
ルーズに動いてくれるのですが、
Windows Vista だと動いてくれませんでした。

ちなみに、Windows Vistaでも、
ブラウザ上で動くFlashPlayerだと、
ここがルーズに動いてくれるようでした。


ということで、
// のダブリには注意しましょう。


Loaderクラスを使ったメソッドで
引数にディレクトリを指定するものを作ったのですが、
そのディレクトリ名に "hoge/foge/"
と入れて、Vistaだけで動かない!と悩んだ話でした。
カテゴリ: FLASH (AS3)
投稿者: mio
だいぶ前に、ハマッたのでメモ。

RGBが、0xFFFFFF(int型)などで与えられたときに、
赤、緑、青、がそれぞれどういう値なのかを知る方法。

var ctf:ColorTransform = new ColorTransform();
ctf.color = 0xFFCC99;

var redOffset = ctf.redOffset;
var greenOffset = ctf.greenOffset ;
var blueOffset = ctf.blueOffset ;
カテゴリ: FLASH (AS3)
投稿者: terada
引き続き、FMS上のSharedObjectいじってます。
気づいたのは、SharedObjectに配列を突っ込みたいとき、下記のような記述だとうまくいかないということ。
var array = new Array();
array.push( "hoge" );
myRemoteSO.setProperty( "myArray", array );

こういう場合は、下記のように記述するとすんなりいきました。
var array = new Array();
array.push( "hoge" );
myRemoteSO.data.myArray = array;
myRemoteSO.setDirty( "myArray" );

setDirty()の使いどころが少し分かりました。

そういえば、FMS上のどこにSharedObjectファイルが保存されるかという前エントリでの疑問。
今日、FTP覗いていたらいきなり「/applications/アプリ名/sharedobjects/_definst_/hoge.fso」なるファイルが作成されてました。けど、作成されるタイミングがいまいちよく分からないような・・・(依然、謎)。