2011-07-06 24 views
1

私は、私の宇宙ゲームで飛んでいるオブジェクトを色づけしようとすると大きな問題を抱えました。AS3のcolormatrixで着色してください - 助けてください!

私がそれらを撃って打つと、敵の敵が点滅します。グラフィックスは事前レンダリングされています(つまり、回転配列と機能があり、オブジェクトの度合いと回転が保存され、パフォーマンスが向上します)。

だから私のアイデアは、追加の色付けの機能を使って回転機能を強化することでした。着色されたAND回転オブジェクトは、通常の回転オブジェクトから離れて格納されます。これを達成するために、ネストされた配列を作成しました。 行1に360オブジェクトの回転グラフィックがあり、2行には回転したオブジェクトの360グラフィックスがあります。

問題:着色は機能しますが、回転はしません(常に0度です)。私を助けてください - 私はそれがなぜ動かないのか何時間もわかっていたので、私はあきらめました。誰かが問題を見つけることができれば、とても涼しいでしょう!どうもありがとうございました!

public function createRotationWithColorBlitArrayFromBD(sourceBitmapData:BitmapData, inc:int, offset:int = 0):Array 
{ 
    trace("sourceBitmapData.width=" + sourceBitmapData.width); 
    trace("sourceBitmapData.height=" + sourceBitmapData.height); 
    tileList = []; 
    tileListSec = []; 
    levelArray = []; 
    var rotation:int = offset; 

    while (rotation < (360 + offset)) 
    { 
     var angleInRadians:Number = Math.PI * 2 * (rotation/360); 
     var rotationMatrix:Matrix = new Matrix(); 

     rotationMatrix.translate(-sourceBitmapData.width * .5, -sourceBitmapData.height * .5); 
     rotationMatrix.rotate(angleInRadians); 
     rotationMatrix.translate(sourceBitmapData.width * .5, sourceBitmapData.height * .5); 

     var matrixImage:BitmapData = new BitmapData(sourceBitmapData.width, sourceBitmapData.height, true, 0x00000000); 

     matrixImage.draw(sourceBitmapData, rotationMatrix); 
     tileList.push(matrixImage.clone()); 

     var colorMatrix:ColorMatrixFilter = new ColorMatrixFilter (
           [1, 0, 0, 0, 0, 
           0, 0, 0, 0, 0, 
           0, 0, 0, 0, 0, 
           0, 0, 0, 1, 0]); 

     matrixImage.applyFilter(sourceBitmapData, sourceBitmapData.rect, point0, colorMatrix); 

     tileListSec.push(matrixImage.clone()); 

     rotation += inc; 

     matrixImage.dispose(); 
     matrixImage = null; 
     rotationMatrix = null; 
    } 

    levelArray = [tileList, tileListSec]; 
    return(levelArray); 
} 

答えて

1

フィルタをソースイメージの回転バージョンに適用する場合は、ソースイメージにフィルタを適用しているようです。あなたがBitmapDataためのドキュメントをよく見ると

、適用するフィルタ機能は、以下のん:

は、ソースイメージとフィルタオブジェクトを受け取り、フィルタ画像を生成します。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#applyFilter

あなたの適用フィルタの呼び出しを使用すると、元画像の新しい、非回転コピーしてあなたのドロー()関数内で行っているマトリックス変換の上に書いています。 applyFilter()は、変形行列の代わりにフィルタを適用する点を除いて、drawと同じです。この場合、matrixImage.draw()(回転する)に変換行列を適用し、matrixImage.applyFilter()(色にする)でそのデータを上書きします。

SOLUTION 迅速な解決策は、次のように変更するために、次のようになります。これは、それが回転した画像になった後matrixImageは、それ自体にカラーフィルタを適用してい

matrixImage.applyFilter(matrixImage, matrixImage.rect, point0, colorMatrix); 

を。

BTW:この場合、matrixImageオブジェクトの2つのclone()を持つ必要はありません。 applyFilter()の結果として得られる最終的なオブジェクトは、ソースとフィルタが1つになっているだけで十分です。しかし、あなたが投稿していない他のゲームロジックにそれらを必要とするかもしれません。

注記:この溶液と 唯一の問題は、次のパフォーマンスキンクである:(アドビドキュメントからBitmapData.applyFilter用())

BitmapDataオブジェクトとsourceBitmapDataパラメータとして指定されたオブジェクトが同じである場合アプリケーションは、オブジェクトの一時コピーを使用してフィルタを実行します。最高のパフォーマンスを得るには、このような状況を避けてください。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#applyFilter

これらの一時コピーをインスタンス化することは非常にリソースを集中ので、ちょうど1つのバッファオブジェクトをinstatiating、それははるかに高速で再利用されます。パフォーマンスの問題がある場合は、ソースとフィルタの間のバッファとして機能する3番目のBitmapDataオブジェクトを作成することをお勧めします。この場合、sourceBitmapDatamatrixImageの代わりに3つのbitmapDataオブジェクトがあります。

+0

非常にありがとうございます!あなたはこの答えで私を助け、私の人生を楽にしました!本当にありがとう!:) – drpelz

+0

こんにちは!嬉しいこと:)サイトのユーザー評価を向上させるために、私の回答に「受け入れ済み」と記入してください。 –

+0

チップをありがとう。やったよ。:) – drpelz

関連する問題