声明:
本系列文章使用的Libgdx版本均为0.99版本
Libgdx游戏开发交流群 323876830
我的完美主义又来了,在我们的代码中,Player的动作实现,太麻烦了吧, 我还要计时,几秒到几秒执行什么动作, 而且还要我还原, 这我可忍受不了,能不能我规定一组动作, 然后你按照我的动作指令,慢慢去执行啊,好吧。 Libgdx已经为我们实现了这部分逻辑, 我们可以直接使用,Action类是他的超类,具体他的子类有几十个,有兴趣的可以看看。好吧。废话不多说了, 重构代码吧。
public class FirstGame implements ApplicationListener
{
private Stage mStage;
@Override
public void create()
{
mStage = new Stage(800, 480);
Player player = new Player();
player.setPosition(800 / 2, 480 / 2);
// 移动操作
MoveByAction action1 = Actions.moveBy(150, 0, 3);
ScaleByAction action2 = Actions.scaleBy(3, 3, 3);
RotateByAction action3 = Actions.rotateBy(90, 3);
// 还原操作
ScaleToAction action4 = Actions.scaleTo(1, 1);
RotateToAction action5 = Actions.rotateTo(0);
MoveToAction action6 = Actions.moveTo(800 / 2, 480 / 2);
// 顺序执行action
SequenceAction sequenceAction = Actions.sequence(action1, action2,
action3, action4, action5, action6);
sequenceAction.setActor(player);
// 无限循环三个动作
RepeatAction epeatAction = Actions.repeat(RepeatAction.FOREVER,
sequenceAction);
player.addAction(epeatAction);
mStage.addActor(player);
}
@Override
public void resize(int width, int height)
{
}
@Override
public void render()
{
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
mStage.act(Gdx.graphics.getDeltaTime());
mStage.draw();
}
@Override
public void pause()
{
// TODO Auto-generated method stub
}
@Override
public void resume()
{
// TODO Auto-generated method stub
}
@Override
public void dispose()
{
// 所有实现Disposable接口的都需要释放资源
mStage.dispose();
}
}
public class Player extends Actor
{
private Pixmap mPixmap;
private Texture mTexture;
private TextureRegion mTextureRegion;
public Player()
{
mPixmap = new Pixmap(Gdx.files.internal("gremlins.png"));
mTexture = new Texture(mPixmap);
mTextureRegion = new TextureRegion(mTexture, 0, 0, 30, 30);
}
@Override
public void draw(SpriteBatch batch, float parentAlpha)
{
//这里要注意,我们添加的action只是改变actor的属性值,绘制的时候并没有
//自动给我们处理这些逻辑, 我们要做的就是取得这些值,然后自己处理
batch.draw(mTextureRegion, getX(), getY(),
mTextureRegion.getRegionWidth() / 2,
mTextureRegion.getRegionHeight() / 2,
mTextureRegion.getRegionWidth(),
mTextureRegion.getRegionHeight(), getScaleX(), getScaleY(),
getRotation());
}
@Override
public void clear()
{
super.clear();
mPixmap.dispose();
mTexture.dispose();
}
}
Libgdx中action的使用还是很方便的,各种动作都有,还有控制类的action,例如顺序执行或者同步执行,循环次数等,并且都是继承action,使用了包装的设计模式, 这样无论怎么操作都是acion,简单的player.addAction(epeatAction);就能操作,不用担心他具体是什么action。
转载请链接原文地址 http://blog.csdn.net/wu928320442/article/details/16940665