【質問】画像データの取り扱い方がわからないorz【ActionScript】

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

【質問】画像データの取り扱い方がわからないorz【ActionScript】

投稿記事 by MoNoQLoREATOR » 14年前

答えてくれる方がいるのかはわからないけど、藁にもすがる思いで投稿!

Loaderを使って取得した画像データをBitmapで受取りたいのですが、

Error: 静的型 flash.display:DisplayObject の値が、関連しない可能性が高い型 flash.display:Bitmap に暗黙で型変換されています。
map = lo.content;

と言われてしまいます。何がいけないのでしょうか。参考書ではBitmapにLoader.contentを代入していましたが!?

↓以下ソース
► スポイラーを表示

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: 【質問】画像データの取り扱い方がわからないorz【ActionScript】

投稿記事 by MoNoQLoREATOR » 14年前

>>Bitmap.bitmapData = (Loader.content as Bitmap).bitmapData;
この瞬間、MoNoQLoREATORに電撃が走る!!
な、なるほど・・・!
世界観が変わったのを感じました。


やはり関数名が小文字から始まるのは気持ち悪かったので、先頭にfをつけて関数であることを示す符号なのだと思うことにしました。

↓以下ソースコード
► スポイラーを表示

アバター
bitter_fox
記事: 607
登録日時: 14年前

Re: 【質問】画像データの取り扱い方がわからないorz【ActionScript】

投稿記事 by bitter_fox » 14年前

MoNoQLoREATOR さんが書きました: やはり関数名が小文字から始まるのは気持ち悪かったので、先頭にfをつけて関数であることを示す符号なのだと思うことにしました。
先頭にfが付くんだったらいっそのことない方が・・・w←

でも、Mainクラスのメソッドはしっかりと命名規則に従ってますよね?

CODE:

private var eveDis:EventDispatcher = new EventDispatcher(Event.COMPLETE as IEventDispatcher);
これは問題ありますよ。
Event.COMPLETEはStringクラスのインスタンスなのでIEventDispatcherにはキャストできません。
asではなく()を使った型変換を行ってみてください。エラーになるはずです。
asの特性のおかげでnullがEventDispatcherコンストラクタの第一引数として実行されていますが、今回EventDispatcherがそこにnullを指定しても動くように出来ていたため特に問題は起きませんでしたが、そうでない場合は問題が起きていたかもしれないので気を付けてください。

ちなみに、EventDispatcherの生成はデフォルト引数(null)で問題ないと思いますよ。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: 【質問】画像データの取り扱い方がわからないorz【ActionScript】

投稿記事 by MoNoQLoREATOR » 14年前

私は、EventDispatcher()には必ず引数を指定しなければならないのかと思い、あてずっぽうで値を入れていたのですが、引数を指定する必要はありませんでした・・・。ここに引数を指定することにはどのような意味があるのですか?

アバター
bitter_fox
記事: 607
登録日時: 14年前

Re: 【質問】画像データの取り扱い方がわからないorz【ActionScript】

投稿記事 by bitter_fox » 14年前

MoNoQLoREATOR さんが書きました:私は、EventDispatcher()には必ず引数を指定しなければならないのかと思い、あてずっぽうで値を入れていたのですが、引数を指定する必要はありませんでした・・・。ここに引数を指定することにはどのような意味があるのですか?
http://livedocs.adobe.com/flash/9.0_jp/ ... tcher.html
Adobe さんが書きました: EventDispatcher クラスは、一般に基本クラスとして使用されます。このため、ほとんどの開発者はこのコンストラクタ関数を使用する必要がありません。ただし、 IEventDispatcher インターフェイスを実装する上級開発者は、このコンストラクタを使用する必要があります。EventDispatcher クラスを拡張できないため、代わりに IEventDispatcher インターフェイスを実装する必要がある場合は、このコンストラクタを使用して、EventDispatcher クラスのインスタンスを集約します。
パラメータ
target:IEventDispatcher (default = null) — EventDispatcher オブジェクトに送出されるイベントのターゲットオブジェクトです。このパラメータが使用されるのは、EventDispatcher インスタンスが、IEventDispatcher を実装するクラスごとに集約される場合です。これは、含んでいるオブジェクトをイベントのターゲットにするために必要です。クラスが単純に EventDispatcher を継承する場合は、このパラメータを使用しないでください。
リファレンスを見るとこのようになっています。
用はEventDispatcherクラスのインスタンスがEventDispatcherとしてふるまうオブジェクトを知っておきたいのでしょう。

あと、リファレンスで「一般に基本クラスとして使用される」と書かれているので継承できる場合は継承して使用するのですね、前言撤回します。

で、この引数が有効になるのは他の何かを継承した際にEventDispatcherを委譲して使う場合になります。

CODE:

// package等略

public class Sample /*extends 何か*/ implements IEventDispatcher // 多重継承できないのでEventDispatcher委譲して実装
{
	private var ed : EventDispatcher = new EventDispatcher(this);

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

	public function dispatchEvent(event : Event) : Boolean
	{
		return ed.dispatchEvent(event);
	}

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

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

	public function willTrigger(type : String) : Boolean
	{
		return ed.willTrigger(type);
	}
}
この様にして使うようです。

EventDispatcherをアダプトする際もIEventDispatcherを実装するべきでしょう。
最後に編集したユーザー bitter_fox on 2011年9月17日(土) 00:07 [ 編集 1 回目 ]

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: 【質問】画像データの取り扱い方がわからないorz【ActionScript】

投稿記事 by MoNoQLoREATOR » 14年前

ありがとうございます。よくわかりました。
ところで、アダプトとは何を指しているのですか?継承とは違うのですか?
最後に編集したユーザー MoNoQLoREATOR on 2011年9月16日(金) 18:39 [ 編集 1 回目 ]

アバター
bitter_fox
記事: 607
登録日時: 14年前

Re: 【質問】画像データの取り扱い方がわからないorz【ActionScript】

投稿記事 by bitter_fox » 14年前

MoNoQLoREATOR さんが書きました:ありがとうございます。よくわかりました。
ところで、アダプトとは何を指しているのですか?継承とは違うのですか?
EventDispatcherに(委譲型)アダプターパターンを適用するという意味です。

コードで言うと次のような感じです。(Registerableはかなり適当です)

CODE:

// package等略

interface Registerable
{
	public function registerEventFunction(type : String, listener : function) : void;
	public function unregisterEventFunction(type : String, listener : function) : void;
	public function dispatchEvent(event : Event) : Boolean;
}

public class ConcreteRegisterable /*extends 何か*/ implements IEventDispatcher, Registerable
{
	private var ed : EventDispatcher = new EventDispatcher(this);

	// Registerableの実装
	public function registerEventFunction(type : String, listener : function) : void
	{
		ed.addEventListener(type, listener, true, 0, false);
	}

	public function unregisterEventFunction(type : String, listener : function) : void
	{
		ed.removeEventListener(type, listener, false);
	}

	public function dispatchEvent(event : Event) : Boolean
	{
		return ed.dispatchEvent(event);
	}

	// IEventListenerの実装
	public function addEventListener(type : String, listener : function, useCapture : Boolean = true, priority : int = 0, useWeakReference : Boolean = false) : void
	{
		ed.addEventListener(type, listener, useCapture, priority, useWeakReference);
	}

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

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

	public function willTrigger(type : String) : Boolean
	{
		return ed.willTrigger(type);
	}
}
ただ、アダプターパターンを適用する場面があるかどうかと言われるとそういった場面は少ないかと思いますw
(IEventListenerを実装しないとEventListenerのコンストラクタにthisを渡すことが出来ないので当然と言えば当然ですが・・・w)
最後に編集したユーザー bitter_fox on 2011年9月17日(土) 00:07 [ 編集 1 回目 ]

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: 【質問】画像データの取り扱い方がわからないorz【ActionScript】

投稿記事 by MoNoQLoREATOR » 14年前

う~ん。頭がパンクしそう。とりあえず、多重継承を可能にする方法があるということがわかりました。
もしそんな場面に直面したら改めて勉強します。
ありがとうございました。