声明:
本系列文章使用的Libgdx版本均为0.99版本
Libgdx游戏开发交流群 323876830
游戏的绘制,无外乎文字、几何图形、图片的绘制,一切的架构和封装都是建立在这个基础上的,我们首先来看看这三种绘制在libgdx中怎么来去实现。
完整代码如下:
public class HelloGameActivity extends AndroidApplication
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
initialize(new FirstGame(), false);
}
}
public class FirstGame implements ApplicationListener
{
private Pixmap mPixmap;
private Texture mTexture;
private Mesh mMesh;
private BitmapFont mBitmapFont;
private SpriteBatch mSpriteBatch;
private OrthographicCamera mCamera;
@Override
public void create()
{
mPixmap = new Pixmap(Gdx.files.internal("image1.jpg"));
// 可以直接操作位图添加矩形,这里的坐标是y轴向下的
mPixmap.setColor(Color.BLUE);
mPixmap.drawRectangle(0, 0, 100, 100);
mTexture = new Texture(mPixmap);
mMesh = createTriangle();
mBitmapFont = new BitmapFont(Gdx.files.internal("test.fnt"),
Gdx.files.internal("test.png"), false);
mSpriteBatch = new SpriteBatch();
// 镜头需要设定宽高和镜头中间位置
mCamera = new OrthographicCamera(800, 480);
mCamera.position.set(800 / 2, 480 / 2, 0);
}
@Override
public void resize(int width, int height)
{
// 确保AndroidManifest.xml里面的Activity配置为横屏
// 宽和高才是横屏的值的返回,默认为竖屏的值
}
@Override
public void render()
{
// 镜头的更新与设置矩阵到SpriteBatch
mCamera.update();
mSpriteBatch.setProjectionMatrix(mCamera.combined);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
mSpriteBatch.begin();
// opengl默认的坐标系是左下角为原点的, 绘制的纹理也是以左下角为起点计算的
mSpriteBatch.draw(mTexture, 0, 0);
mBitmapFont.draw(mSpriteBatch, "周末了,happy", 150, 100);
mSpriteBatch.end();
// 绘制一个三角形
mMesh.render(GL10.GL_TRIANGLES, 0, 3);
}
@Override
public void pause()
{
// TODO Auto-generated method stub
}
@Override
public void resume()
{
// TODO Auto-generated method stub
}
@Override
public void dispose()
{
// 所有实现Disposable接口的都需要释放资源
mPixmap.dispose();
mTexture.dispose();
mSpriteBatch.dispose();
}
public Mesh createTriangle()
{
Mesh mesh = new Mesh(true, 3, 3, new VertexAttribute(Usage.Position, 3,
"a_position"));
mesh.setVertices(new float[] { 100f, 100f, 0, 50f, 50f, 0, 150f, 50f, 0 });
mesh.setIndices(new short[] { 0, 1, 2 });
return mesh;
}
}
运行结果截图:
1.首先来看看图片的绘制,Pixmap就代表了一张图片, Texture纹理对Pixmap进行了包装,使用SpriteBatch可以很容易的使用。
2.这里绘制了一个三角形,使用到了Mesh网格,网格可以包含多个顶点,设置顶点属性,可以绘制任何图形,把顶点索引顺序规定好。
其实SpriteBatch也是对Mesh网格的封装,最终提交到GPU的,还是这些信息。如下图可以构造多边形
3.libgdx中的绘制文本较复杂了点,本身对于中文的支持不好,默认只支持这些,根据它的实现方式, 如果想要实现其他中文或者其他语言文本,需要一个fnt文件和一个png图片, 配套使用来构造一个BitmapFont对象。这个libgdx给我们讲提供了一个工具,可以很好的使用。
保存就有两个文件, 导入到工程assets中使用就可以了。
4.工程代码下载
备注:为什么要使用SpriteBatch?
因为我们每次绘制不可能是就一个纹理绘制, 会有很多的纹理进行绘制, 如果每次绘制都提交到GPU一次, 那么效率就太低了, 相同的纹理的图形可以存起来,一次性的发送给GPU,当然他也更喜欢使用同一个纹理,所以如果有小图片,可以合并在一起,后续我们将介绍这个功能的使用,如果碰到了不同的纹理, 他将会提交给GPU进行绘制了,然后开始搜集下一个纹理的数据了。
转载请链接原文地址 http://blog.csdn.net/wu928320442/article/details/16899681