补间对象数组元素到touch-LibGdx上的一个角落

时间:2017-05-16 05:01:41

标签: java android libgdx tween universal-tween-engine

在我的游戏中,我有一系列硬币出现在特定的动作上。一旦我触摸硬币,硬币就必须顺利地(如飞行)一个接一个地移动到屏幕的一个角落。 我正在创建和绘制这样的硬币阵列:

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
}

画钱币

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

用于检测硬币上的触摸:

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!!!!!!!!");
             }
        }
}

我现在想要使用通用TweenEngine来触摸它到屏幕的角落。我对补间引擎的概念是全新的。 我无法找到有关如何使用补间引擎实现此影响的任何有用文档。非常感谢。

1 个答案:

答案 0 :(得分:1)

在项目中添加补间引擎,将这些依赖项注入核心模块

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

这些工件在https://jitpack.io中可用,因此请在项目中添加此repo。

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

创建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;
        }
    }
}

使用CoinAccessor注册Coin并更新TweenManager

如果对硬币有适当的触摸

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

修改

对于注册,有相同的静态方法registerAccessor

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

在游戏的更新/呈现方法中调用update() TweenManager方法来更新补间管理器。

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