【问题标题】:Game UI without using libraries不使用库的游戏 UI
【发布时间】:2012-05-17 20:34:59
【问题描述】:

我想制作自己的简单游戏 UI,并且我想我知道主要内容是如何完成的。问题是我不知道如何通过在 3D 视图中使用屏幕坐标来绘制简单的 2D 四边形?这甚至可能吗?也许我应该用另一种方式来绘制游戏 UI?

请不要推荐任何库。我想了解它是如何完成的,而不是使用现有的东西。

【问题讨论】:

  • 作为游戏行业 10 年的资深人士,我可以说它的做法是使用现有的库。除非你的计划是创建一个 UI 界面库。
  • 为什么我要用一个库来制作五个简单的按钮?
  • 嗯,我认为最困难的是我在这里问的问题。其他的东西很简单:画一个四边形,如果(鼠标坐标在四边形中){ if(mousedown) { do something }}
  • @user714965 哦,你为什么要问这个?
  • 如果您将模型和视图矩阵设置为单位矩阵,则 [-1,1] 范围内的顶点坐标将对应于屏幕宽度/高度,因此 (-1,-1) 将是左上角和 (1,1) 右下角

标签: java lwjgl


【解决方案1】:

由于您包含了 lwjgl 标记,因此通常在 OpenGL 中通常是这样完成的,您也应该可以正常工作:

  1. 照常渲染底层游戏场景
  2. 设置视图,以便您拥有可以在场景顶部渲染的正交视图。它的单位范围从 -1.0f、-1.0f(屏幕左侧、顶部)到 1.0f、1.0f(屏幕底部、右侧),并将绘制在您已经渲染的游戏场景的顶部下方。

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-1, 1, -1, 1, -1, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glDisable(GL_DEPTH_TEST);
    
  3. 使用 -1.0f 到 1.0f 的坐标渲染带纹理的四边形

    glBegin(GL_QUADS);
    // <== Bind your texture, material for your GUI button here
    glVertex3f(-0.5, 0.5, 0);
    glVertex3f(0.5, 0.5, 0);
    glVertex3f(0.5, -0.5, 0);
    glVertex3f(-0.5, -0.5, 0);
    glEnd();
    

这为您提供了分辨率独立性。因此,如果您在 800x600 上玩游戏,四边形将是一种尺寸,但如果您在 1024x768 上玩游戏,它会自动增长以填充屏幕的相同比例区域。

如果您真的想直接在屏幕坐标中写入,那么您可以设置您的 glOrtho(例如,范围从 0.0 到 800.0)。但不建议这样做。

【讨论】:

  • 四边形已绘制,但其后面没有 3D 视图
  • 假设他做了第 1 步,那么这将在“后面”可见。
【解决方案2】:

将投影设置为正交使用 GLU.gluOrtho2D(0f, glutScreenWidth, 0f, glutScreenHeight);

这就是 JBullet 为文本绘制设置投影的方式(他们使用 1 作为 FontRenderer 中的 z 坐标):

// See http://www.lighthouse3d.com/opengl/glut/index.php?bmpfontortho
public void setOrthographicProjection() {
  // switch to projection mode
  gl.glMatrixMode(GL_PROJECTION);

  // save previous matrix which contains the 
  // settings for the perspective projection
  gl.glPushMatrix();
  // reset matrix
  gl.glLoadIdentity();
  // set a 2D orthographic projection
  gl.gluOrtho2D(0f, glutScreenWidth, 0f, glutScreenHeight);
  gl.glMatrixMode(GL_MODELVIEW);
  gl.glLoadIdentity();

  // invert the y axis, down is positive
  gl.glScalef(1f, -1f, 1f);
  // mover the origin from the bottom left corner
  // to the upper left corner
  gl.glTranslatef(0f, -glutScreenHeight, 0f);
}

查看 https://github.com/affogato/JBullet-QIntBio-Fork/blob/master/src/com/bulletphysics/demos/opengl/ 并查看 FontRenderer 和 LwjglGL 类...

【讨论】:

    猜你喜欢
    • 2021-12-06
    • 2012-12-10
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    相关资源
    最近更新 更多