前言
上节我们学会了响应用户输入,并实现了一个小火箭飞行的小游戏,但是我们发现,com.badlogic.gdx.graphics.Texture
只封装了一张图片,并不包含一张纹理的其它属性,为实现完整的游戏对象,我们通常使用封装较为完善的com.badlogic.gdx.graphics.g2d.Sprite
类。
Sprite 精灵
相比 Texture , Sprite 能够更好的实现一个游戏对象,它继承了com.badlogic.gdx.graphics.g2d.TextureRegion
类,并且扩展了许多纹理相关的属性,它的常用构造方法如下:
- Sprite(Texture texture) : 使用 texture 创建 Sprite
- Sprite(TextureRegion region) : 使用 region 创建 Sprite
- Sprite(Texture texture,int srcWidth,int srcHeight) : 从(0,0)开始截取 texture srcWidth*srcHeight 的大小来创建 Sprite
- Sprite(Texture texture,int srcX,int srcY,int srcWidth,int srcHeight) : 从(srcX,srcY)开始截取 texture srcWidth*srcHeight 的大小来创建 Sprite
- Sprite(TextureRegion region,int srcX,int srcY,int srcWidth,int srcHeight) : 从(srcX,srcY)开始截取 region srcWidth*srcHeight 的大小来创建 Sprite
Sprite de 使用
前面讲过, Sprite 包含了许多纹理相关的属性,是的,它通过以下方法改变纹理属性(常用):
//设置 sprite 坐标
sprite.setX(x);
sprite.setY(y);
sprite.setPosition(x,y);
//设置 sprite 大小
sprite.setWidth(width);
sprite.setHeight(height);
sprite.setSize(width,height);
//同时设置 sprite 的位置和大小
sprite.setBounds(x,y,width,height);
//设置 sprite 大小缩放倍数
sprite.setScale(scaleXY);
sprite.setScale(scaleX,scaleY);
//设置 sprite 旋转角度,单位度,逆时针方向为正
sprite.setRotation(dagrees);
//设置 sprite 旋转,缩放的中心点,默认是纹理中心
sprite.setOrigin(originX,originY);
//设置 sprite 是否翻转
sprite.setFlip(isFlipX,isFirpY);
//设置 sprite 的纹理
sprite.setTexture(texture);
sprite.setRegion(region);
当然,你也可以获取 Sprite 的各项属性:
sprite.getX();
sprite.getY();
sprite.getWidth();
spritecaleY();
sprite.getTetxure.getHeight();
sprite.getBoundingRectangle(); //获取矩形(com.badloc.gdx.maths.Rectangle)
sprite.getScaleX();
sprite.getS();
Sprite de 绘制
由于 Sprite 自身包含了许多属性,因此,绘制只需将 SpriteBatch 传入 Sprite 的 draw()方法即可:
soeite.draw(spriteBatch);
尝试
接下来,我们将使用 Sprite 类对上节的小火箭程序进行修改:
package com.libGDX.test;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.InputAdapter;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
public class Test extends ApplicationAdapter {
private SpriteBatch batch;
private Texture hjTexture;
private Sprite hj;
@Override
public void create() {
batch=new SpriteBatch();
hjTexture=new Texture(Gdx.files.internal("hj.png"));
hj=new Sprite(hjTexture);
Gdx.input.setInputProcessor(new InputAdapter() {
@Override
public boolean keyTyped(char character) {
if(character=='w') {
//递增y和旋转角度
hj.setY(hj.getY()+1000*Gdx.graphics.getDeltaTime());
hj.setRotation(hj.getRotation()+10);
}
return false;
}
});
}
@Override
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
//直接传入 batch
hj.draw(batch);
batch.end();
}
@Override
public void dispose() {
//由于 hj 引用了 hjTexture,因此只需释放 hjTexture ,但 hj将无法继续使用
hjTexture.dispose();
batch.dispose();
}
}
运行结果: