トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   ActionScript 3.0 特設会議室
     cacheAsBitmap=trueにしたマスクへの描画位置がずれる
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
vader
Åê¹ÆNo.48724
投稿日時: 2012-1-30 20:45
常連
居住地: 東京
投稿: 76
使用環境:
MacOS10.8,FlashCS6
cacheAsBitmap=trueにしたマスクへの描画位置がずれる
こんにちわ。
いつも勉強させて頂いております。

Spriteにグラデーションマスクを適用する過程で、どうしても私の知識だけでは原因を特定できない不具合に遭遇しましたので、お知恵をお貸し下さい。

作業環境は、
Mac OS 10.6.8
Flash CS5
ActionScript3.0
Flash Player9
になります。

下記は、単純化するために構成を最小限にしたドキュメントクラスのコードです。
target_spはマスクの対象となるSprite、mask_spはマスク用のSpriteです。この2つのSpriteは、cacheAsBitmap=trueにしてあります。

ステージ上をクリックするとmask_spの座標をクリックした座標に変更し、その座標を中心とした200pxの矩形を描画するようにしています。

しかし、X, Y座標ともステージ座標が100未満の場所をクリックした場合、ステージ座標が0の位置から描画されてしまいます。

mask_spをメインタイムラインにaddChildした場合やcacheAsBitmap=trueにしなかった場合は、このような問題は起こりません。

どうしてcacheAsBitmap=trueにした場合に描画位置がずれるケースがあるのか、ご教示頂けないでしょうか?
「バグや仕様」といった回答でも構いません。

わかりにくい説明で大変恐縮ですが、何卒宜しくお願い申し上げます。


// ドキュメントクラス Main.as
package {
	import flash.display.Sprite;
	import flash.display.Graphics;
	import flash.events.MouseEvent;
		
	public class Main extends Sprite {
		private var target_sp:Sprite;
		private var mask_sp:Sprite;
		public function Main() {
			target_sp = new Sprite();
			var g:Graphics = target_sp.graphics;
			g.beginFill(0xFF0000, 1);
			g.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
			g.endFill();
			addChild(target_sp);
			mask_sp = new Sprite();
			target_sp.addChild(mask_sp);
			//addChild(mask_sp); // こちらでは問題なし
			target_sp.mask = mask_sp;
			target_sp.cacheAsBitmap = mask_sp.cacheAsBitmap = true;
			stage.addEventListener(MouseEvent.CLICK, clickHandler);
		}
		private function clickHandler(e:MouseEvent):void {
			mask_sp.x = e.target.mouseX;
			mask_sp.y = e.target.mouseY;
			var g:Graphics = mask_sp.graphics;
			g.beginFill(0x000000, 1);
			g.drawRect(-100, -100, 200, 200);
			g.endFill();
		}
	}
}
野中文雄
Åê¹ÆNo.48725
投稿日時: 2012-1-30 22:57
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: cacheAsBitmap=trueにしたマスクへの描画位置がずれる
Flash Player 10にすれば解消するようです。バグと評価します。下記のスクリプトをFLAのフレームレート1fpsくらいで確かめると、マスク用インスタンスへの描画は正しく行われているにもかかわらず、マスクとして適用されるイメージが違ってしまっているように見えます。
引用:
vaderさんは書きました:
作業環境は、
Mac OS 10.6.8
Flash CS5
ActionScript3.0
Flash Player9
になります。

下記は、単純化するために構成を最小限にしたドキュメントクラスのコードです。
target_spはマスクの対象となるSprite、mask_spはマスク用のSpriteです。この2つのSpriteは、cacheAsBitmap=trueにしてあります。

ステージ上をクリックするとmask_spの座標をクリックした座標に変更し、その座標を中心とした200pxの矩形を描画するようにしています。

しかし、X, Y座標ともステージ座標が100未満の場所をクリックした場合、ステージ座標が0の位置から描画されてしまいます。

// ドキュメントクラス Main.as
package {
	import flash.display.Sprite;
	import flash.display.Graphics;
	import flash.events.MouseEvent;
	import flash.events.Event;  // 追加
		
	public class Main extends Sprite {
		private var target_sp:Sprite;
		private var mask_sp:Sprite;
		public function Main() {
			target_sp = new Sprite();
			var g:Graphics = target_sp.graphics;
			g.beginFill(0xFF0000, 1);
			g.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
			g.endFill();
			addChild(target_sp);
			mask_sp = new Sprite();
			target_sp.addChild(mask_sp);
			//addChild(mask_sp); // こちらでは問題なし
			target_sp.mask = mask_sp;
			target_sp.cacheAsBitmap = mask_sp.cacheAsBitmap = true;
			stage.addEventListener(MouseEvent.CLICK, clickHandler);
		}
		private function clickHandler(e:MouseEvent):void {
			// 以下2行追加
			stage.addEventListener(Event.ENTER_FRAME, delay);
			target_sp.mask = null;
			mask_sp.x = e.target.mouseX;
			mask_sp.y = e.target.mouseY;
			var g:Graphics = mask_sp.graphics;
			g.beginFill(0x000000, 1);
			g.drawRect(-100, -100, 200, 200);
			g.endFill();
		}
		function delay(eventObject:Event):void {  // メソッド追加
			target_sp.mask = mask_sp;
			trace(mask_sp.x, mask_sp.y, mask_sp.width, mask_sp.height);
			stage.removeEventListener(Event.ENTER_FRAME, delay);
		}
	}
}


----------------
 

vader
Åê¹ÆNo.48726
投稿日時: 2012-1-31 1:22
常連
居住地: 東京
投稿: 76
使用環境:
MacOS10.8,FlashCS6
Re: cacheAsBitmap=trueにしたマスクへの描画位置がずれる
野中様

ご回答頂き、誠にありがとうございます。
お教え頂いたコードでFPSを1にして確認して見た所、野中さんのおっしゃる通り、マスクへの描画自体は正しく行われ、cacheAsBitmapをtrueにするタイミングでずれていることが確認できました。

下記コードは、cacheAsBitmapをtrueにするタイミングをさらに1フレームずらすように変更したものですが、はっきりと1フレーム遅れてマスクがずれることが確認できました。

グラデーションマスクって結構使うと思うので、ちょっと困ったバグですね。
今回は、mask_spをメインタイムラインにaddChildして対処しようと思います。

原因が特定できて、とてもすっきりしました。貴重なお時間を頂き、本当にありがとうございました。


// ドキュメントクラス Main.as
package {
	import flash.display.Sprite;
	import flash.display.Graphics;
	import flash.events.MouseEvent;
	import flash.events.Event;  // 追加
		
	public class Main extends Sprite {
		private var target_sp:Sprite;
		private var mask_sp:Sprite;
		public function Main() {
			target_sp = new Sprite();
			var g:Graphics = target_sp.graphics;
			g.beginFill(0xFF0000, 1);
			g.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
			g.endFill();
			addChild(target_sp);
			mask_sp = new Sprite();
			target_sp.addChild(mask_sp);
			//addChild(mask_sp); // こちらでは問題なし
			target_sp.mask = mask_sp;
			//target_sp.cacheAsBitmap = mask_sp.cacheAsBitmap = true; // コメントアウト
			stage.addEventListener(MouseEvent.CLICK, clickHandler);
		}
		private function clickHandler(e:MouseEvent):void {
			target_sp.cacheAsBitmap = mask_sp.cacheAsBitmap = false; // 追加
			// 以下2行追加
			stage.addEventListener(Event.ENTER_FRAME, delay);
			target_sp.mask = null;
			mask_sp.x = e.target.mouseX;
			mask_sp.y = e.target.mouseY;
			var g:Graphics = mask_sp.graphics;
			g.beginFill(0x000000, 1);
			g.drawRect(-100, -100, 200, 200);
			g.endFill();
		}
		function delay(eventObject:Event):void {  // メソッド追加
			target_sp.mask = mask_sp;
			trace(mask_sp.x, mask_sp.y, mask_sp.width, mask_sp.height);
			stage.removeEventListener(Event.ENTER_FRAME, delay);
			stage.addEventListener(Event.ENTER_FRAME, delay2);
		}
		private function delay2(e:Event):void { // さらにメソッド追加
			// さらに1フレーム遅らせてcacheAsBitmapをtrueに
			stage.removeEventListener(Event.ENTER_FRAME, delay2);
			target_sp.cacheAsBitmap = mask_sp.cacheAsBitmap = true;
			trace("cacheAsBitmap=true後:", mask_sp.x, mask_sp.y, mask_sp.width, mask_sp.height);
		}
	}
}
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops