3

私は独学で C++ を学習し、2D タイル マッピングで遊んでいます。

私は、このタイリング チュートリアルに基づいたこのscrolling投稿をここで読んでいます。

上記のチュートリアルと本の助けを借りて、タイル張りの世界と(タイルも)Pearson, Computer Graphics with OpenGL描画する小さなプログラムを作成しました。40x40Sprite

描画/レンダリングの順序に関しては、マップ (または世界) 自体がその後ろのレイヤーであり、スプライトは最前 (または一番上の) レイヤーです。タイルとカスタム スプライトまたは四角形よりも 2 つのタイルの方が相互作用しやすいので、これは良い方法だと思います。あれは正しいですか?

を使用しての内部Keyhandling()を移動できる機能を実装しました。キーを押すと増減するという変数があります。変数を に割り当てるか、 に割り当てるかによって、画面上の任意の方向にどちらか一方を割り当てることができます。mapviewportkeyboards arrow keysoffsetx, offsetymapsprite

どちらもうまく機能していないように見えるので、変数を両方 (マップとスプライト) に割り当てましたが、スプライトには正の値、マップには負の値を割り当てました。したがって、キーを押すと、スプライトが一方向に移動し、マップが反対方向に移動することができます。

私の問題は、スプライトがすぐにウィンドウを離れるのに十分なほど移動し、マップの多くをシーンに持ち込むのに十分でないことです。(ウィンドウには、一度におよそ1/8thのタイルしか表示されません)。

私は一日中考えていましたが、この問題を解決する効率的/効果的な方法spriteは、画面の中央に固定し、キーを押すとmap動き回ることだと思います...実装方法がわかりませんこれだけど。

それは良い方法でしょうか?または、ビューポートまたはカメラも移動することが期待されますか?

4

1 に答える 1

1

キャラクターが移動するたびに、スプライトに関連してすべてを移動する必要はありません。他のスプライトなど、マップ上に他のものもある、より複雑な世界を考えてみましょう。マップを固定したままにして、各スプライトをマップに対して相対的に移動するのが最も簡単です (可動スプライトの場合)。キャラクターがワールド内を移動するたびに、ワールド内のすべてを移動するのはあまり意味がありません。

キャラクターを常に中心にして世界をレンダリングしたい場合は、それで問題ありません。一番いいのはカメラを動かすことです。これにより、カメラをズームイン/ズームアウトしたり、カメラを回転させたりすることもできます。世界中のすべてのオブジェクトを追跡する手間はほとんどありません。

「ビューポート」という言葉の使用には注意してください。これは、OpenGL では非常に特殊なことを意味します。(つまり、関数を見てくださいglViewport)。あなたの本がそれを別の方法で使用している場合、それは問題ありません。あなたが何を意味するのかが100%明確ではないので、私はこれを指摘しているだけです.

于 2013-03-28T05:58:43.013 に答える