2012-08-12 9 views
6

ここでのコンテキストは、Starling FrameworkとともにActionscript 3.0(IDE:Flashbuilder)です。AS3タイルマップレンダリング(1000のタイル付き)

だから、私はプラットフォームやそれに類するものに使用できるタイルマップを作成したいと思います。

800x600ピクセルのステージで8x8ピクセルのタイルを使用したいのですが、問題は、フレームレートを大幅に下げることなく、これらの7500+タイルオブジェクトをステージに追加する方法がわからないことです。

パフォーマンスの低下は、各タイルオブジェクトを初期化するのではなく、各タイルをステージに追加することによって得られることがわかりました。

多くの具体的な情報は提供していませんが、パフォーマンスの低下なしに何千もの静的オブジェクトをステージに描画する標準化された方法があるかどうかを確認しています。私は方法があるように感じ、私はまだそれを見つける必要があります。

更新:あなたの種類の助けのすべての後

、私は偉大な解決策になると思われるものを発見しました。最初は、Amyのソリューションを実装したいと思っていました。copyPixels()とdraw()を使用してマップ全体に対して1つの大きなビットマップデータを作成し、それを画面に描画しました。しかし、StarlingとNative Flashを混在させる必要がなければ、すべてがもっと簡単になるので、これに相当するStarlingがあるかどうかを知りたかったのです。

StarryのRenderTextureクラスをもう一度見て、そのdrawBundled()とdraw()メソッドを使って、すべてのタイルをRenderTextureに簡単に描画できることを発見しました。 RenderTextureをImage(Starling's Image Class)に入れ、その画像を画面に追加するだけです。

その解決策は、私が以前に試みたスプライトの平坦化などの愚かな低速ソリューションより100万倍高速です。レンダリングテクスチャのイメージが画面に表示されている間は、初期化時間が速く、フレームレートが低下しないようです。

これでテストしたいのは、ゲームプレイ中にタイルのグラフィックスを更新するのが簡単な場合です。水がソース(または何か)から広がり、 "Grass"タイルが "Water"タイルにならなければならない場合、RenderTextureとそのイメージは何らかの遅れスパイクやパフォーマンスのいらつきなしに外観を変えることができます。私はすぐにこれをテストします。

ありがとうございました!

答えて

9

ステージにいる多くのオブジェクトを追加しないでください。代わりに、あなたのステージのサイズのBitmpaDataを作成し、それに描画するためにcopyPixels()またはdraw()を使用します。 Here's an articleこれはあなたを始めてくれるはずです。あなたはそのポストで学んだコンセプトを取って、それがカバーしていない具体的なことを学ぶことができます(フラッシュマンマウス。comはピクセル操作に関する良いチュートリアルをたくさん持っています)

+0

ありがとう、このような出発点は、正しい方向に私をプッシュするだけで私が必要なものです! – Brucef

+0

あなたは大歓迎です:) –

+0

今、スターリングフレームワークでネイティブフラッシュ表示オブジェクトを使用する方法を理解する必要があります。 – Brucef

3

ゲームを移動するときに追加または削除する必要があるタイルを管理する必要があります。画面中央の800ピクセルのタイルに追加するだけです。タイルが中心から800ピクセルを超えたら、それを取り除きます。そうすれば、すべてがスムーズに動くはずです。がんばろう。

を検索するか、タイルを1つのビットマップに描画/コピーしてください。基本的に新しいビットマップにタイルを貼り付けることになります。ここではAdobeからの例です:

import flash.display.Bitmap; 
import flash.display.BitmapData; 
import flash.geom.Rectangle; 
import flash.geom.Point; 

var bmd1:BitmapData = new BitmapData(40, 40, false, 0x000000FF); 
var bmd2:BitmapData = new BitmapData(80, 40, false, 0x0000CC44); 

var rect:Rectangle = new Rectangle(0, 0, 20, 20); 
var pt:Point = new Point(10, 10); 
bmd2.copyPixels(bmd1, rect, pt); 

var bm1:Bitmap = new Bitmap(bmd1); 
this.addChild(bm1); 
var bm2:Bitmap = new Bitmap(bmd2); 
this.addChild(bm2); 
bm2.x = 50; 

More Info on the bitmapData class. I think copyPixels is what you are after.

+0

これは別の状況で動作しますが、ここではカメラの動きに合わせてタイルを追加/削除する必要はありませんが、タイルは非常に小さいのでパフォーマンスを大幅に落とすことなく画面(7500)を埋めるために必要な番号を作成する方法を知らない。 – Brucef

+0

いくつかのユニークなタイルがいくつありますか?タイルのビットマップデータをサンプリングして1つのビットマップにすべてコピーすることはできませんか?そうすれば、複数のタイルソースから1つのイメージを作成するだけです。 – Boyd

+0

ユニークなタイル(16未満)はごくわずかですが、動作するように思えますが、そのようなものを実装する方法を完全に理解していません – Brucef

関連する問題