java - 事件多次触发 - LWJGL

标签 java opengl events mouse lwjgl

我正在制作一个 3D 游戏引擎,并且我已经采用了自己的方式来处理触发的事件并将它们传递给每个 GuiComponent 直到它返回 true(已处理),或者它通过所有事件,在这种情况下它会处理事件。

问题是,事件正在触发多个事件。我已确保我没有创建 eventHandler 类的多个实例。我想也许 LWJGL 中的 Mouse 类会多次触发?如果不是,当前设置有什么问题?谢谢

事件处理程序:

public abstract interface EventHandler {
    public abstract boolean handleEvent(Event event);
}

事件:

public class Event {

    public enum events {
        MOUSEPRESSED, MOUSEDRAGGED, MOUSEMOVED
    }

    private events event;

    public float x, y;

    public Event(events event, float x, float y) {
        this.x = x;
        this.y = DisplayManager.HEIGHT - y;
        this.event = event;
    }

    public Event setPos(float x, float y) {
        this.x = x;
        this.y = DisplayManager.HEIGHT - y;
        return this;
    }

    public void setEvent(events event) {
        this.event = event;
    }

    public boolean equals(events event) {
        return event.equals(this.event);
    }
}

图形用户界面按钮:

public class GuiButton extends GuiComponent implements EventHandler {

    @Override
    public boolean passEvent(Event event) {
        if (!visible) return false;
        if (event.equals(Event.events.MOUSEPRESSED) && super.passEvent(event)) {
            texture = texture2;
            return handleEvent(event);
        } else texture = texture1;
        return false;
    }

    @Override
    public boolean handleEvent(Event event) {
        return false;
    }
}

图形用户界面:

public class GuiPanel extends GuiComponent {

    protected List<GuiComponent> components = new ArrayList<GuiComponent>();

    @Override
    public boolean passEvent(Event event) {
        for (GuiComponent c : components) {
            if (c.passEvent(event)) return true;
        }
        return false;
    }

    @Override
    public void setVisible(boolean visible) {
        super.setVisible(visible);
        for (GuiComponent c : components) c.setVisible(visible);
    }

    @Override
    public void update() {
        for (GuiComponent c : components) {
            if (c.isVisible()) c.update();
        }
    }

Gui组件:

public abstract class GuiComponent extends Rectangle {

    public void setVisible(boolean visible) {
        this.visible = visible;
    }

    public boolean isVisible() {
        return visible;
    }

    public boolean passEvent(Event event) {
        if (this.contains(event.x, event.y)) return true;
        return false;
    }

    public abstract void update();
}

组件创建:

    main = new GuiPanel(0, 0, 100, DisplayManager.HEIGHT, "null", loader);
    guiCompoents.add(main);

    entityPanel = new GuiPanel(30, 100, 100, 300, "null", loader);

    b2 = new GuiButton(100, 100, 100, 30, "Entitiesn", "Entitiesh2", loader) {
        public boolean handleEvent(Event event) {
            if (event.equals(Event.events.MOUSEPRESSED)) {
                System.out.println("button2 recieved event");
                createEntity(tree1);
                return true;
            }
            return false;
        }
    };
    entityPanel.add(b2);
    entityPanel.setVisible(false);

    b1 = new GuiButton(30, 100, 100, 30, "Entitiesn", "Entitiess", loader) {
        public boolean handleEvent(Event event) {
            if (event.equals(Event.events.MOUSEPRESSED)) {
                System.out.println("button1 recieved event");
                entityPanel.setVisible(!entityPanel.isVisible());
                return true;
            }
            return false;
        }
    };
    main.add(b1);

    main.add(entityPanel);

编辑: 好的,在进一步搜索后,我尝试了以下方法来检测事件触发:

if (Mouse.getDX() != 0 || Mouse.getDY() != 0) {
        event.setEvent(Event.events.MOUSEMOVED);
        event.setPos(Mouse.getX(), Mouse.getY());
        passEvent(event);
    }

并且该事件被多次触发。 Mouse 类内置于 LWJGL 中,因此这似乎是问题所在。有办法解决这个问题吗?

最佳答案

好吧,经过一番搜索,我发现了这个帖子 here ,这解决了问题。我不完全确定为什么,我应该看一下 Mouse 类的文档,但这似乎有效,并且只触发一次事件,并且它给了我一个已发布的事件,这太棒了。希望这对将来的其他人有帮助!互联网上没有任何关于此问题的信息。

关于java - 事件多次触发 - LWJGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38953187/

相关文章:

java - java.math.BigInteger.bitCount() 的替代品?需要还是不需要?

java - JCE 与项目一起部署,而不是 JDK 更新

c++ - 将浮点值转换为 RGB 值

opengl - glGenerateMipmap 是否在线性空间中为 sRGB 纹理执行平均?

javascript - 检测自定义元素上的 onscroll 事件

jQuery Div 卸载事件发生时可见

cocoa - needsDisplay 触发无限 drawRect 循环

java - 总是出现错误 “Non HTTP response code: java.net.UnknownHostException”

java - JBehave 参数化别名歧义

java - LWJGL - 当我的 3D 四边形距相机位置 10f 时,它们上出现白色边框