【问题标题】:Make mouse position relative to camera zoom level?使鼠标位置相对于相机缩放级别?
【发布时间】:2012-10-05 17:09:15
【问题描述】:

我刚刚在我的小 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 世界的方法?

【问题讨论】:

  • 我猜你在做一个 2D 游戏?这是一个常见的问题。大多数“正确的”(不一定,但它们就是这样称呼的)2D 游戏实际上是带有受限相机(无旋转)的 3D 游戏。要放大,您只需缩小视角即可。
  • 是的,我正在制作一个 2D 游戏,它不需要任何旋转。但我想我已经这样做了?
  • 如果你已经这样做了 -> 也就是你有 2 个三角形,你可以在上面绘制你的纹理,它们配对成一个对象并放大/缩小你改变视角......你不会有这个问题。当然,如果你的 hitboxes 是在屏幕空间中定义的,你会这样做,但它们应该绑定到对象,不是吗?
  • 我相信碰撞箱和我使用它们的方式是这里的问题。基本上,当我从 SDL 跳到 OpenGL 时,它们根本没有改变。不过,我真的不知道我该怎么做。

标签: python opengl camera zooming pyglet


【解决方案1】:

如果您使用 pygame.Rect,您指定的是屏幕上的一个点,而不是 3d 世界中的一个点。

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

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

【讨论】:

  • 明白你的意思,但不完全是演示。肯定会调查这个。自我注解:从一开始就学会在当前环境下做事,不要试图从前一个环境中偷偷进来,到头来只会坏掉。
  • ^ 非常好。我曾经尝试学习 ruby​​。我用它作为python。我过得很糟糕。然后我决定再仔细看看。 天哪,所有这些糖
猜你喜欢
  • 2014-04-22
  • 2012-10-20
  • 2017-02-11
  • 2016-04-14
  • 2022-06-17
  • 2022-01-06
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多