【質問】画像データの取り扱い方がわからない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を代入していましたが!?

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

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

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

投稿記事 by bitter_fox » 14年前

Bitmapクラスのインスタンスとして宣言されているのにBitmapクラスの親クラス(DisplayObjectクラス)のインスタンスを代入しようとしています。
この代入は不正ですので、as Bitmapとして明示的にキャストするか、DisplayObjectクラスのインスタンスと宣言すればいいのではないでしょうか?

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

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

投稿記事 by MoNoQLoREATOR » 14年前

ありがとうございます。解決しました。しかし、自作の読み込み用関数を使用すると、読み込みは正常に完了しているようなのですが、画像が表示されません。

自作の読み込み用関数は、
.LoadGraph()で読み込む画像のパス(名前)と画像データを格納したいBitmap型オブジェクトを指定

.Start()で完了後に呼び出す関数を指定して読み込み開始

完了後の処理
という仕様です。

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

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

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

投稿記事 by bitter_fox » 14年前

MoNoQLoREATOR さんが書きました:ありがとうございます。解決しました。しかし、自作の読み込み用関数を使用すると、読み込みは正常に完了しているようなのですが、画像が表示されません。

自作の読み込み用関数は、
.LoadGraph()で読み込む画像のパス(名前)と画像データを格納したいBitmap型オブジェクトを指定

.Start()で完了後に呼び出す関数を指定して読み込み開始

完了後の処理
という仕様です。
描画されない根本的な原因は
[codeAS3]

public var reqGraNames:Array = new Array(); //読み込む画像名を記録
public var graLoader:Loader = new Loader(); //これを使いまわして画像の読み込みを行う
public var reqBitmaps:Array = new Array(); //データを格納するBitmap型オブジェクトの参照

public function LoadedGraph(event:Event):void
{
reqBitmaps[loadedNum] = graLoader.content as Bitmap;
}

public function LoadGraph(name:String, recBitmap:Bitmap):void
{
reqGraNames.push(name);
reqBitmaps.push(recBitmap);
reqGraNum++;
}
[/code]
にあります。
このコードが行っている内容は(reqBitmapsの0個目の要素に注目した場合)
reqBitmapsの0個目の要素に引数のrecBitmapを代入して(LoadGraph)
reqBitmapsの0個目の要素にgraLoader.contentを代入しています。(LoadedGraph)
となり、結局recBitmapには何の変化も起きていません。
C言語が得意なら次のソースコードをイメージしていただければ問題点はすぐに理解できるでしょう。

CODE:


#include 

int main()
{
	int *array[5]; // MyLoaderのreqBitmaps
	int valueA[3] = {1, 2, 3}; // Mainクラスのmap
	int valueB[3] = {4, 5, 6}; // MyLoaderのgraLoader.content
	int counter;

	array[0] = valueA; // LoadGraph

	array[0] = valueB; // LoadedGraph

	// 画面にMainクラスのmapを描画
	for (counter = 0; counter < sizeof(valueA) / sizeof(*valueA); counter++)
	{
		printf("%d ", valueA[counter]); // 描画されるのは[4 5 6]ではなく[1 2 3]
	}

	return 0;
}
つまり、起っていることはただ単に配列の要素が変わっただけなのです。

あと、インターネット上でいろいろ調べるとBitmapではなくLoaderをaddChildの引数にしているものが多いのですが、Bitmapでないといけないのでしょうか?

ところで、カプセル化がまったくもって行われてないですよね?
カプセル化はオブジェクト指向でもかなり重要なポイントなのでしっかりと実践することをお勧めします。

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

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

投稿記事 by bitter_fox » 14年前

カプセル化・オブジェクト指向・イベント駆動を意識してちょっと書いてみました。参考になれば幸いです。
(ActionScriptには明るくないのでおかしい表現があれば適切に直してくださいw)
► スポイラーを表示
最後に編集したユーザー bitter_fox on 2011年9月13日(火) 00:20 [ 編集 5 回目 ]

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

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

投稿記事 by MoNoQLoREATOR » 14年前

あらら、言われてみれば当たり前ですね。
イメージしにくいからやっぱりポインタがほしいw

呼び出し元でArray型オブジェクトをつくってその参照を渡し、そこにどんどんデータを放り込む仕様にしました。

それと、完了後にユーザー指定の関数を呼び出す方法をイベントを用いた方法に変更しました。
イベントを使って呼びだそうと思ってEventDispatcherクラスをextendsした所までは良かったのですが、「で、どうすんの?」となっていました。こちらからイベントを送出すればそれで良かったのですね。

bitter_foxさんのソースコードを読んでみたのですが、う~ん、どうも私には他人のソースコードを読み解く力がないみたいです。とりあえずMyLoaderクラスのメンバ変数をprivatにしてみました。

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

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

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

投稿記事 by bitter_fox » 14年前

MoNoQLoREATOR さんが書きました: 呼び出し元でArray型オブジェクトをつくってその参照を渡し、そこにどんどんデータを放り込む仕様にしました。
かなり強引な修正ですね・・・
Arrayのそういった使い方はかなり危険を導いたり本来の使い方じゃないのでやめるべきです。(間違えて別のオブジェクトを取得したり範囲外を参照したり・・・)
そういった強引な方法を使わずともスマートに実装できるように出来ています。

あと、MyLoaderはEventDispatcherとして働くのではなく画像の読み込みを行うクラスとして働くのでEventDispatcherを継承するのは問題があるように思います。
(親クラスと子クラスの関係は次のGRAMさんの回答が分かりやすいです。)
http://dixq.net/forum/blog.php?u=315&b= ... 5251#r5251
MoNoQLoREATOR さんが書きました:bitter_foxさんのソースコードを読んでみたのですが、う~ん、どうも私には他人のソースコードを読み解く力がないみたいです。とりあえずMyLoaderクラスのメンバ変数をprivatにしてみました。
ソースコード内で分からない点があったら聞いてくださいね、どういった意図があるのか答えますので。
それから、ほとんどのフィールドはprivateもしくはprotectedであるべきなのでMainクラスもカプセル化しておいてください。

var bmap:Bitmap = new Bitmap();の後すぐに別のBitmapを代入するのでnew Bitmap()は無駄な代入ではないですか?

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

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

投稿記事 by MoNoQLoREATOR » 14年前

>>var bmap:Bitmap = new Bitmap();の後すぐに別のBitmapを代入するので
>>new Bitmap()は無駄な代入ではないですか?

たしかにそうですね。その下の
bmap = graLoader.content as Bitmap;
でデータをコピーするイメージだったのですが、bmapは参照を受け取っているだけなのですね。


う~む、ポインタが使えれば、「これにデータを入れといてね!」って言って面倒な処理を全て任せられるのに、す、すっきりしねー!でもしかたがない。代入処理は呼び出し元が持つことにします。

継承の話ですが、今回に限り継承した方がかなり楽だと思いますので、これはこれで良いのでは?


ちなみに画像データをLoaderではなくBitmapで受け取る理由は、「LoaderよりBitmapの方がメモリ食わないし、LoaderのメンバにはBitmapDataがない(?)ことが不便」だからです。今のところ大した意味はありません。

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

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

投稿記事 by bitter_fox » 14年前

MoNoQLoREATOR さんが書きました: 継承の話ですが、今回に限り継承した方がかなり楽だと思いますので、これはこれで良いのでは?
かなり楽とのことですが、フィールドでEventDispatcherを持った場合とを考えるとそんなに楽にはなってないのではないですか?
MoNoQLoREATOR さんが書きました:ちなみに画像データをLoaderではなくBitmapで受け取る理由は、「LoaderよりBitmapの方がメモリ食わないし、LoaderのメンバにはBitmapDataがない(?)ことが不便」だからです。今のところ大した意味はありません。
BitmapDataで気付いたんですけど、引数で渡されたBitmap(nullでないもの)のbitmapDataに読み込んだ画像(Loader#contentBitmap)のbitmapData(もしくはそれのクローン)を代入すればいいんじゃないでしょうか?

本当はbmp = loader.load("ファイル名")みたいに戻り値で受ける方法が望ましいですが、Loader#loadの呼び出し元がloadの終了を待たずに処理を続行するのであれば仕方がないですね・・・

あと、色々口うるさくてあれですがActionScript3のリファレンスを見るとメソッドの命名規則がローワーキャメルケースですよね?
MyLoaderのメソッドはそれに従ってないように思うのですが・・・
最後に編集したユーザー bitter_fox on 2011年9月14日(水) 00:30 [ 編集 1 回目 ]

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

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

投稿記事 by MoNoQLoREATOR » 14年前

>>BitmapDataで気付いたんですけど、引数で渡された
>>Bitmap(nullでないもの)のbitmapDataに読み込んだ
>>画像(Loader#contentBitmap)の
>>bitmapData(もしくはそれのクローン)を
>>代入すればいいんじゃないでしょうか?

はい、それは最初に思いついて、その後何度も挑戦しているのですがLoaderの中にbitmapDataが見つからないのです。ないはずはないと思うのですが・・・。しかたなく
Bitmap.bitmapData = Loader.content as BitmapData
としてみたのですが、画像は表示されませんでした。

↓こんな感じです
► スポイラーを表示

>>ActionScript3のリファレンスを見るとメソ
>>ッドの命名規則がローワーキャメルケースですよね?
>>MyLoaderのメソッドはそれに従ってないように思うのですが・・・

つまり、メッソド名は小文字から始めないといけないということですか?

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

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

投稿記事 by bitter_fox » 14年前

MoNoQLoREATOR さんが書きました: はい、それは最初に思いついて、その後何度も挑戦しているのですがLoaderの中にbitmapDataが見つからないのです。ないはずはないと思うのですが・・・。しかたなく
Bitmap.bitmapData = Loader.content as BitmapData
としてみたのですが、画像は表示されませんでした。
Bitmap.bitmapData = (Loader.content as Bitmap).bitmapData;
ですね。
MoNoQLoREATOR さんが書きました: >>ActionScript3のリファレンスを見るとメソ
>>ッドの命名規則がローワーキャメルケースですよね?
>>MyLoaderのメソッドはそれに従ってないように思うのですが・・・

つまり、メッソド名は小文字から始めないといけないということですか?
そうですね。
極力コーディング規則・命名規則に従うべきです。
http://www.trick7.com/blog/2008/03/14-1 ... ons-Naming