Search code examples
javaandroidlibgdxtweenuniversal-tween-engine

Tween object array elements to one corner on touch-LibGdx


In my game,I have array of coins appearing on a particular action.Once I touch the coins,coins have to move off smoothly(like flying) to one corner of the screen,one by one. I am creating and drawing coin array like this:

private Coin coins[] = new Coin[10];//coin array

for(int i=0;i<coins.length;i++) {
    coins[i]=objectFactory.createCoin();//creating object array of coins
}

draw coins

 for(int i=0;i<coins.length;i++) {
    coinTexture = coinAnimation.getKeyFrame(animationTime, true);
    batch.draw(coinTexture,coins[i].getX(), coins[i].getY());
}

for detecting touch on coin:

if(Gdx.input.isTouched()) {
        Vector3 touchPos = new Vector3();
        touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0);
         game.camera.unproject(touchPos);
         for(int i=0;i<coins.length;i++){
             Rectangle textureBounds=new Rectangle(coins[i].getX(),coins[i].getY(),coins[i].getWidth(),coins[i].getHeight());    
             if(textureBounds.contains(touchPos.x,touchPos.y)) {
                 System.out.println("u touched the coin!!!!!!!!");
             }
        }
}

I now want to use Universal TweenEngine to tween it on touch to the corner of the screen.I am completely new to the concept of tween engine. I am not able to find any helpful documentation on how to achieve this affect with tween engine.Any help would be appreciated.


Solution

  • Add tween engine in your project, inject these dependency in core module

    compile 'com.github.arcnor:universal-tween-engine:6.3.4'
    compile 'com.github.arcnor:universal-tween-engine:6.3.4:sources'
    

    These artifacts are available in https://jitpack.io so add this repo in project.

    repositories {
        maven { url "https://jitpack.io" }
    }
    

    Create CoinAccessor

    public class CoinAccessor implements TweenAccessor<Coin> {
    
        public static final int POS_XY = 1;
        public static final int CPOS_XY = 2;
    
        @Override
        public int getValues(Coin target, int tweenType, float[] returnValues) {
            switch (tweenType) {
                case POS_XY:
                    returnValues[0] = target.getX();
                    returnValues[1] = target.getY();
                    return 2;
    
                case CPOS_XY:
                    returnValues[0] = target.getX() + target.getWidth()/2;
                    returnValues[1] = target.getY() + target.getHeight()/2;
                    return 2;
    
                default: assert false; return -1;
            }
        }
    
        @Override
        public void setValues(Coin target, int tweenType, float[] newValues) {
            switch (tweenType) {
                case POS_XY: target.setPosition(newValues[0], newValues[1]); 
                break;
    
                case CPOS_XY: target.setPosition(newValues[0] - target.getWidth()/2, newValues[1] - target.getHeight()/2); 
                break;
    
                default: assert false;
            }
        }
    }
    

    Register CoinAccessor with Coin and update TweenManager.

    When there is a proper touch on Coin

    Tween.to(coin[i], CoinAccessor.POS_XY, 0.8f).target(targetX,targetY).start(tweenManager);
    

    EDIT

    For registration there is static method registerAccessor for the same.

    Tween.registerAccessor(Coin.class, new CoinAccessor());
    

    Call update() method of TweenManager in your game's update/render method to update tween manager.

    TweenManager tweenManager = new TweenManager();
    tweenManager.update(dt);   // this call should be in render/update method