0

歩いたり、走ったり、ジャンプしたり、曲がったりすることができる2Dキャラクターのアニメーションを作成しています...

すべてのアニメーションを含む1つの大きな「スプライトシート」をロードしてマスクを使用する方がよいでしょうか。それとも、このような大きな画像でマスクを使用しないため、個別のファイル(ウォーク、ランなど)をロードする方がよいでしょうか。すべてのフレーム?

通常のフラッシュディスプレイAPIは十分に高速で、比較的新しいGPUフレームワークよりもバグがはるかに少ないと思うので、StarlingのようなフレームワークでStage3D機能を使用していません。

4

2 に答える 2

1

私の経験では、「ディスプレイリストがシンプルであるほどパフォーマンスが向上する」というルールが一般的に適用されます。つまり、ジョブを実行する最も具体的な表示オブジェクトを使用する必要があります(Shapeで十分な場合はスプライトを使用しないでください。または、意味のあるベクトルよりもビットマップを優先してください)。

これの最も極端なバージョンは、ステージ上に1つのビットマップ表示オブジェクトのみを配置し、画面を更新するたびにcopyPixelsを使用してすべてのゲームオブジェクトを描画することです。copyPixel呼び出しのソースが何であるかは実際には重要ではありません。スプライトシートとして機能する大きなBitmapDataか、アニメーションの単一フレームを表す小さなBitmapDataオブジェクトのいずれかです。この方法は非常に高速で、同時に何百ものオブジェクトを簡単に画面に表示できます。ただし、copyPixelsを使用すると、ゲームオブジェクトを拡大縮小または回転できないため、そのような場合は、はるかに遅いdraw()メソッドにフォールバックする必要があります。もちろん、この単一のビットマップメソッドは、ゲーム内の特定のオブジェクトにマウスイベントをアタッチする必要があるゲームには適していませんが、シューティングゲームやプラットフォームゲームには適しています。

あなたの質問に答えるために、プレーヤーを表す単一のビットマップ表示オブジェクトと、すべてのアニメーションフレームのビットマップデータオブジェクトのコレクションを使用すると、パフォーマンスが向上すると思います。次に、ビットマップのbitmapDataプロパティを表示するフレームに変更するだけです。ゲームの初期化中に、大きなスプライトシートpngをロードして、それを一連のBitmapDataオブジェクトに分割することもできます。

于 2012-09-04T19:20:36.977 に答える
1

(を使用して)文字だけをブリットすることはlock(),copyPixels(),unlock()かなりうまく機能します。

private function updatePixels():void{
    //update sprite sheet copy position based on the frame placements ons prite sheet
    position.x = spriteSourceData[currentFrame].x + offset.x;
    position.y = spriteSourceData[currentFrame].y + offset.y; 
    //draw into the bitmap displayed
    displayData.lock();
    displayData.fillRect(displayData.rect, 0x00FFFFFF);//clear
    displayData.copyPixels(sourceData, spriteData[currentFrame], position);//copy new frame pixels
    displayData.unlock();
}
//a bit about vars:
position:Point
spriteSourceData:Vector.<Rectangle> - from parsed Texture Packer data
offset:Point - front view and side view animations weren't always centred, so an offset was needed
displayData:BitmapData - pluging into a Bitmap object displayed
sourceData:BitmapData - the large sprite sheet
currentFrame:int - image index on the sprite sheet

LeeBrimelowのチュートリアルシリーズSpriteSheetsand BlittingPart 1Part 2Part 3)から学んだことに従って、カスタムクラスを大まかに作成する古いプロジェクトでこれを行いました。

ブリッティングとスプライトシート

つまり、2つのBitmapDataオブジェクトを使用します。

  1. 大きなスプライトシート
  2. ピクセルをコピーする文字(最大の文字境界ボックスのサイズ)だけを表示する小さな画像

私のプロジェクトでは、フロントアニメーションとサイドアニメーションを備えたキャラクターがいて、サイドには1セットのアニメーションを使用し、それに応じてMatrixクラスを使用してサイドアニメーションを反転(スケーリングおよび変換)しました。TexturePackerを使用して、画像シーケンスをスプライトシート、フレームデータ、およびJSONオブジェクトとしてエクスポートしました。現在、ネイティブJSONがサポートされているので、便利です。Texture Packerは無料ではありませんが、お金に見合うだけの価値があります(手頃な価格で、高速で、完璧に機能します)。Flash CS6はまだ使用していませんが、画像シーケンスをインポートして、新機能を備えたスプライトシートをエクスポートすることも可能だと思います。

于 2012-09-04T20:29:17.277 に答える