OpenGL和9patch可绘制对象

4
我正在使用OpenGL制作Android上的打砖块游戏,我想使用9patch可拉伸图片,这样就可以轻松地将一个砖块扩展到更宽或更高。这是可行的吗?
此外,我创建了我的图像,然后在android工具文件夹中使用draw9patch.exe来制作图像。这需要一些工作量,现在发现每个侧面都增加了几个像素,因此图像不再是2的幂次方。
那么我该如何在OpenGL中使用九宫格可拉伸图片?
3个回答

2

那么我如何在OpenGL中使用九宫格绘图?

您不能。9-patch和绘图是用于常规Android View类的,而不是OpenGL。如果您想要类似的行为,您需要实现自己的OpenGL渲染逻辑,包括解析9-patch PNG文件。


1

看起来NinePatchDrawable对象不允许您访问底层位图,但我想您可以将它们绘制到Canvas上,然后从中读取结果位图。这可能也会解决您的二次幂问题。

然后,您可以使用getPadding()读取填充区域,并将这些位置转换为0..1范围以用作纹理坐标。

然后,在OpenGL中,您将使用九个四边形网格绘制具有纹理的砖块,就像'#'符号一样。您的顶点纹理坐标将是固定的,并对应于您的九宫格填充。您的位置坐标将取决于块的缩放。您将保持角落四边形的大小不变,并根据需要缩放中心四边形。 (剩余四边形将按需要沿一个维度缩放以保持一切连接)。

个人而言,我倾向于忘记Android的九宫格,而是采用砖块艺术品的约定,其中(例如)宽度和高度的中间50%可伸缩,周围25%的部分则不可伸缩。不过这取决于您要放弃多少工作。


我不确定我理解最后一部分。你的意思是要创建像brick_top、brick_middle、brick_left这样的单独图像吗? - user717572
不,这就像你的九宫格图片一样,除非你在所有纹理中都使它们相同,否则没有必要标记可拉伸区域。然后,您可以将它们作为普通的BitmapDrawable加载,从而更轻松地访问底层位图数据并硬编码纹理坐标。 - Martin Stone
重新阅读,我想知道您是否对第三段有所疑虑。如果是这样,那么是的,每个四边形都将包含一个子图像,并且您只会拉伸那些想要拉伸的子图像,并保持九个四边形平铺在一起。 - Martin Stone

0
所以这些图像不再是二的幂,但它们必须是。

如果您使用的是OpenGL-ES 2,则已取消此限制。纹理可以是任意大小。


我刚学习了1.0版本,突然间不会去学习2.0版本。我认为这并没有真正回答我的关于9patch的问题。 - user717572
@user717572:我强烈建议你学习ES-2,因为这样你就能够面向更广泛的受众。例如,WebGL就是基于ES-2的。顺便说一下:我不确定ES-1是否支持任意纹理尺寸,但我刚刚查看了规范,据我所知,ES-1已经支持任意纹理尺寸了。 - datenwolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接