2016-08-15 129 views
1

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

问题是,事件发射不止一次。我确定我没有创建eventHandler类的多个实例。我虽然也许Mouse类在LWJGL多次火灾?如果不是,目前的设置是什么?由于

事件处理程序:

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); 
    } 
} 

GuiButton:

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; 
    } 
} 

GuiPanel:

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(); 
     } 
    } 

GuiComponent:

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,所以这似乎是问题。有没有办法来解决这个问题?

+0

我不是LWJGL的专家,但我昨天有类似的问题与Libgdx。贵族元素是否相互重叠? – Sneh

+0

@Sneh是的,但事件仅在其边界内传递/处理,并且仅在组件包含其他组件时才检查。问题是,一个按钮接收点击事件6次 –

+0

这很奇怪,对不起,我不能帮你然后:( – Sneh

回答

0

好的,所以经过搜索后,我发现了这个线程here,它解决了这个问题。我不完全确定为什么,我会看看Mouse课程的文档,但这似乎起作用,只会触发一次活动,并且它给了我一个发布的活动,这非常棒。希望这有助于未来的其他人!这个问题在互联网上的任何地方都没有。