前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >libgdx 图形绘制

libgdx 图形绘制

作者头像
阳光岛主
发布2019-02-19 15:28:12
1.6K0
发布2019-02-19 15:28:12
举报
文章被收录于专栏:米扑专栏米扑专栏

纹理(texture)

一个图片从原始格式解码并上传到GPU就被称为纹理。OpenGL要求纹理的高度和宽度都必须是2的n次方大小,只有满足这个条件纹理图片才是有效的。 一旦获取了像素值,我们就可以将这些数据传给OpenGL,让OpenGL生成一个纹理贴图

为了绘制texture,常常使用几何来描述,通过几何对应的顶点来描述纹理。比如要描述一个矩形,可以通过矩形的四个顶点来描述。

要绘图时,首先要绑定纹理,然后传递一个几何描述(如矩形的四个顶点)给OpenGL进行绘制。而绘图的大小和位置由几何描述和OpenGL的viewport的设置共同决定。当然大部分的游戏都会让viewport的大小和屏幕一致,这就意味使用像素更容易让纹理绘制在合适的大小和位置。

绘制一个矩形的几何图形是非常常见的,同样让同一个纹理在不同位置以不同大小位置也是非常常见的,比如漫天的弹幕。但是每次都传递每个形状到GPU进行绘制的效率是较低的。所以许多相同纹理可以一起描述并一起送入GPU,这就是libgdx SpriteBatch类所要做的。

SpriteBatch被赋予了纹理和坐标以便每个图形的绘制,它汇集了很多图形而没有直接提交给GPU。如果它被赋予的纹理不同于原有的,它将保持原有的图形,并获取新的图形。绘制的图片,分辨率必须是2的次方(如32x32, 128x128, 256x512, 512x1024等)

例如: 本示例采用分辨率为 256x256 像素:

图形绘制

绘制图形,程序启动(create)——》读取图片(image)——》纹理(texture)绑定——》绘制初始化(sprite.begin)——》绘制(render)——》绘制完处理(sprite.end)——》销毁(dispose)等步骤。

MainActivity

代码语言:javascript
复制
public class MainActivity extends AndroidApplication {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		initialize(new MyGame(), false);
	}
}

MyGame

代码语言:javascript
复制
public class MyGame implements ApplicationListener {
	private SpriteBatch batch;		// 批量绘制
	private Texture texture;		// 纹理
	
	@Override
	public void create() {
		batch = new SpriteBatch();
		texture = new Texture(Gdx.files.internal("image03.png"));		// 从asset文件读取图片
	}

	@Override
	public void resize(int arg0, int arg1) {	
	}

	@Override
	public void render() {					
		Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);		// 清屏
		Gdx.gl.glClearColor(0.5f, 0.5f, 0.5f, 1);		// 设置屏幕背景为灰色
		
		batch.begin();
		batch.draw(texture, 10, 10);
		batch.end();		
	}

	@Override
	public void pause() {				
	}

	@Override
	public void resume() {				
	}

	@Override
	public void dispose() {	
		texture.dispose();
		batch.dispose();
	}
}

MyGame代码段中,image03.png 图片需要保存在 assets 文件夹内,这是有libgdx文件模块设计决定的

Gdx.files是libgdx的文件模块,主要提供以下5大功能:

  • 读取文件
  • 写文件
  • 复制文件
  • 移动文件

而获取操作文件的FileHandle有5种方法:

1) Classpath,  路径相对于classpath,文件通常为只读。注意: classpath与android的某些函数不兼容,如 Audio.newSound(FileHandle) 和 Audio.newMusic(FileHandle)

2) Internal,  内部文件路径相对于desktop程序根目录,或者android 的assets文件夹。assets文件夹本身就是存储资源的文件夹,相比res文件夹,它其中的资源不会生成R中的ID,用来放图片很是合适

3) External,  外部文件路径相对于desktop程序home目录,或者android 的SD卡根目录

4) Absolute, 绝对的文件系统目录,跨平台时需要注意对应的绝对路径

5) Local, 本地目录,对于android是应用Application自身内部的files目录,对于desktop是root根目录

因此,用Gdx.files.internal("image1.jpg")获取的图片,需要保存在assets文件夹下

读取图片后,调用batch.draw(texture,10,10) 绘制图形,(10,10)是绘制坐标,它基于笛卡尔座标,即以左下角为坐标原点。

运行结果:

上面示例说明:

首先,在create()申请texture,从内部assets文件夹中读取图片 image03.png

texture = new Texture(Gdx.files.internal("image03.png"));

然后,在render() 中渲染绘制图片

batch.draw(texture, 10, 10); // 绘制region

最后,在dispose中销毁资源

texture.dispose(); batch.dispose();

参考推荐:

android游戏开发框架libgdx 图形绘制

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012年12月15日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档