0

フラッシュの画像からキューブを作成しています。ローダーは、画像のスプライトマップをロードします。

+----++----++----++----++----++----+
|frnt||rght||back||left||top ||bot |
|    ||    ||    ||    ||    ||    |
+----++----++----++----++----++----+

私が得ているエラーは次のとおりです。

エラー#2005:パラメーター0のタイプが正しくありません。タイプはBitmapDataである必要があります。

行上front.draw(src, null, null, null, clip);(コードをコメントアウトし、エラーを受け取らないことで確認)。しかし、理由はわかりません。私はとして定義 srcBitmapData、のtraceはをsrc生成し[object BitmapData]ます。

private function loaderCompleteListener(e:Event):void
{
  log('Complete');
  var front:BitmapData,
    right:BitmapData,
    back:BitmapData,
    left:BitmapData,
    top:BitmapData,
    bottom:BitmapData,
    srcData:Bitmap,
    src:BitmapData,
    clip:Rectangle;

  try
  {
    srcData = this._imageLoader.content as Bitmap;
    src = srcData.bitmapData;
    front = new BitmapData(src.height, src.height, false, 0);
    right = new BitmapData(src.height, src.height, false, 0);
    back = new BitmapData(src.height, src.height, false, 0);
    left = new BitmapData(src.height, src.height, false, 0);
    top = new BitmapData(src.height, src.height, false, 0);
    bottom = new BitmapData(src.height, src.height, false, 0);
    clip = new Rectangle(0, 0, src.height, src.height);

    //This is the line that causes the error
    front.draw(src, null, null, null, clip); //<----
    clip.x += src.height;
    right.draw(src, null, null, null, clip);
    clip.x += src.height;
    back.draw(src, null, null, null, clip);
    clip.x += src.height;
    left.draw(src, null, null, null, clip);
    clip.x += src.height;
    top.draw(src, null, null, null, clip);
    clip.x += src.height;
    bottom.draw(src, null, null, null, clip);
  }
  catch ( e:Error )
  {
    log(e.message);
  }
}

私は何が欠けていますか?

編集して追加:

1つの考慮事項は、画像サイズです。1866×11196の画像を読み込んでいます。明日テストして、小さい画像が機能するかどうかを確認します。Flashが特定のサイズを超える画像を処理できない可能性があります。

4

4 に答える 4

2

Chris が指摘したように、BitmapData の高さまたは幅の組み込みの最大値は 8192 であるため、幅が 11196 の画像をネイティブに使用することはできません。

ただし、ここで見つけることができる BitmapDataUnlimited クラスなどの回避策があります。

于 2011-03-09T11:49:39.383 に答える
1

まず、@Chris、@EyeSeeEm、@Nathan Ostgard に、エラーが発生した理由を教えてくれたことに感謝する必要があります。IOErrorEvent.IO_ERROR画像が正しく読み込まれなかった場合 (少なくとも私には IO エラーのように思えます)を受け取ることを期待していましたが、Flash はそれを十分に処理できなかったようです。そのため、偽のエラーが発生しています。

誰もが指摘したように、AS3 のドキュメントでは、画像が特定のサイズを超えることはできないと指定されています。

フラッシュ プレーヤー 9:

BitmapData オブジェクトの最大幅と最大高さは 2880 ピクセルです。

フラッシュ プレーヤー 10:

AIR 1.5 および Flash Player 10 では、BitmapData オブジェクトの最大サイズは幅または高さが 8,191 ピクセルであり、合計ピクセル数は 16,777,215 ピクセルを超えることはできません。(したがって、BitmapData オブジェクトの幅が 8,191 ピクセルの場合、高さは 2,048 ピクセルに制限されます。)Flash Player 9 以前および AIR 1.1 以前では、制限は高さ 2,880 ピクセル、幅 2,880 ピクセルです。

しかし、意味がないように見える重要な理由は、CS4 ドキュメントの次の行にありますArgumentError

BitmapData オブジェクトが無効な場合 (たとえば、 と がある場合)、または によって破棄された場合、BitmapData オブジェクトのメソッドまたはプロパティを呼び出すと、ArgumentError エラーがスローheight == 0width == 0dispose()ます。

したがって、私の画像は よりも幅が広いため、8191px無効と見なされ、不可解なArgumentError.

これは、呼び出しのコンテキストでは理にかなっていますが、エラーをトリガーせずdrawに呼び出すことができる理由をまだ説明していません。src.height

于 2011-03-09T16:15:21.167 に答える
0

エラーは実際には「パラメーター 0 の型が正しくありません。タイプ IBitmapDrawable' である必要があります - BitmapData ではありません。(とにかく私のマシンでは)。

しかし、BitmapData は確かに IBitmapDrawable です。問題は、構築されていない、または null に等しい特定のクラスとして型指定されたオブジェクトが、実際には何も実装していないという事実にあります。

// Example
var src:BitmapData;
trace(src is IBitmapDrawable); // false

あなたの場合、srcData (Bitmap オブジェクト) に bitmapData がない場合、null が返され、src (BitmapData) が null に設定されます。したがって、null が draw() に渡されると、null は IBitmapDrawable ではないため、びっくりします。

たとえば、次のようにすると:

var o:BitmapData = new BitmapData(100, 100, false, 0);
o.fillRect(new Rectangle(0, 0, 100, 100), 0x334455);

var srcData:Bitmap = new Bitmap(o);
var src:BitmapData;

src = srcData.bitmapData;

trace(src is IBitmapDrawable);

var front:BitmapData = new BitmapData(100, 100, false, 0);
front.draw(src as IBitmapDrawable); // works!

しかし、srcData から o (ビットマップデータ) を削除すると、次のようになります。

var srcData:Bitmap = new Bitmap();
var src:BitmapData;

src = srcData.bitmapData;

trace(src is IBitmapDrawable);

var front:BitmapData = new BitmapData(100, 100, false, 0);
front.draw(src as IBitmapDrawable); // Doesn't work!

繰り返しますが、あなたの場合、Bitmap オブジェクトは入力データを受け取っていません。

于 2011-03-09T03:10:51.963 に答える