用手势监听器Libgdx移动演员

时间:2014-02-22 18:51:11

标签: libgdx gesture actor gestures stage

您好我一直试图使用Libgdx框架创建一个简单的游戏一段时间。

我有一个背景图像演员和一个棒图形图像演员的舞台,放置在舞台的中央。

我似乎无法理解,在阅读了有关事件处理的stackoverflow和libgdx wiki上的许多帖子之后,如何将事件(如fling和pan)传递给actor,只需将其移动到屏幕上即可。

我非常感谢有关这项工作原理的任何帮助或解释。

我只是不知道如何从pan获取整数值,并将速度值从fling转换为我的actor的Vector2位置变量,以便每次调用render方法时它都可以移动。

以下是我的一些代码:

My GestureDetection Class:

public class GestureDetection implements GestureListener{

    public GestureDetection(){
    }

    @Override
    public boolean touchDown(float x, float y, int pointer, int button) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean tap(float x, float y, int count, int button) {
        System.out.println("tapped");
        return false;
    }

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

    @Override
    public boolean fling(float velocityX, float velocityY, int button) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean pan(float x, float y, float deltaX, float deltaY) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean panStop(float x, float y, int pointer, int button) {
        // TODO Auto-generated method stub
        return false;
    }

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

    @Override
    public boolean pinch(Vector2 initialPointer1, Vector2 initialPointer2,
            Vector2 pointer1, Vector2 pointer2) {
        // TODO Auto-generated method stub
        return false;
    }
}

我的游戏课

public class Game implements Screen{

    StickFlick game;
    SpriteBatch batch;
    Texture gameBackground;
    Stage stage;
    GestureDetector gd;
    InputMultiplexer im;
    WalkingEnemy testEnemy;

    public Game(StickFlick game){
        this.game = game;
        testEnemy = new WalkingEnemy("basic", 100, Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 2);
    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

        //enemy1.update(delta);
        System.out.println("");

        stage.act(Gdx.graphics.getDeltaTime());

        batch.begin();
        stage.draw();
        batch.end();
    }

    @Override
    public void resize(int width, int height) {
        stage = new Stage(width, height, true);
        stage.clear();

        gd = new GestureDetector(new GestureDetection());
        im = new InputMultiplexer(gd, stage);
        Gdx.input.setInputProcessor(im);

        Texture gameBackground = new Texture("data/gameBackground.png");
        Image backgroundImage = new Image(gameBackground);
        backgroundImage.setWidth(Gdx.graphics.getWidth());
        backgroundImage.setHeight(Gdx.graphics.getHeight());
        stage.addActor(backgroundImage);

        stage.addActor(testEnemy.getImage());

        stage.addAction(Actions.sequence(Actions.alpha(0), Actions.fadeIn(1)));

    }

    @Override
    public void show() {
        batch = new SpriteBatch();
    }

    @Override
    public void hide() {

    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void dispose() {

    }

}

1 个答案:

答案 0 :(得分:1)

好的,所以一开始你必须做一些变量,你将保持你的男人的X和Y坐标。为它们设置一些初始值,即x应该是屏幕宽度的一半,屏幕高度的一半是让你的棒人在屏幕的中心。

然后你必须使用你在GestureListener实现中获得的信息来移动你的棍子,即改变它的坐标。你当前的实现绝对没有 - 方法是空的,所以当一些手势发生时你的代码没有对它做出反应。

因此,你可以在你的pan方法中使用deltaX和deltaY来改变那些值的stick man坐标。类似的东西:

X+=deltaX;
y+=deltaY; 

或者你可以将deltaX和deltaY乘以某个常数,如果你想要更快或更慢的移动和/或将deltaY乘以-1,如果移动方向与你想要的方向相反。

或者如果你想使用fling使用方法提供的那些变量 - velocityX和velocityY - 将它们添加到你的man x和y来移动它。

所以基本上,你总是在x,y coords和你实现的GestureListener接口的某种方法中画出棍子男人你应该改变棍子man coords并让他移动。