【问题标题】:Simulate Screen Size in OpenGL and Display Scaled Image在 OpenGL 中模拟屏幕尺寸并显示缩放图像
【发布时间】:2012-05-16 15:14:22
【问题描述】:

根据我在开始开发我目前正在开发的游戏时所读到的内容,我得出的结论是,只有当我在 3D 中做东西时,android 上的 openGL 才是好的。我还得出结论,surfaceView 上的画布是构建 2D 游戏的最佳方式。

本着这种想法,我编写了一个自定义图像类,理论上它会根据我的开发手机屏幕与目标手机的比例来缩放每个加载的图像。这个 scaleX 和 scaleY 的想法在整个游戏中是一致的。每个点、图像、速度等都乘以比例因子。

当我将游戏部署到另一台设备时,它每次都会强制关闭。在庞大的代码网络中的某个地方,我的自定义自动缩放系统出错了。在最近的阅读中,我决定调整一切并使用 OpenGL。这就是我的问题所在。

有没有办法让游戏认为它是以原始分辨率播放的,IE 可以轻松地将所有输入坐标转换为它们在我的手机屏幕上表示的坐标。 基本上我想模拟一个 540 x 960 的屏幕,拍一张照片,然后在用户的屏幕上显示该图片的适当比例。

我将如何制作一个以绝对坐标绘制所有内容的画布,然后在 540 x 960 区域中拍摄该画布的照片,以便我可以将第一个画布的图片绘制到画布上向用户显示?

编辑:

我最终希望: 1. 创建一个图像/画布/事物,它是我的游戏的原始分辨率。 2. 将所有内容绘制到所述图像,以原始分辨率创建当前游戏状态。 3. 拍摄该图像并将其缩放到设备屏幕尺寸 4. 向用户展示游戏板。

对于触摸输入,我只需获取用户正在触摸的坐标,并将其乘以比例因子(原始宽度与当前宽度的比率,y 与高度的比率相同)

这使我可以进行简单的更改以保持游戏正常运行,而无需重新编写整个内容。如果这会让我的性能下降,我可能需要使用 OpenGL,否则我会坚持使用那个系统。

我的计划是做这样的事情:

Canvas canvas = new Canvas(bitmap);

其中位图是本机屏幕大小的图像,然后使用我现有的所有代码。

EDI2:

要使用矩阵进行缩放,我会这样做吗:

Canvas canvas; 
Matrix matrix = new Matrix();
matrix.postScale(screenWidth/stockWidth, screenHeight/stockHeight);
canvas.setMatrix(matrix);

....

Game Loop Logic with no image scaling, just drawing and updating of canvas based on   
stock size.

对吗?

【问题讨论】:

  • 我不确定这是您想要在游戏引擎中支持多分辨率的解决方案。查看这个线程,了解如何在引擎中稳健地实现这一点。 stackoverflow.com/questions/10298046/…
  • 我添加了进一步的解释。如果您有想法,我很想听听。
  • 我不明白。那你会使用OpenGL吗?如果是,您可以设置 540x960 单位的正交投影并将其映射到您的视口尺寸(使用信箱)。这将自动使事情规模化。
  • 我不知道该用哪一个。如果 openGL 更好并且很容易改变,我可以做到。如果需要进行大量更改,我想坚持使用 Canvas 并使其工作。我想知道最简单的方法是什么,但要让它发挥作用。
  • 恐怕这本身就是另一个问题,取决于您的其余逻辑对渲染的依赖程度。如果它是孤立的/在一个地方,那么它应该很容易修改。

标签: android opengl-es canvas surfaceview


【解决方案1】:

您可以在 Canvas 上使用 setMatrix 方法,计算一次所需的缩放比例,然后在您的代码中使用固定坐标系。

对于 2D 的 openGL,它的运行速度比 Canvas 快得多,并且为位图提供了更大的内存缓冲区。 Canvas 适用于小型游戏,但不适用于密集型游戏。

【讨论】:

  • 这将如何工作?游戏认为画布是一种尺寸,但矩阵会在向用户显示任何内容之前对其进行缩放?
  • 是的,游戏绘制成逻辑坐标系,矩阵缩放到屏幕坐标系。
  • 所以在我初始化画布的主线程中,我将根据宽度和高度的比率设置矩阵。然后在游戏中我会删除我所有的缩放,画布上的矩阵会自动完成吗?似乎那时我唯一需要的手动缩放就是调整触摸事件的坐标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多