0

我刚刚在我的小 Pyglet 游戏中启动并运行了 OpenGL 的相机缩放,但现在我面临一个问题:当我放大或缩小时,游戏对象的命中框不会明显缩放,所以游戏没有响应鼠标事件正确。更改数千个对象的属性可能有点慢,所以我想知道是否可以修改鼠标的位置。我只是不知道怎么做。缩放是通过glOrtho()乘以参数来完成的。

缩放代码(self.dxself.dy是到目前为止相机的总移动,self.zoom是从 0.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 世界中的一个点。

你应该拥有的是:
一个基类“敌人”。
任何“敌人”都必须有两个 opengl 三角形、一个纹理和一个“hitbox”对象。
hitbox 对象指定 2D 空间中的两个对角。假设 3d 坐标与两个三角形相同。您可以选择三角形来确定 hitbox,在这种情况下不需要实际的对象,只需忘记它并覆盖访问函数。
拍摄时,确定拍摄方向的 3d 矢量。将屏幕一分为二,左/右并确定它的拍摄位置。然后与向下/向上相同。然后浏览您的目标。检查可见性 1st,如果可见,检查屏幕的一侧,如果右侧,检查弹丸是否会击中。

上面说明的是如何做到这一点的众多版本之一。这是我很快想到的。我希望看到它你会意识到哪里出了问题(可能是碰撞箱与你的实际敌人完全无关)并能够根据示例修复它。

于 2012-10-06T16:56:55.343 回答