libGDX-4:封装完善的纹理 Sprite

493 阅读2分钟

前言

上节我们学会了响应用户输入,并实现了一个小火箭飞行的小游戏,但是我们发现,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 srcWidthsrcHeight 的大小来创建 Sprite - Sprite(Texture texture,int srcX,int srcY,int srcWidth,int srcHeight) : 从(srcX,srcY)开始截取 texture srcWidthsrcHeight 的大小来创建 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.setRegoin(regoin);
```  
当然,你也可以获取 Sprite 的各项属性:
```java
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();
    }
}

运行结果:

libgdx-4run.png