0

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

我之所以考虑它是因为我希望游戏可以在具有不同屏幕分辨率的设备上运行。为此,我考虑使用来自 openGl 的 Cameraview 面对墙壁,我的 2D 游戏纹理正在移动。如果当前设备的分辨率对于整个游戏内容来说太小了,我想移动相机视图,以便角色始终位于中间,直到相机框到达“墙”的边缘。这是一个可能的解决方案,还是您宁愿选择不同的方式?

甚至可以像在画布上那样在openGl中绘制精灵吗?就像彼此之上的几层一样。起初,瓷砖比数字更简单,例如简单的正方形作为救生圈(第一个背景比它上面的红色生命)等等。

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);

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

4

2 回答 2

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,
    };

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

这几乎是您在 draw 方法中加入它所需的全部内容:

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()
于 2013-03-11T15:09:50.473 回答
1

使用 opengl 时,您不受“窗口”尺寸的限制。您将为您的世界定义一个投影矩阵和视口,然后要更改“相机”,您只需使用投影矩阵和视口即可。如果我是你,我会在开始这个项目之前拿起一本关于 opengl 的书,这样你就知道 opengl 是如何工作的。

此外,如果您使用的是 java,那么您将需要使用 GLSurfaceView 类。这会为您处理所有线程和一切,因此您无需担心。

于 2013-03-11T15:22:59.960 回答