[AS]画像をゆっくり動かす方法

偉い人に教えてもらったテクニック。

通常ゆっくり動かすときに1px以下だとカクカクした動きになります。

package  {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.Event;
	/**
	 * ...
	 * @author 393

	 */
	public class Test extends Sprite{
		private var bm:Bitmap;
		//ライブラリに画像を用意し、クラス名Bmpでリンケージ。
		//画像サイズは400×300
		
		public function Test() {
			var bmd:BitmapData = new Bmp(0, 0);
			bm = new Bitmap(bmd);
			addChild(bm);
			
			addEventListener(Event.ENTER_FRAME , enterFrameHandler);
		}
		private function enterFrameHandler(e:Event):void {
			//かくかくと動く
			bm.x += 0.08;
			bm.y += 0.08;
		}
	}
}

スムーズに動かしたいときは、beginBitmapFill()を使えばOK。

package  {
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Matrix;
	/**
	 * ...
	 * @author 393
	 */

	//ライブラリに画像を用意し、クラス名Bmpでリンケージ。
	//画像サイズは400×300
	
	public class Main extends Sprite{
		
		private var matrix:Matrix = new Matrix();
		private var bmp:BitmapData;
		private var sp:Sprite;
		private var mx:Number = 0;
		private var my:Number = 0;
		private var w:Number;
		private var h:Number;
		
		public function Main() {
			bmp = new Bmp(0, 0);
			sp = new Sprite();
			addChild(sp);
			buttonMode = true;
			this.addEventListener(Event.ENTER_FRAME , xEnterFrame);
		}
		function xEnterFrame (e:Event):void {
			mx += 0.05
			my += 0.05
			matrix.tx = mx;
			matrix.ty = my;
			sp.graphics.clear();
			//smoothプロパティをtrueにするのがポイント
			sp.graphics.beginBitmapFill(bmp, matrix,false,true);
			sp.graphics.drawRect(mx, my, 400, 300);
			sp.graphics.endFill();
		}
	}
}

このときのポイントは、beginBitmapFill()の第3引数のsmoothをtrueにするということ。
(デフォルトはfalse)
falseのままだと、先のサンプルと同じくカクカクした動きとなります。

もっと簡単にできる方法を追加しました。
[AS]画像をゆっくり動かす方法 その2

[ETC]Flash制作に欠かせない3つのツール@393編

kayacさん発信の元、流行ってるようなので便乗。
といってもペーペーなので新しいことを提供できませんのでちょっとベクトルを変えて。

◆まずはキーボード。
2009_10140003
ThinkPlus USBトラベルキーボード ウルトラナビ付
ThinkPadキーボードがデスクトップPCでも使用できると優れもの。
私はトラックポイント(赤ポッチ)に慣れすぎていてこれがないと始まりません。
マウスもつないでますがほとんどトラックポイントで済ませてしまいます。
イラストレーターのベジェとかも全部これで操作。
マウスもつないでますが、ほとんど使わないですね。
ちなみにトラックパッドは使いにくいので全く使いません。
で、最近トラックパッドなしのモデルがでたので、そっちも欲しいす、安いし。

◆続いてモニター
2009_10140066
DELLの24インチと22インチのデュアルディスプレイ。
基本的にウィンドウを整理して作業していないので、広ければ広いほど嬉しかったりします。。
一面にFLASH IDE、もう一面にFLASH DEVELOPだったり、
上記二つを一面に押しこんでもう一面はフォトショやイラレを開いたりといった感じ。
とりあえず2枚ないと始まりません。
もう一枚欲しいくらい。。。

◆最後に椅子
2009_10140040
Embody Chair (エンボディチェア)
私の希望するデザインと機能性を満たしてくれた初めてのワークチェア。
肘掛の自由度も高く、リクライニングも2段機構になっていて、椅子に座りながら背伸びが可能。
まぁ背伸びなんて椅子降りてやればいいことですがこれがなかなか気持ちいい。
ただ当初のもくろみはリクライニングを倒してふんぞり返りながら作業しようと思っていましたが、これをすると腰に負担がかかってえらいことに。。。
長時間、後傾姿勢で作業するにはヘッドレストがないと無理なようです。
なので作業時はリクライニング固定で前傾姿勢で作業。
背伸びするときだけリクライニングオンといった感じでしょうか。
写真の足元に映っている白い箱は足置き台。
テーブルが少し高いので足置き台を使うことで正しい姿勢をキープ。
足がむくみにくくなるようです。
ちなみにこの足置き台はダイソーで買った子供用踏み台(420円)
結構気に入ってます。

というわけでFlashには直接関係ないツールでした。
まぁストレスなく作業できる環境を作ることが何においても重要だと考えてます。

[AS]ArgumentError: Error #2015: BitmapData が無効です。エラーの謎

エラー:ArgumentError: Error #2015: BitmapData が無効です。
書籍:ActionScript3.0エラーアーカイブスによると、このエラーの主な原因は、

1.BitmapDataインスタンスの幅または高さが制限範囲(1~8191px)を超えている。
2.BitmapDataインスタンスのピクセルの総数が1677215pxを超えている。

ということらしいのですが、じゃあこれはどういうことだ?ということがおきたのでメモ。

//フレームアクション
for(var i:uint = 0; i < 11; i++){//i < 10のときは実行可能
	var bmd:BitmapData = new BitmapData(4000, 4000,true,0x11FFCC00);
}

これを実行するの上記エラーになります。
(ちなみにfor文を10回繰り返しではエラーにならない。11回でエラーになる)

これは主な原因の1,2も満たしていないのでその他の原因ということでしょうか。
憶測として、BitmapDataは全体でのピクセル数の制限があるのでは?ということで、
上記の場合は、4000×4000×11 = 176000000ピクセルとなります。
このくらいが限界なのかと、ためしに、以下のように書き換えてみると同じようにエラー
(2000×8000×11 = 176000000 でピクセル総数は同じ)

for(var i:uint = 0; i < 11; i++){//i < 10のときは実行可能
	var bmd:BitmapData = new BitmapData(2000, 8000,true,0x11FFCC00);
}

うんうん、予想通り。
じゃあ、これもエラーだよねと、以下のようにすると、(1000×1000×176=176000000)
これは想定外にOK・・・

for(var i:uint = 0; i < 176; i++){//i<700くらいでやっとエラーになる。
	var bmd:BitmapData = new BitmapData(1000, 1000,true,0x11FFCC00);
}

繰り返し数を700回くらいにするとやっとエラーになります。

うーん、どういうことなんだろう。。。

これで現実的に困ったのはEnterFrameの処理でBitmapDataを生成しまくってたら、この現象になってしまったということ。
具体的には、BitmapData作って、BitmapにあててaddChildして、一定時間がたったら、そのBitmapをremoveChildして~の繰り返しをしてたのだけど、しばらく動かしているとこのエラーが発生。
一応解決策は、BitmapをremoveChildする際に、BitmapData.dispose()してあげれば大丈夫な感じだったけど、原因がはっきりしないのが、なんだか気持ち悪い。。。

※コメント欄で教えてもらいました。