根据我开始开发我目前正在开发的游戏时所读到的内容,我得出的结论是,android上的openGL只有在我用3D做东西时才好。 我还得出的结论是,在 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.
这是对的吗?
您可以在 Canvas 上使用 setMatrix 方法,计算所需的缩放一次,并在代码中使用固定坐标系。
至于2D的openGL,它的工作速度比Canvas快得多,并且具有更大的位图内存缓冲区。Canvas 适用于小型游戏,但不适用于密集型游戏。