我刚刚在我的小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世界?
答案 0 :(得分:1)
如果你正在使用pygame.Rect,你在屏幕上指定一个点,而不是3d世界中的一个点。
你应该拥有的是:
基类“敌人”
任何“敌人”必须有两个opengl三角形,一个纹理和一个“hitbox”对象
hitbox对象指定2D空间中的两个相对角。假设3d坐标与两个三角形相同。您可以选择三角形来确定hitbox,在这种情况下不需要实际的对象,只需忘记它并覆盖访问功能。
拍摄时,确定拍摄方向的三维矢量。将屏幕分为两个,左/右,并确定拍摄的位置。然后与向下/向上相同。然后浏览目标。检查能见度1,如果可见,检查屏幕的侧面,如果是右侧,检查是否有弹丸撞击。然后得到它将击中的所有那些的集合,并且只击中第一个。
上面说明的是如何完成此操作的众多版本之一。这是我很快想出来的。我希望看到它你会意识到什么是错的(可能是命中箱与你的实际敌人无关),并且能够根据例子来修复它。