font-family : ‘Kozuka Mincho Pro’ ?

ようやくCSSを更新に着手したが、
Firefoxで小塚明朝の指定が読まれない。
Windows IEで点線が破線になる。serif指定してるはずが効かない。
という問題にぶつかった。

/* CSS */

font-family : 'Kozuka Mincho Pro', 'Kozuka Mincho Std', '小塚明朝 Pro R', '小塚明朝 Std R', 'Hiragino Mincho Pro', 'ヒラギノ明朝 Pro W3', 'MS P明朝', 'Times', 'Times New Roman', serif ;

- 参考サイト
点線と破線の表示(IE/dashed、dotted):スタイルシート(CSS)辞典 - HTMLタグボード

Debug.as

ステージ上にテキストフィールドを生成し、そこにtrace結果を出力する。
ブラウザ上でのデバッグ、検証に役立つはず。

実行方法: Debug.trace(〜);

/* ActionScript2 */

class Debug{

private static var _isInit:Boolean;
private static var _debugTf:TextField;
private static var _enableDisplay:Boolean = false;
private static var _enableWindow:Boolean = false;

private function Debug(){
}

/**
* デバッグの初期化
* @param	テキストフィールドをアタッチしたいMC(指定なしは_root)
* @param	ステージ上へのトレース許可(指定なしはtrue)
* @param	出力ウインドウへのトレース許可(指定なしはtrue)
*/
public static function init(mc:MovieClip, enableDisplay:Boolean, enableWindow:Boolean):Void{
Debug._enableDisplay = (enableDisplay==undefined)? true : enableDisplay;
Debug._enableWindow = (enableWindow==undefined)? true : enableWindow;
//テキストフィールドの生成(実行は1度だけ)
if(Debug._isInit){
return;
}
Debug._isInit = true;
var targMc:MovieClip = (mc)? mc : _root;
Debug._debugTf = targMc.createTextField("debug_tf",targMc.getNextHighestDepth(), 0,0,0,0);
Debug._debugTf.autoSize=true;
Debug._debugTf.multiline = true;//複数行許可(テキスト上をドラッグして古いのも見れる)
Debug._debugTf.textColor = 0x00FF00;
//一度ダミーのテキストを入れ、1行分の縦幅を調べる → autoSizeをオフにし、サイズをFIX。
Debug._debugTf.text = "TEST";
var tempHeight = Debug._debugTf._height;
Debug._debugTf.autoSize = false;
Debug._debugTf.text = "";
Debug._debugTf._height = tempHeight;
Debug._debugTf._width = Stage.width;
}

/**
* トレース処理
* @param	トレースしたいオブジェクト
*/
public static function trace(obj:Object):Void{
//initがまだ実行されていない時は実行する
if(!Debug._isInit){
Debug.init();
}
//ステージへ
if(Debug._enableDisplay){
Debug._debugTf.text += "n" + obj.toString();
//常に一番下の行へ移動する
Debug._debugTf.scroll = Debug._debugTf.maxscroll;
}
//出力ウィンドウへ
if(Debug._enableWindow){
trace(obj);
}
}

}

– asファイル
Debug.zip

MovieClip*5000 vs setPixel*5000

bmp_vs_mc.jpg

結果は予想していたが実験。

1. MovieClipを5000個つくり、ランダムに配置。中心に移動。

2. 5000個のランダムな座標を配列で記憶し、それぞれが中心へ移動する通過点を
 求める。毎フレーム、bitmapDataのカンバス上にsetPixelで描画。

2の方が負荷が軽い。
マシンによっては3000個くらいまでならフレームレートを維持できるかも。
5000個になると1はMovieClipを作るだけで大変。
何でもMC主体ではなく、グラプロの思考を持とう。

– flaファイル
bmp_vs_mc.zip

getPixel32

ビットマップデータは乗算済みカラー値として保存される。
getPixel32 はその乗算済みの値を、getPixel は乗算されていない値を返す。

getPixel32 (BitmapData.getPixel32 メソッド)

戻り値

Number – ARGB ピクセル値を表す数値。(x , y ) 座標がイメージの境界外である場合は、0 を返します。ビットマップが、透明ではなく不透明として作成された場合、このメソッドはエラーコード -1 を返します。

getPixel (BitmapData.getPixel メソッド)

BitmapData オブジェクトの特定ポイント (x , y ) の RGB ピクセル値を表す整数を返します。getPixel() メソッドは、乗算されていないピクセル値を返します。アルファ情報は返しません。

BitmapData オブジェクト内のピクセルはすべて、乗算済みカラー値として保存されます。乗算済みイメージピクセルは、アルファデータが既に乗算された赤、緑、青の各カラーチャンネル値を保持します。たとえば、アルファ値が 0 の場合、乗算されていない値に関わらず、RGB チャンネルの値も 0 になります。

このようにデータが失われると、処理の実行時に問題が生じることがあります。Flash Player のメソッドはすべて、乗算されていない値を受け取ったり返したりします。ピクセルの内部表現は、値として返される前、乗算されていません。設定処理の際は、ピクセル値が事前に乗算されてから、生のイメージピクセルが設定されます。

– 参考サイト
3895.setPixel32で設定した値をgetPixel32で取得できない FLASH-JP.COM – フォーラム

ReferenceError: Error #1065: 変数 [クラス名] は定義されていません。

ライブラリ内にムービークリップ「TestSp」をつくる。
クラス: TestSp
基本クラス: flash.display.Sprite

クラスの定義ファイル TestSp.as で 頭の class に public をつけ忘れたら
「ReferenceError: Error #1065: 変数 [クラス名] は定義されていません」
で止まった。理由は以下。

Flash CS3 ヘルプ

クラス、変数、定数、またはメソッドにすべての呼び出し元からアクセスできるよう指定します。クラス、変数、およびメソッドはデフォルトでは内部クラスです。つまり、現在のパッケージ内にのみ表示されます。クラス、変数、またはメソッドにすべての呼び出し元からアクセスできるようにするには、public 属性を使用する必要があります。

DisplayObject サブクラスの選択

普段、クラスに変数 mc を持たせ、後から MovieCLip への参照を代入する
FLASH OOP流で実装していたのだが、これからは Sprite を使いたい。

ステージ上に配置された MovieCLip を Sprite として扱うには
ライブラリのリンケージ機能から クラスと基本クラスをまとめて定義が必要。
そのときにクラス名も書かなければいけないが、Sprite を extends したクラスはつくらず、
「このクラスの定義がクラスパス内に見つからなかったため、
定義は書き出し時にSWFファイル内に自動生成されます」 に任せる。

さらに、ステージ上のインスタンス名とクラス名がかぶると当然エラーが出るので
「_class」とか付け足すとトラブルがないかもしれない。

というのが現在の方針。あとは作りながら検証。

Spriteにしておくと、仮に2フレーム名以降が存在しても
完全に無視されて、動作しない。

ムービークリップの基礎
DisplayObject サブクラスの選択

# 外部 SWF ファイルやイメージファイルをロードするためのコンテナが必要な場合、Loader インスタンスを使用します。ロードされたコンテンツは、Loader インスタンスの子として表示リストに追加されます。そのデータ型は、ロードされたコンテンツの特性によって次のように異なります。

* ロードされたイメージは Bitmap インスタンスになります。
* ActionScript 3.0 で記述された SWF ファイルをロードした場合、Sprite または MovieClip インスタンス (または、コンテンツ作成者の指定により、これらのクラスのサブクラスのインスタンス) になります。
* ActionScript 1.0 または ActionScript 2.0 で記述された SWF ファイルをロードした場合、AVM1Movie インスタンスになります。

# 他の表示オブジェクトのコンテナとなるオブジェクトが必要な場合 (ActionScript を使用して表示オブジェクトに描画するかどうかに関わらず)、次のいずれかの DisplayObjectContainer サブクラスを選択します。

* ActionScript のみを使用してオブジェクトを作成する場合、または ActionScript のみによって作成および操作されるカスタム表示オブジェクトの基本クラスとしては、Sprite を選択します。
* Flash オーサリングツールで作成されたムービークリップシンボルを参照するための変数を作成する場合、MovieClip を選択します。

# Flash ライブラリ内のムービークリップシンボルと関連付けられるクラスを作成する場合は、クラスの基本クラスとして、次のいずれかの DisplayObjectContainer サブクラスを選択します。

* 関連付けられたムービークリップシンボルのコンテンツが複数のフレーム上に存在する場合、MovieClip を選択します。
* 関連付けられたムービークリップシンボルのコンテンツが最初のフレームのみに存在する場合、Sprite を選択します。

try..catch..finally

AS2ではちょっとのエラーは気にせず進んでくれたが3では使うかも。
ランタイムエラーについて勉強。
try して throw されたエラーを catch できれば止まらない。

try..catch..finally ステートメント

エラーが発生する可能性のあるコードブロックを囲み、そのエラーに対処します。try..catch..finally ステートメントを使用して実装される例外処理は、ActionScript 3.0 でランタイムエラーの条件処理に使用される主要なメカニズムです。ランタイムエラーが発生すると、Flash Player は例外をスローして、通常の実行を一時停止し、Error 型の特殊なオブジェクトを作成します。次に、最初にアクセス可能な catch ブロックにエラーオブジェクトをパス (スロー) します。アクセス可能な catch ブロックがない場合、例外は不明な例外と見なされます。不明な例外が発生すると、スクリプトは終了します。

interface implements

interface と implements
まだまだ知らないことがたくさんある。

Flash CS3 ヘルプ

インターフェイスを定義します。インターフェイスとは、メソッドのセットを定義するデータ型です。このメソッドは、インターフェイスを実装するすべてのクラスで定義される必要があります。

インターフェイスはクラスに似ていますが、次に示す重要な違いがあります。

・インターフェイスにはメソッドの宣言だけが含まれます。メソッド実装は含まれません。つまり、インターフェイスを実装するすべてのクラスは、インターフェイスで宣言されている各メソッドの実装を定義する必要があります。
・インターフェイスメソッドの定義では、public または private などの属性を指定できませんが、実装されたメソッドはインターフェイスを実装するクラスの定義で public と指定する必要があります。
・extends ステートメントまたは implements ステートメントを介したクラスを使用して、インターフェイスで複数のインターフェイスを継承することができます。
・ActionScript 2.0 とは異なり、ActionScript 3.0 ではインターフェイス定義で getter および setter メソッドを使用できます。

TestInterface.as

/* ActionScript3 */

package{
public interface TestInterface{
function func1():void;
}
}

Init.as

/* ActionScript3 */

package{

import flash.display.Sprite;

public class Init implements TestInterface{

public function Init(sp:Sprite){
}

public function func1():void{
trace("func1");
}

}
}

Init 内で func1を書かないと
「1044: インターフェイスメソッド func1 (名前空間 TestInterface) はクラス Init によって実装されません。」
というエラーが出る。

- 参考サイト
Flash ActionScript入門ノート: 4.5 インターフェイス

const

const の命名は 「大文字だけを使い、単語は_で区切る」
値は宣言時にしか定義できない。

変数 — Flex 2.01

var キーワードで宣言した変数は、スクリプトの実行中に複数回その値を変更できます。const キーワードで宣言した変数は定数と呼ばれ、1 回だけ値を割り当てることができます。初期化された定数に新しい値を割り当てようとすると、エラーが発生します。

/* ActionScript3 */

package{

public class Init{

private const NUM:int;

public function Init(){
this.NUM = 100; //結果: 1049: 定数として指定した変数への代入が無効です。
}

}
}

- 参考サイト
2.2 変数と定数 (Flash ActionScript3.0入門ノート)

trace(this) //結果: クラス名

trace(this); で [Object Object] 以外の出力を得たい時は
toStringメソッドをオーバーライドすれば良い。

/* ActionScript2 */

class Init{

public function Init(mc:MovieClip){
trace(this); //結果: Init
}

public function toString():String {
return "Init"
}
}

AS3では心配なし。

/* ActionScript3 */

package{
class Init{
public function Init(mc:MovieClip){
trace(this); //結果: [object Init]
}
}
}

return “[object Init]” と書いておけば気持ちだけはAS3。

– 参考サイト
toString (Object.toString メソッド)