LibGDX游戏引擎-2-图片绘制(Texture)

qsuron 发布于 2014-02-27 libGDX框架 19 次阅读 无~ 927 字 预计阅读时间: 4 分钟


作为一个游戏引擎,最基本的东西就是绘制各种元素了,其中最重要的无非就是图片了,下面简单介绍一下libGDX引擎在绘制图片方面的方法:

最简单的方法有:

  • 1 使用Texture作为图片容器,在SpriteBatch上绘制
  • 2 使用TextureRegion截取texture,在SpriteBatch上绘制
  • 3 使用Sprite精灵,设置textureRegion,传入SpriteBatch,进行绘制(例子采用本种类)

首先介绍一下 几个相关的类:

 

一丶Texture 类 (纹理,图片容器)

其实就是承装获取到的目的图片的容器。其实你就直接把Texture当成图片。

 1丶引入Gdx.files:

要把图片文件变成数据输入到程序,需要引入Gdx.files,它是libgdx的文件模块,主要提供以下5大功能:读取文件,写入文件、复制文件、移动文件、列出文件和目录。

1.Classpath: 路径相对于classpath,文件通常为只读。

2.Internal: 内部文件路径相对于程序根目录或者android 的assets文件夹。

3.External: 外部文件路径是相对于SD卡根目录

4.Absolute:assets文件夹本身就是存储资源的文件夹,而且相比resource文件夹,它其中的资源不会生成R中的ID,用来放图片很是合适。

2丶绘制流程

所以用Gdx.files.internal("data/Potato.jpg") 获取图片,然后调用batch.draw(texture,x,y,height,width) 绘制图形,这里的(x,y)是绘图的起点坐标,(height,width)绘制图形的大小,libgdx使用的是笛卡尔坐标系,以左下角为原点。绘制方向是由下向上,由左到右。

3丶例子使用方法:

private Texture texture;
texture = new Texture(Gdx.files.internal("data/libgdx.png"));
batch.draw(texture,x,y,height,width);

 

二丶SpriteBatch类  精灵组

在绘制之前首先要调用begin方法,去开启想对应的绘制状态,当绘制完了,需要调用end方法,来真正的绘制指定的内容。SpriteBatch操作的所有的绘制命令都是在屏幕坐标系统上的,屏幕坐标系统是一个右手坐标系,x轴向右,y轴向上,原点在屏幕左下角,如果我们想做的话,也可以提供模型视口矩阵和投影矩阵给他。

1丶使用方法:

	private SpriteBatch batch;
	batch = new SpriteBatch();

public void render() {
	batch.begin();
	sprite.draw(batch);
	batch.end();
}

	//获取屏幕高宽度
	Gdx.graphics.getWidth();
	Gdx.graphics.getHeight();

2丶注意事项

SpriteBatch实现了disposed接口 , 所以不使用的时候,别忘了销毁资源。在Libgdx中凡是实现了Disposable接口的,在销毁的时候都要调用dispose方法, 这一点不要忘了。

 

 

三丶TextureRegion类     用于截取图片

具体的不做介绍了,这个一般懂使用即可!

//以(100,100)为起点,向左48,向上48截取texture
new TextureRegion(texture,100,100,-48,48);

 

 

四丶例子源代码:

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;


public class MyDemo implements ApplicationListener{
	private SpriteBatch batch;
	private Texture texture;
	private TextureRegion region;
	private Sprite sprite;

	@Override
	public void create() {
		batch = new SpriteBatch();
		texture = new Texture(Gdx.files.internal("data/open.png"));
		region = new TextureRegion(texture,420,120,310,360);//自 (420,120) 截取 310*360
		sprite = new Sprite();
		sprite.setRegion(region);
		sprite.setOrigin(0,0);//旋转中心
		sprite.setRotation(20);//旋转角度
		sprite.flip(true, false);//水平翻转
		sprite.setSize(200,300);//绘制大小
		sprite.setPosition(100,100);//绘制位置
	}

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

	@Override
	public void render() {
		Gdx.gl.glClearColor(1, 1, 1, 1);
		Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
		batch.begin();
		sprite.draw(batch);
		batch.end();
	}

	@Override
	public void resize(int width, int height) {
	}

	@Override
	public void pause() {
	}

	@Override
	public void resume() {
	}
}