package at.maui.flopsydroid.game; import com.badlogic.gdx.graphics.g2d.Animation; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.Interpolation; import com.badlogic.gdx.scenes.scene2d.Action; import com.badlogic.gdx.scenes.scene2d.Event; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.actions.MoveToAction; import com.badlogic.gdx.scenes.scene2d.actions.ParallelAction; import com.badlogic.gdx.scenes.scene2d.actions.RotateToAction; import com.badlogic.gdx.scenes.scene2d.actions.SequenceAction; import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; /** * Created by maui on 08.07.2014. */ public class Droid extends Image { public static final int JUMP_HEIGHT = 30; public static final float JUMP_DURATION = 0.2f; public static final float ANIMATION_DURATION = 0.6f; private Action mCurrentAction; private Animation mAnimation; private TextureRegion mCurrentFrame; private float mDuration; private boolean mDead; private OnDroidCollisionListener mListener; public Droid(TextureRegion[] regions, OnDroidCollisionListener listener) { super(regions[0]); setOrigin(getWidth() / 2, getHeight() / 2); mAnimation = new Animation(ANIMATION_DURATION, regions); mDuration = 0; mDead = false; mListener = listener; } @Override public void act(float delta) { super.act(delta); if (mDead) { return; } // Update Andy's animation frame mDuration += delta; mCurrentFrame = mAnimation.getKeyFrame(mDuration, true); setDrawable(new TextureRegionDrawable(mCurrentFrame)); } public boolean isDead() { return mDead; } public void gotHit() { mDead = true; removeAction(mCurrentAction); RotateToAction faceDown = new RotateToAction(); faceDown.setDuration(JUMP_DURATION); faceDown.setRotation(-90); MoveToAction moveDown = new MoveToAction(); moveDown.setDuration(getDownwardDuration(getX(), Ground.GROUND_HEIGHT)); moveDown.setPosition(getX(), Ground.GROUND_HEIGHT); moveDown.setInterpolation(Interpolation.sineIn); mCurrentAction = new SequenceAction(faceDown, moveDown); addAction(mCurrentAction); if(mListener != null) { mListener.onDroidCollision(); mListener = null; } } public void hitGround() { mDead = true; removeAction(mCurrentAction); MoveToAction moveDown = new MoveToAction(); moveDown.setDuration(getDownwardDuration(getX(), Ground.GROUND_HEIGHT)); moveDown.setPosition(getX(), Ground.GROUND_HEIGHT); moveDown.setInterpolation(Interpolation.sineIn); mCurrentAction = new SequenceAction(moveDown); addAction(mCurrentAction); if(mListener != null) { mListener.onDroidCollision(); mListener = null; } } public void tapped() { removeAction(mCurrentAction); float y = getY() + JUMP_HEIGHT; RotateToAction faceup = new RotateToAction(); faceup.setDuration(JUMP_DURATION); faceup.setRotation(30); MoveToAction moveup = new MoveToAction(); moveup.setDuration(JUMP_DURATION); moveup.setPosition(getX(), y); moveup.setInterpolation(Interpolation.sineIn); Action fly = new ParallelAction(faceup, moveup); RotateToAction faceDown = new RotateToAction(); float duration = getDownwardDuration(y, Ground.GROUND_HEIGHT); faceDown.setDuration(duration); faceDown.setRotation(-90); MoveToAction moveDown = new MoveToAction(); moveDown.setDuration(duration); moveDown.setPosition(getX(), Ground.GROUND_HEIGHT); moveDown.setInterpolation(Interpolation.sineIn); Action fall = new ParallelAction(faceDown, moveDown); mCurrentAction = new SequenceAction(fly, fall); addAction(mCurrentAction); } private float getDownwardDuration(float up, float down) { float dy = up - down; float duration; if (dy <= JUMP_HEIGHT) { duration = JUMP_DURATION; } else { duration = 0.8f; } return duration; } }