【发布时间】:2014-02-23 04:51:21
【问题描述】:
试图找出一个好的解决方案来处理不同的分辨率并在使用 OpenTK (OpenGL) 构建的 2D 横向滚动射击游戏中调整大小。
正交设置如下。
private void Setup2DGraphics()
{
const double halfWidth = 1920 / 2;
const double halfHeight = 1080 / 2;
GL.MatrixMode(MatrixMode.Projection);
GL.LoadIdentity();
GL.Ortho(-halfWidth, halfWidth, -halfHeight, halfHeight, -1.0, 1.0);
GL.MatrixMode(MatrixMode.Modelview);
GL.LoadIdentity();
}
正交固定为 1920*1080 以保持正交固定大小。改变大小会改变游戏行为。对象移动设置为像素/秒等。
public void ResizeWindow(int width, int height)
{
var screenSize = GetOptimalResolution(width, height);
var offsetHeight = screenSize.Y < height ? (height - screenSize.Y) / 2 : 0;
var offsetWidth = screenSize.X < width ? (width - screenSize.X) / 2 : 0;
// Set the viewport
GL.Viewport((int)offsetWidth, (int)offsetHeight, (int)screenSize.X, (int)screenSize.Y);
}
GetOptimalResolution 返回视口大小以保持 16:9 的纵横比。示例:如果屏幕尺寸为 1024*768,则返回 1024*576(缩小高度)。然后它使用高度差的一半作为偏移量将正交放置在视口中更高的位置。这会导致窗口上方和下方出现黑条。
此设置有效。它可以防止所有分辨率的纵横比问题。但是,我在质疑自己这是否是正确的方法?这个设计我能想到的问题: - 在低于 1920*1080 的分辨率下,视图会按比例缩小。这会影响精灵的外观。例如,当按比例缩小时,文本开始看起来很糟糕。 - 如果为了性能而降低分辨率,如果正交保持相同大小,这会产生影响吗?
对此主题进行了大量搜索,但到目前为止,我能找到的唯一内容是关于如何执行操作的简单说明,而不是构建解决方案。我还发现使用 Mipmap 可能会解决我的缩放问题。然而问题仍然存在,我在正确的轨道上吗?是不是应该换个角度看纵横比问题?
【问题讨论】:
-
我认为你应该看看游戏 Hammerwatch。它在内部使用低分辨率,但不会平滑缩放,但在适当的时候,最终结果不需要在像素之间进行插值。