在SpriteBatch上的libgdx中拖动

时间:2013-12-05 05:41:07

标签: android libgdx

我正在制作一个我必须拖动屏幕对象的游戏。我正在使用SpriteBatch.draw(....)方法制作Screen对象,其中我使用旋转,因此只使用一个纹理区域。我必须在对象上实现拖动,但我无法启动拖动部分。 enter image description here

1 个答案:

答案 0 :(得分:1)

package com.dance.utils;

import com.badlogic.gdx.input.GestureDetector;
import com.badlogic.gdx.input.GestureDetector.GestureListener;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.math.Vector3;
import com.dance.screen.GameScreen;


public class GameTouchProcessor 
{
private GameScreen gameScreen;
Vector3 touchPoint=new Vector3();
Vector3 relativeTouchPoint=new Vector3();

Vector2 lastPosition = new Vector2();

GestureListener listner=new GestureListener() 
{

    @Override
    public boolean zoom(float arg0, float arg1) {
        // TODO Auto-generated method stub
        return false;
    }


    @Override
    public boolean fling(float arg0, float arg1, int arg2) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean longPress(float arg0, float arg1) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean pan(float arg0, float arg1, float arg2, float arg3) {
        if(gameScreen.isPlayerDraged)
        {
        gameScreen.cam.unproject(relativeTouchPoint.set(arg0, arg1, 0));
        GameScreen.position.set(lastPosition.x + relativeTouchPoint.x - touchPoint.x, lastPosition.y + relativeTouchPoint.y - touchPoint.y);
        }
        return false;
    }

    @Override
    public boolean panStop(float arg0, float arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean tap(float arg0, float arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean touchDown(float arg0, float arg1, int arg2, int arg3) {
        gameScreen.cam.unproject(touchPoint.set(arg0, arg1, 0));
        lastPosition.set(GameScreen.position); //HERE POSITION IS A VECTOR2 I AM DRAWING MY OBJECT ON THIS POSITION SO WHEN POSITION IS CHANGED OBJECT MOVES
        return false;
    }


    @Override
    public boolean pinch(Vector2 arg0, Vector2 arg1, Vector2 arg2,
            Vector2 arg3) {
        // TODO Auto-generated method stub
        return false;
    }
};

public GestureDetector  detector=new GestureDetector(listner)
{

    public boolean touchUp(int arg0, int arg1, int arg2, int arg3)
    {
        gameScreen.isPlayerDraged=false;
        return false;
    }
};


public GameTouchProcessor(GameScreen gameScreen) 
{
    this.gameScreen=gameScreen;
}

}

在你的游戏画面中(或者你想要拖动的任何一个屏幕)把它放在

    inputMultiplexer=new InputMultiplexer();
    inputMultiplexer.addProcessor(game);
    inputMultiplexer.addProcessor(new GameTouchProcessor(this).detector);
    Gdx.input.setInputProcessor(inputMultiplexer);

不要对我的代码片段感到困惑

在gamecreen中我在vector2的位置上绘制我的对象,我在PAN方法中修改了vector2

获取有关输入处理器的更好信息

input processor

实际上,Libgdx中的所有输入都在一个单独的线程上运行,并为其分配了一个输入处理器。但是当你想在自己的情况下制作自己的处理器时,你想要一个平移回调来拖动对象。

因此,如果你添加你的proccesor比Gdx默认的procesor不会工作,你将不会得到许多重要的输入回调,所以你必须明确处理它们。

所以为了避免我们创建一个多路复用器并将输入过程和你的自定义添加到它,所以它适用于所有的回调

这里我的游戏类正在实现inputproceesor(默认一个)。我已将默认输入处理器与我的自定义输入处理器合并