【发布时间】:2012-10-05 17:09:15
【问题描述】:
我刚刚在我的小 Pyglet 游戏中启动并运行了使用 OpenGL 的相机缩放,但现在我面临一个问题:当我放大或缩小时,游戏对象的命中框不会明显缩放,所以游戏没有'不能正确响应鼠标事件。更改数千个对象的属性可能有点慢,所以我想知道是否可以修改鼠标的位置。我只是不知道怎么做。缩放由glOrtho()完成,参数相乘。
缩放代码(self.dx 和 self.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 世界的方法?
【问题讨论】:
-
我猜你在做一个 2D 游戏?这是一个常见的问题。大多数“正确的”(不一定,但它们就是这样称呼的)2D 游戏实际上是带有受限相机(无旋转)的 3D 游戏。要放大,您只需缩小视角即可。
-
是的,我正在制作一个 2D 游戏,它不需要任何旋转。但我想我已经这样做了?
-
如果你已经这样做了 -> 也就是你有 2 个三角形,你可以在上面绘制你的纹理,它们配对成一个对象并放大/缩小你改变视角......你不会有这个问题。当然,如果你的 hitboxes 是在屏幕空间中定义的,你会这样做,但它们应该绑定到对象,不是吗?
-
我相信碰撞箱和我使用它们的方式是这里的问题。基本上,当我从 SDL 跳到 OpenGL 时,它们根本没有改变。不过,我真的不知道我该怎么做。
标签: python opengl camera zooming pyglet