libgdx中的InputProcessor / Multiplexer

时间:2015-10-07 15:01:41

标签: java libgdx

 public boolean touchDragged(int screenX, int screenY, int pointer) {

    if(check) {
        sprite.setPosition(screenX - sprite.getWidth() / 2, Gdx.graphics.getHeight() - screenY - sprite.getHeight() / 2);
        rect.setPosition(screenX - sprite.getWidth() / 2, Gdx.graphics.getHeight() - screenY - sprite.getHeight() / 2);
    }
    return false;
}

这是我的自定义输入处理器类中的方法我在我的主要使用输入多路复用器,因为我有2个类。同时拖动不会移动精灵我一次只能移动一个精灵。 我的意图是同时拖动2个精灵。

感谢您的帮助,抱歉我的英语不好。

2 个答案:

答案 0 :(得分:2)

我不知道这是否是最佳方法,但有点解决方案可能是这样的:

<强> 1。添加一个常量,让您知道允许同时移动多少个对象:

private static final int MAX_TOUCHES = 4;

<强> 2。添加一个固定大小的集合,这样你就可以管理当前可能移动的所有精灵:

private final Array<Sprite> sprites = new Array<Sprite>(MAX_TOUCHES);

3。现在,在您正在处理触摸的班级中,实施touchDown()touchDragged()touchUp()

/**
 * In the touchDown, add the sprite being touched
 **/
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
    // Just allow 4 sprites to move at same time
    if(pointer >= MAX_TOUCHES) return true; 

    // Get the sprite at this current position...
    Sprite sprite = getSpriteAtThisPosition(screenX, screenY);

    // If sprite found, add to list with current pointer, else, do nothing
    if(sprite != null) {
        sprites.set(pointer, sprite);
    }
    return true;
}

getSpriteAtThisPosition()只是一个返回该位置第一个当前精灵的方法,可以返回null

/**
 * In the touchDragged, move this sprite
 **/
@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
    // Just allow 4 sprites to move at same time
    if(pointer >= MAX_TOUCHES) return false; 

    // Get the sprite with the current pointer
    Sprite sprite = sprites.get(pointer);

    // if sprite is null, do nothing
    if(sprite == null) return false;

    // else, move sprite to new position
    sprite.setPosition(screenX - sprite.getWidth() / 2, 
                       Gdx.graphics.getHeight() - screenY - 
                       sprite.getHeight() / 2);
    return false;
}
/**
 * In the touchUp, remove this sprite from the list
 **/
@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
    // Just allow 4 sprites to move at same time
    if(pointer >= MAX_TOUCHES) return true; 

    // remove sprite at pointer position
    sprites.set(pointer, null);
    return true;
}

答案 1 :(得分:0)

InputMultiplexer不是用于处理要移动的两类对象,而是用于处理您想要拥有的两个输入处理器(或更多) - 例如,当您有多个Stage时想与每个玩家互动。

这里你应该做的是记住指针附着在被触摸的物体上,然后根据指针的移动移动它。指针只是例如从0枚举的手指的id。因此,当您用第一根手指触摸屏幕时,它是 0 指针,第二根是 1 - 但是!如果您将第一根手指保持在第二位,则第二根仍然 1 ,因此非常适合此用途。

要处理记住指针ID,您还需要实现 touchDown 侦听器方法

代码示例如下:

            HashMap<Integer, Sprite> ids = new HashMap<Integer, Sprite>();

            ...

            public boolean touchDown (int x, int y, int pointer, int button) 
            {
                Sprite sprite = getSprite(x, y);  //getSprite should iterate over all sprites in your game checking if x/y is inside one of them - you need to implement this one

                ids.put(pointer, sprite);

                return true;
            }

            public boolean touchUp (int x, int y, int pointer, int button) 
            {
                ids.remove(pointer); //removing from hashmap

                return false;
            }

            public boolean touchDragged (int x, int y, int pointer) 
            {
                Sprite sprite = ids.get(pointer);

                if(sprite != null)
                {
                    sprite.setPosition... //and so on
                }
                return false;
            }

要获取有关多点触控处理的更多信息,您可以查看this tutorial