【问题标题】:LibGdx, How to handle touch event?LibGdx,如何处理触摸事件?
【发布时间】:2026-02-07 16:20:13
【问题描述】:

我是 LibGdx 新手,并试图让我的冰淇淋图像可触摸。 我想知道如何设置输入过程(通过触摸屏幕)。 我需要再上一堂课吗?当我尝试实现输入过程时 我的 Prac1 类,JAVA 不允许我在不更改类抽象的情况下实现。具体来说,我喜欢在用户触摸图像时制作它 ,它计算触摸的次数。这是我的代码,感谢您的帮助。

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class Prac1 extends ApplicationAdapter {
    int w,h,tw,th =0;
    OrthographicCamera camera;
    SpriteBatch batch;
    Texture img;

    @Override
    public void create () {
        w = Gdx.graphics.getWidth();
        h = Gdx.graphics.getHeight();
        camera = new OrthographicCamera(w, h);
        camera.position.set(w/2, h/2, 0);
        camera.update();
        batch = new SpriteBatch();
        img = new Texture(Gdx.files.internal("iceCream.png"));
        tw = img.getWidth();
        th = img.getHeight();
    }

    @Override
    public void render () {
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        batch.begin();
        batch.draw(img, camera.position.x - (tw/2), camera.position.y - (th/2));
        batch.end();
    }
}

【问题讨论】:

    标签: java libgdx user-input


    【解决方案1】:

    你可以使用

    InputProcessor
    处理用户输入。 像这样:-
    import com.badlogic.gdx.ApplicationAdapter;
    import com.badlogic.gdx.Gdx;
    import com.badlogic.gdx.InputAdapter;
    import com.badlogic.gdx.graphics.GL20;
    import com.badlogic.gdx.graphics.OrthographicCamera;
    import com.badlogic.gdx.graphics.Texture;
    import com.badlogic.gdx.graphics.g2d.Sprite;
    import com.badlogic.gdx.graphics.g2d.SpriteBatch;
    
    public class Prac1 extends ApplicationAdapter {
        float w,h,tw,th =0;
        OrthographicCamera camera;
        SpriteBatch batch;
        Sprite img;
    
        @Override
        public void create () {
            w = Gdx.graphics.getWidth();
            h = Gdx.graphics.getHeight();
            camera = new OrthographicCamera(w, h);
            camera.position.set(w/2, h/2, 0);
            camera.update();
            batch = new SpriteBatch();
            img = new Sprite(new Texture(Gdx.files.internal("iceCream.png")));
    
            tw = img.getWidth();
            th = img.getHeight();
            img.setBounds( camera.position.x - (tw/2), camera.position.y - (th/2),tw,th);
            Gdx.input.setInputProcessor(new InputAdapter(){
    
                @Override
                public boolean touchDown(int screenX, int screenY, int pointer, int button) {
    
                    if(img.getBoundingRectangle().contains(screenX, screenY))
                           System.out.println("Image Clicked");
    
                    return true;
                }
    
            });
        }
    
        @Override
        public void render () {
            Gdx.gl.glClearColor(0, 0, 0, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
            batch.begin();
            img.draw(batch);
            batch.end();
        }
    }
    

    用你的代码替换这段代码,你可以很容易地理解这里发生了什么。 你也可以实现

    GestureListener
    处理手势事件。

    【讨论】:

      【解决方案2】:

      由于您需要从图像中获取触摸事件,因此您可以使用 Stage 和 Actors 来实现。你需要用你的纹理创建一个舞台和Image,然后添加Touchable属性:

      iceCreamImg.setTouchable(Touchable.enabled);
      iceCreamImg.addListener(new InputListener() {
      public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
          Gdx.app.debug(TAG, "touchDown()");
          // must return true for touchUp event to occur
          return true;
      }
      public void touchUp (InputEvent event, float x, float y, int pointer, int button) {
          Gdx.app.debug(TAG, "touchUp()");
      }
      

      并将图像添加到舞台。在渲染方法中你应该添加:

      stage.act();
      stage.draw();
      

      并为您的舞台设置输入处理器

      Gdx.input.setInputProcessor(stage);
      

      【讨论】:

        【解决方案3】:

        如果你想在你的类中同时使用ApplicationAdapterInputProcessor,你必须使用接口而不是抽象:将你的类签名更改为Prac1 implements ApplicationListener, InputProcessor

        点击此处查看完整教程: http://www.gamefromscratch.com/post/2013/10/24/LibGDX-Tutorial-5-Handling-Input-Touch-and-gestures.aspx

        【讨论】: