在openGl和一些常见问题的帮助下,2D游戏的可扩展性

时间:2013-03-11 11:21:20

标签: android canvas opengl-es

我计划将我的2D角色游戏原型重新设计为“真实产品”。在这种情况下,我考虑使用openGl而不是Android Canvas。

我之所以这么想是因为我希望游戏能够在具有不同屏幕分辨率的设备上运行。为此,我考虑使用openGl的Cameraview面对我的2D游戏纹理正在移动的墙上。如果当前设备的分辨率对于整个游戏内容来说很小,我想移动摄像机视图,使得角色总是在中间,直到摄像机框架到达“墙”的边缘。 这是一个可能的解决方案,还是你选择不同的方式?

甚至可以在o​​penGl中绘制精灵,就像我可以用画布一样吗?就像几个层之上的彼此。起初瓷砖比数字用简单的方块作为救生圈(第一个背景比它上面的红色生活)等等。

positionRect = new Rect(this.getPositionX(), this.getPositionY()
            - (this.spriteHeight - Config.BLOCKSIZE), this.getPositionX()
            + Config.BLOCKSIZE, this.getPositionY() + Config.BLOCKSIZE);
spritRect = new Rect(0, 0, Config.BLOCKSIZE, spriteHeight);
canvas.drawBitmap(this.picture, spritRect, positionRect, null);

如果是这样,我如何开始获得第一个背景,也许第一个Dot(一个.png图片)?我没有找到任何教程给我正确的开球。我知道如何设置GLSurfaceView的项目等等。

2 个答案:

答案 0 :(得分:2)

您需要进行一些调整,但这很容易。既然你可以得到一个教程并开始一些简单的程序,我会给你一些指示:

首先,你应该研究一下预测。您可以在投影矩阵上使用“glFrustumf”或“glOrthof”。第一个用于3D更多,所以使用Ortho。此方法中的参数将表示屏幕的坐标系边界。如果您希望它们与大多数“视图”系统相同,则插入值:top=0, left=0, right=view.width, right=view.height

现在你可以在

中创建一个方形缓冲区而不是rect
float[] buffer = 
{origin.x, origin.y, 
origin.x, origin.y+size.height,
origin.x+size.width, origin.y+size.height,
origin.x+size.width, origin.y,
};

纹理坐标为

float[] textureCoordinates = 
    {.0, .0, 
    .0, 1,
    1, 1,
    1, .0,
    };

你还需要加载纹理(在一些初始化中,如果可能的话,只有一次),以便使用谷歌或堆栈溢出,因为它取决于平台......

这几乎是你在绘制方法中加入它所需的全部内容:

enableClientState(vertexArray)
enableClientState(texCoordArray)
enable(texture2d)

//for each object:
vertexPointer(buffer)
texCoordPointer(textureCoordinates) //unless all are same
bindTexture(theTextureRepresentingTheSpriteYouWant)
draw(triangleStrip, 4)

至于移动使用翻译模型矩阵:

pushMatrix()
translatef(x, y, .0)
drawScene()
popMatrix()

答案 1 :(得分:1)

使用opengl时,您不会被约束到"窗口"尺寸。您将为您的世界定义投影矩阵和视口,然后更改"相机",您将只使用投影矩阵和视口。如果我是你,我会在开始这个项目之前拿起一本关于opengl的书,这样你就可以了解opengl是如何工作的。

此外,如果您正在使用java,那么您将需要使用GLSurfaceView类。这可以为您处理所有线程和所有内容,因此您不必担心它。