2012-03-04 12 views
2

私はしばらくこのことに苦労してきました。2dタイルベースのゲームデザイン、どのようにビューポートで地図を描くのですか?

現在、マップに属する100×100タイルのグリッドがあります。

マップはIDrawableを実装します。私はDraw()を呼び出し、0,0で描画します。これは問題ありません。

しかし、これを拡張して本質的にビューポートを描画したいと考えています。プレイヤーは途中で画面に描かれますので、(マップ全体ではなく)各方向に10タイルを表示したいと思います。

私はこのアーキテクチャのためのアーキテクチャを考えていません。私は、自分が描くべき姿勢、つまり私はplayer1.Draw()と言います。これは前に働いていたでしょう。画面上でx、yの位置でプレーヤを描いていましたが、ビューポートではどこを描画するのかが分かりません。

ビューポートに描画するよう指示し、ゲーム内のすべてのオブジェクトを調べて、表示されているオブジェクトを描画する必要がありますか?地図タイルはこれに従うオブジェクトですか?または、ビューポートが両方を結合して地図をインテリジェントに描画する必要がありますか?

私は、典型的なスクロールタイルゲームがどのようにこれを達成しているか知りたいです。

それが重要ならば、私は、XNA

編集、追加するを使用しています:あなたは、そのようなあなたが描く事を伝えると、彼らは自分自身のグラフィックを返すHTMLレンダリングのアプローチを、しようとして、グラフィックスの操作を行うことができ、かつ親はグラフィックを正しい場所に配置しますか?私はスプリットスクリーンのために2つのビューポートが並んでいる場合、どのようにしてエッジの外に描画するのを止めるのだろうと思っていますか? XNAのためではない、具体的

+0

ビューポートは、物事を描く必要があります。次に、目に見えるものと淘汰されたものが分かります。 –

答えて

2

可能な設計:

  1. オブジェクトインスタンスが含まれている2D "世界が" あります。
  2. "オブジェクトインスタンス"は、スプライト参照+世界の座標です。
  3. シーンを描画するときに、指定された2D領域に存在する可視オブジェクトのリストを要求し、次にそれを描画します。

このようなデザインの世界では、非常に大きなものになる可能性があります。

私は、物事が自分自身を描くべきである、つまり私はplayer1.Draw()と言い、それ自体を描画します。

が表示されます。ビューポートの外側にあるオブジェクトは表示されません。

は、どのように私は彼らが、エッジの外に描画を止めるでしょうか?

ないXNAについて確認が、OpenGLは「はさみテスト」/「glViewport」とDirect3D 9を使用すると、レンダリングのためにスクリーン/ウィンドウの一部を使用することができます「SETVIEWPORT」メソッドを持っていました。 clipplanesとステンシルバッファます。また、テクスチャテクスチャをレンダリングするためにレンダリングすることができ(2Dクリッピングのためのやり過ぎであるステンシルを使用しては、しかし、)もあります。これに対処する方法はたくさんあります。

したがって、ビューポートに描画し、ゲーム内のすべてのオブジェクトを調べて、表示されているオブジェクトを描画するように指示する必要がありますか?

大きな世界では、オブジェクトが遅くなるため、すべてのオブジェクトを調べてはいけません。可視オブジェクトをすべてテストせずに見つけることができるはずです。限り、クワッドツリー(我々は2Dであるため)、KDの木、などあなたが数千(または数千数百もの)オブジェクトのを処理できる必要があります。この道 - そのためには、いくつかの空間分割の種類が必要になりますあなたはそれらを一度に見ることはありません。

マップタイルは、この対象となるオブジェクトですか?

目に見えないものを描き続けると、FPSが落ちます。

、彼らはこれが非常に遅くなることがあり、2Dゲームのために

自身のグラフィックを返します。 KISSの原則を覚えています。

+0

情報をお寄せください!ターゲットにレンダリングし、画面にターゲットをレンダリング(およびそれをトリミング)する任意の顕著なスピードの問題を持っているあなたは思いますか? – NibblyPig

+0

@SLC:まあ、画面にターゲットをレンダリングレンダリングが画面に直接描画するよりも遅くする必要があります - あなたは大規模なテクスチャ表面を描画する必要がありますので。ピクセルからピクセルへの精度(すなわち、テクセルと画面のピクセルとの一致)で大きなテクスチャのサーフェスをレンダリングすると、常にスローダウンが発生します。もちろん、後処理フィルタをゲームに適用したい場合、レンダーターゲットを避けることはできません。 – SigTerm

2

いくつかの基本的な考え方、:

  • オブジェクトは、「仮想画面」に自分自身を描くワールド座標では、彼らが画面に自分自身を描画していないが、直接
  • 描画可能オブジェクトが取得」あなたに描画APIを提供する "グラフィックスコンテキスト"オブジェクトです。 「グラフィックスコンテキスト」は、現在のビューポート境界を認識し、ワールド座標からスクリーン座標(すべての描画操作用)への座標変換を実現します。グラフィックスコンテキストは、画面(またはダブルバッファリングが必要な場合はバックグラウンド画面バッファ)への直接描画も行います。
  • ビューポートの可視範囲外に多くのオブジェクトがある場合、パフォーマンスの最適化として、描画ループがオブジェクトの境界チェックを行って、可視領域外にあるかどうかをテストできます。そうであれば、彼ら自身を引き寄せる必要はありません。