libgdx多点触摸

27 篇文章 0 订阅

多点触摸。点中两个按钮,同时放开两个手指的时候,只有一个touchUp响应。在ios上尤其明显。解决方案:每隔一段时间就检查当前屏幕有几个手指处于按压状态。


package test.touch;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.utils.Pools;

/**
 * Created by apple on 16/9/8.
 */
public class MultiTouch extends Group implements InputProcessor {
    private static final String  TAG        = MultiTouch.class.getName();
    private              Actor   btnQuit    = null;
    private              Actor   btnRestart = null;
    private              boolean isTouchUp  = false;
    private              float   timer      = 0;


    public MultiTouch() {
        super();
        setSize(1280, 800);
        setPosition(0, 0);
    }


    @Override
    public void act(float delta) {
        super.act(delta);

        if (isTouchUp) {
            timer += delta;
            if (timer > 5) {
                timer = 0;
                StringBuffer buffer = Pools.obtain(StringBuffer.class);
                buffer.setLength(0);

                buffer.append("isTouched = ").append(Gdx.input.isTouched());
                for (int i = 0; i < 4; i++) {
                    buffer.append(", i =")
                          .append(i)
                          .append(", ")
                          .append(Gdx.input.isTouched(i));
                }
                MyLog.log(buffer.toString());
                Pools.free(buffer);

            }
        }
    }

    @Override
    public void draw(Batch batch, float parentAlpha) {
        Gdx.gl20.glBlendColor(1, 1, 1, 1);
        Gdx.gl20.glClear(GL20.GL_ALPHA);
        super.draw(batch, parentAlpha);
    }


    public boolean keyDown(int keycode) {
        String hint = "keyDown";
        MyLog.log(TAG, hint, keycode);
        return false;
    }

    public boolean keyUp(int keycode) {
        String hint = "keyUp";
        MyLog.log(TAG, hint, keycode);
        return false;
    }

    public boolean keyTyped(char character) {
        String hint = "keyTyped";
        MyLog.log(TAG, hint, character);
        return false;
    }

    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        String hint = "touchDown";
        MyLog.log(TAG, hint, pointer, button, screenX, screenY);
        isTouchUp = false;
        return false;
    }

    public boolean touchUp(int screenX, int screenY, int pointer, int button) {
        String hint = "touchUp";
        MyLog.log(TAG, hint, pointer, button, screenX, screenY);
        isTouchUp = true;
        return false;
    }

    public boolean touchDragged(int screenX, int screenY, int pointer) {
        String hint = "touchDragged";
        MyLog.log(TAG, hint, pointer);
        return false;
    }

    public boolean mouseMoved(int screenX, int screenY) {
        String hint = "mouseMoved";
        MyLog.log(TAG, hint);
        return false;
    }

    public boolean scrolled(int amount) {
        String hint = "scrolled";
        MyLog.log(TAG, hint, amount);
        return false;
    }
}

package test.touch;

import com.badlogic.gdx.utils.Pools;

/**
 * Created by apple on 16/9/9.
 */
public class MyLog {

    public static void log(Object... hints) {
        StringBuffer buffer = Pools.obtain(StringBuffer.class);
        buffer.setLength(0);

        for (Object o : hints) {
            if (buffer.length() != 0) {
                buffer.append(" ");
            }

            String s = "";
            if (o == null) {
                s = "null";
            } else if (o instanceof String) {
                s = (String) o;
            } else {
                s = o.toString();
            }
            buffer.append(s);
        }

        System.out.print(buffer.toString() + "\r\n");
        Pools.free(buffer);
    }

}


多按钮触摸,同时抬起只有一个touchUp响应的状况。 解决方案:用

Gdx.input.isTouched(i)

检测有几根手指按压屏幕,每根手指的代号参照touchDown中的point参数。


package test.touch;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.Pools;
import dy.gdx.util.DrawShapUtil;

/**
 * Created by apple on 16/9/8.
 */
public class MultiTouchB extends Group {
    private static final String  TAG        = MultiTouchB.class.getName();
    private              Actor   btnQuit    = null;
    private              Actor   btnRestart = null;
    private              boolean isTouchUp  = false;
    private              float   timer      = 0;


    public MultiTouchB() {
        super();
        setSize(1280, 800);
        setPosition(0, 0);
        initial();
    }

    private void initial() {
        final String hint = "initial";

        btnQuit = new Actor();
        btnQuit.setSize(300, 200);
        btnQuit.setPosition(100, 200);

        btnRestart = new Actor();
        btnRestart.setSize(300, 200);
        btnRestart.setPosition(btnQuit.getX() + btnQuit.getWidth() + 100, 200);

        addActor(btnRestart);
        addActor(btnQuit);

        btnRestart.addListener(new ClickListener() {
            final String btnName = "btnRestart";

            @Override
            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
                MyLog.log(TAG, hint, btnName, ", touchDown ", "pointer = ", pointer, ", button = ", button);
                isTouchUp = false;

                return super.touchDown(event, x, y, pointer, button);
            }

            @Override
            public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
                MyLog.log(TAG, hint, btnName, ", touchUp ", "pointer = ", pointer, ", button = ", button);
                super.touchUp(event, x, y, pointer, button);
                isTouchUp = true;

            }
        });

        btnQuit.addListener(new ClickListener() {
            final String btnName = "btnQuit";

            @Override
            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
                MyLog.log(TAG, hint, btnName, ", touchDown ", "pointer = ", pointer, ", button = ", button);
                isTouchUp = false;

                return super.touchDown(event, x, y, pointer, button);
            }

            @Override
            public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
                MyLog.log(TAG, hint, btnName, ", touchUp ", "pointer = ", pointer, ", button = ", button);
                isTouchUp = true;
                super.touchUp(event, x, y, pointer, button);
            }
        });

    }


    @Override
    public void act(float delta) {
        super.act(delta);

        timer += delta;
        if (timer > 5) {
            timer = 0;
            StringBuffer buffer = Pools.obtain(StringBuffer.class);
            buffer.setLength(0);

            buffer.append("isTouched = ").append(Gdx.input.isTouched());
            for (int i = 0; i < 4; i++) {
                buffer.append(", i =")
                      .append(i)
                      .append(", ")
                      .append(Gdx.input.isTouched(i));
            }
            MyLog.log(buffer.toString());
            Pools.free(buffer);

        }
    }

    @Override
    public void draw(Batch batch, float parentAlpha) {
        Gdx.gl20.glBlendColor(1, 1, 1, 1);
        Gdx.gl20.glClear(GL20.GL_ALPHA);
        super.draw(batch, parentAlpha);

        Actor[] actors = {btnRestart, btnQuit};
        for (Actor child : actors) {
            if (child.getParent() == this) {
                DrawShapUtil.drawEdge(batch, child, Color.GREEN);
            }
        }
    }
}


package dy.gdx.util;

import com.badlogic.gdx.graphics.Camera;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.Actor;

/**
 * Created by apple on 16/9/6.
 * 用来绘制图形(不是贴纹理,是绘制图形)
 */
public class DrawShapUtil {

    private static ShapeRenderer render      = new ShapeRenderer();
    private static Vector2       leftBottom  = new Vector2();
    private static Vector2       leftTop     = new Vector2();
    private static Vector2       rightTop    = new Vector2();
    private static Vector2       rightBottom = new Vector2();

    /**
     * 将actor的边缘绘制出来,调试的时候方便定位
     *
     * @param batch
     * @param actor
     * @param color
     */
    public static void drawEdge(Batch batch, Actor actor, Color color) {
        if (actor == null) {
            return;
        }

        batch.end();

        Camera camera = actor.getStage().getCamera();
        camera.update();
        render.setProjectionMatrix(camera.combined);
        render.setAutoShapeType(true);
        render.begin(ShapeRenderer.ShapeType.Line);

        leftBottom = actor.localToStageCoordinates(leftBottom.set(0, 0));
        leftTop = actor.localToStageCoordinates(leftTop.set(0, actor.getHeight()));
        rightTop = actor.localToStageCoordinates(rightTop.set(actor.getWidth(), actor.getHeight()));
        rightBottom = actor.localToStageCoordinates(rightBottom.set(actor.getWidth(), 0));

        render.setColor(color);
        render.line(leftBottom.x, leftBottom.y, leftTop.x, leftTop.y);
        render.line(leftTop.x, leftTop.y, rightTop.x, rightTop.y);
        render.line(rightTop.x, rightTop.y, rightBottom.x, rightBottom.y);
        render.line(rightBottom.x, rightBottom.y, leftBottom.x, leftBottom.y);
//        render.flush();
        render.end();

        batch.begin();
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值