WriteableBitmapのスクロール


7

背景のスクロールをシミュレートする必要がありますが、実際の画像コントロールの移動は避けたいです。代わりに、をWriteableBitmap使用し、ブリッティングメソッドを使用します。上にスクロールする画像をシミュレートする方法は何ですか?私はロジックに頭を悩ませることができないように購入するさまざまなことを試しました:

 //X pos, Y pos, width, height
 Rect src = new Rect(0, scrollSpeed , 480, height);
 Rect dest = new Rect(0, 700 - scrollSpeed , 480, height);

 //destination rect, source WriteableBitmap, source Rect, blend mode 
 wb.Blit(destRect, wbSource, srcRect, BlendMode.None);
 scrollSpeed += 5;

 if (scrollSpeed > 700) scrollSpeed  = 0;

場合はheight10で、画像は高さがあり、非常にあいまいとmoreso場合です1。高さがより高い場合、画像はより鮮明になりますが、1対1のコピーしか行わないようです。連続ループで上に移動しているように見えるように画像を「スクロール」するにはどうすればよいですか?(画面の高さは700です)。


1
あなたがこれをしたい理由が本当にわかりません、背景画像を移動することの何が問題になっていますか?
aaaaaaaaaaaa 2011年

@eBusiness-複数のスクロールテクスチャを作成しようとしています。画面に合うものもあれば、小さいものもあります。私はそれを間違った方法で行っているかもしれませんが、Silverlightの表面にスクロールテクスチャをどのように作成しますか?
Skoder 2011年

背景について話していますよね?必要な背景を作成するために必要な場所に画像を配置します。そのようにしたくないと具体的に述べているが、理由はない。
aaaaaaaaaaaa

@eBusiness-スクロールする背景を作成するには、2つの画像コントロールが必要です。私は1つを上に動かし、それが画面から外れたときに、それを下にリセットしました(他のユーザーが同じことをしている間)。これはスクロール効果を与えます。背景以外のスクローラーでこれを行うと、画像コントロールはユーザーの目の前で消えてしまいます。それが私が取り組んでいたものであるという理由だけで、質問の背景を尋ねましたが、原理は他のスクロールテクスチャでも同じです。
Skoder

まあ、あなたが望んでいないものではなく、あなたが欲しいものを教えてください。3D環境では、UV座標を変更してスクロール効果を得ることができます。Silverlightのしくみは正確にはわかりませんが、実用的な2D環境では、テクスチャバッファーを経由する必要なく、画像の一部を画面に描画できます。
aaaaaaaaaaaa 2011年

回答:


1

最後に押し出されたビットを格納する場所がないと、バッファを「スクロール」できません。そのため、スワッピングブリット用の別のストア、または別のソースビットマップが必要になるようです。単純化のために後者を選択し、スクロール位置を保存し、それを使用して四角形を生成できます。

2つの四角形を生成する必要があります。1つは上部用、もう1つは下部用で、上部用は高さ0から開始し、下部に達するまで増加する必要があります。これとペアになるソースrectも開始します。高さゼロ、ただしソース画像の下部から開始:

Rect src = new Rect(0, 700-scrollPos, 480, 700);
Rect dest = new Rect(0, 0, 480, scrollPos);

あなたの一番下の四角形は最初に見えるものであり、最初に画面全体を占め、一番上の四角形の邪魔にならないように画面を下に移動しながらサイズを小さくします。そのためのソース四角形は同じですが、下に移動するのではなく、単に縮小します。

Rect src = new Rect(0, 0, 480, 700-scrollPos);
Rect dest = new Rect(0, scrollPos, 480, 700);

そして、これら2つのブリットを使用して、スクローラーがあります。


@リチャード・ファビアン。ポーク。上記の説明を参照してください。混乱を解消できるかもしれません。中間テクスチャーを使用して、スクロール効果を得る通常の方法を検討しますか?
aaaaaaaaaaaa 2011

ほとんどすべての状況で、ソーステクスチャと宛先バッファがあります。Silverlightでは、書き込み可能なテクスチャは宛先バッファであり、ソースはその上にブリットできるものです。宛先バッファーが画面である場合(この場合、シェーダーを使用してテクスチャをスクロールする)、またはパレットアニメーションを使用する場合にのみ、より良い実装に出会いました。
Richard Fabian

私がpygameで何かをブリットするとき、同じタイプの長方形を使用して内部的にスクロールするアイコン/スプライトを生成しますが、それが複数回使用される場合を除いて(スクロールされたアイコンがスクロールするアイコンエンティティの軍隊の1人のメンバーのアイコン)
Richard Fabian

スクロールの問題に対する唯一の解決策であるブリッティングは、通常、フレームにコピーする回数を減らすことによって最適化されます。シルバーライトで直接スクリーンにブリットできる場合は、それを行う方がよいでしょう。実際、使用されている書き込み可能なバッファーのクリッピングエッジを調整できる場合は、別の四角形で2回レンダリングして、私の回答で説明しているのと同じ結果を生成できます。しかし、それができるかどうかわからないので、私の答えでは想定できませんでした。
Richard Fabian

おかげで、私はブリッティングメソッドを使用しました。パフォーマンスへの影響はそれほど大きくないようで、ゲームは非常にシンプルなので、十分です。
Skoder 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.