OpenGl を使用して 2D プラットフォーム ゲームを作成し、C++ を大量に使用しようとしています。左右の矢印キーでプレーヤーを動かしたり、スペースでジャンプしたりできます。すべてのプラットフォームをテキスト ファイルを介してゲームにロードし、画面に出力しました。これはすべて本当にうまくいきます。私が抱えている問題はカメラにあります。右矢印キーを押すと、プレイヤーの x 位置が増加します。問題は、これが発生すると、実際のカメラも動かせないことです。これにより、プレーヤーを移動する代わりに、glTranslatef を使用してすべてのプラットフォームを左に移動する必要があると思います。これは私には少し奇妙に思えますが、これがどのように行われるべきか疑問に思っています。最後の質問は、シーン全体を翻訳するか、プレーヤーを移動するかということです。
3 に答える
glTranslate
プレイヤーと反対方向にカメラを動かして、プレイヤーを追尾します。
カメラは、プレイヤーやその他の可動アイテムに似たゲーム内オブジェクトのようなものであり、レベルは固定位置の静的オブジェクトと考える必要があります。これにより、ゲーム内アイテムやその他のものを簡単に配置できます。
実際に OpenGL で「カメラを移動」すると、実際にはカメラがないため、内部で行われることはまさにそれであり、シーン上のすべてを反対方向に移動します。
解決策として、glutを使用している場合は、使用できます
gluLookAt(x, y, z,
ex, ey, ez,
0, 1, 0)
ここで、(x, y, z) はカメラを配置する座標です。(ex, ey, ez) は、カメラが ((x, y, z) 座標を参照して) 調べたい方向ベクトルです。 ) および (0, 1, 0) はアップ ベクトルです。この関数は、必要なすべてのマトリックス変換を行います。詳細はこちら
glutを使用せず、生のOpenGLのみを使用している場合、同じリンクで、gluLookAtとまったく同じ効果を得るために使用する必要がある同等のopengl呼び出しについても説明されています
したがって、カメラを動かしたい場合 (プラットフォーム ゲームなのでおそらく左右のみ)、x 値を変更するだけで済みます。
私は以下を使用してこれを機能させました..
gl.PushMatrix()
gl.Translatef((1280/2)-float32((player.Body.Position().X)), 0, 0.0)
//Rest of drawing Code Code
gl.PopMatrix()
これは OpenGL + Chipmunk Physics を使用しています (GoLang ですが、これらは単なる c バインディングであるため適用する必要があります)。この場合の 1280 は画面幅です。