【问题标题】:Mouse click detection鼠标点击检测
【发布时间】:2020-04-18 16:37:22
【问题描述】:

我认为我只需要对我的代码进行一些更正,但我无法弄清楚我缺少什么。在 Libgdx 上使用输入处理器。

我想在arraylist中添加一个新的食物并在鼠标位置将其绘制到屏幕上,但它没有绘制。

这是我的点击检测:

public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        if(Gdx.input.isButtonPressed(Input.Buttons.LEFT)){
            Food foods;
            foods = new Food(new Sprite(new Texture("FlakeFood.gif")));      //sprite
            foods.setPosition(screenX, screenY);
            food.add(foods);
        }

这是绘制的代码:

batch.begin();
for (int i = 0; i < food.size(); i++) {
            food.get(i).draw(batch);
        }
batch.end();

提前感谢您的帮助!

【问题讨论】:

    标签: java input libgdx mouseevent mouseclick-event


    【解决方案1】:

    我假设 Foodextends Sprite 因为您没有输入 Food 的代码,而您正在调用 Sprite class 的方法

    • touchDown 方法给你的screenY 从上到下 底部,表示 0 位于屏幕顶部,并且 Gdx.graphics.getHeight() 位于屏幕底部。你应该反转Y 的位置,因为libgdx 绘制y-upscreenYy-down 所以它应该是.. foods.setPosition(screenX, Gdx.graphics.getHeight()-screenY);

    • 设置精灵的大小,我看不到你设置精灵的大小,除非你在Food构造函数上设置了它,你应该设置它。 foods.setSize(10,10)

    • 单击时touchDown 方法是否会触发?如果不是,您应该在create 方法中设置输入处理器Gdx.input.setInputProcessor(this)
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
            System.out.println("Does this even run? if not, set the input processor Gdx.input.setInputProcessor(this) in the create method");
            if(button == Input.Buttons.LEFT){
                Food foods = new Food(new Sprite(flakeFoodTexture));
                foods.setPosition(screenX, Gdx.graphics.getHeight()- screenY);// invert the Y position
                foods.setSize(10,10);// set the size
                food.add(foods);
            }
    }
    

    【讨论】:

    • 第一个和最后一个提示都帮助了一堆,代码现在可以按预期工作,谢谢
    【解决方案2】:

    您的代码中有几个错误:

    • 不要每次都创建新纹理,创建一次。
    • 使用按钮参数检查是否为左键。
    • 您需要将屏幕坐标转换为您的世界坐标

    对于最后一个,我建议您使用viewport,然后您可以使用 viewport.unproject 方法转换坐标。您还必须在批次中使用视口相机矩阵才能使用相同的坐标。

    【讨论】:

      猜你喜欢
      • 2021-09-06
      • 2015-08-03
      相关资源
      最近更新 更多