声明:
本系列文章使用的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