0

小さな Pyglet ゲームで OpenGL を使用してカメラ ズームを実行しましたが、現在問題に直面しています。マウスイベントに正しく。何千ものオブジェクトのプロパティを変更するのは少し遅いかもしれないので、代わりにマウスの位置を変更できないかと考えていました。方法がわかりません。ズームはglOrtho()、パラメータを乗算して によって行われます。

ズーム コード (self.dxself.dyは、これまでのカメラの合計移動であり、self.zoom0.1 から 2 までの乗数です):

pyglet.gl.glMatrixMode(pyglet.gl.GL_PROJECTION)
pyglet.gl.glLoadIdentity()
pyglet.gl.glOrtho(-screen.width / (2 * self.zoom), screen.width / (2 * self.zoom), -screen.height / (2 * self.zoom), screen.height / (2 * self.zoom), -1, 1)
pyglet.gl.glTranslatef(self.dx - screen.width / 2, self.dy - screen.height / 2, 0)
pyglet.gl.glMatrixMode(pyglet.gl.GL_MODELVIEW)

編集

マウス座標のズーム計算を逆にするのはどうですか?

編集 2

ゲーム オブジェクトとのマウスの衝突を処理する方法は、少なくとも悪名高いものです。私は実際にpygame.Rectオブジェクトを使用してオブジェクトの位置を表し、それをマウスの位置と衝突させています。今までズームを行っていなかったので、これまでのところうまくいきました。OpenGL/3D の世界により適した方法があるのではないでしょうか?

4

1 に答える 1

1

pygame.Rect を使用している場合、3D ワールド内のポイントではなく、画面上のポイントを指定しています。

あなたが持っているべきものは次
のとおりです。基本クラスの「敵」。
「敵」には、テクスチャと「ヒットボックス」オブジェクトの 2 つの OpenGL 三角形が必要です。
ヒットボックス オブジェクトは、2D 空間で対角にある 2 つのコーナーを指定します。3D 座標は 2 つの三角形と同じであると想定されます。三角形を選択してヒットボックスを決定できます。その場合、実際のオブジェクトは必要ありません。それを忘れて、アクセス関数をオーバーライドしてください。
射撃するときは、射撃方向の 3D ベクトルを決定します。画面を左右に 2 分割し、どこを撮影したかを判定します。次に、ダウン/アップと同じです。次に、ターゲットをブラウズします。視認性を確認する まず、視認できる場合は画面の側面を確認し、右側の場合は発射物が当たるかどうかを確認します。

上記の図は、これを行う方法の多くのバージョンの 1 つです。早速思いついたやつです。それを見て、何が悪いのか (おそらく、ヒットボックスが実際の敵とはまったく関係がないという事実) を理解し、例に基づいて修正できることを願っています。

于 2012-10-06T16:56:55.343 に答える