2016-08-15 18 views
1

私は3Dゲームエンジンを作っていますが、私は自分のやり方でイベントを発生させ、それぞれがGuiComponentに渡して、どちらかがtrue(処理される)か、すべての場合、イベントを廃棄します。イベントが複数回発生しました - LWJGL

問題は、複数のイベントが発生していることです。私はeventHandlerクラスの複数のインスタンスを作成していないことを確認しました。私はおそらくLWJGLMouseクラスのクラスが複数回発火しますか?そうでない場合は、現在の設定で何がうまくいきますか?おかげ

のEventHandler:

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

EDIT: 私は発射事象を検出するよどこさて、さらに検索すると、私は次のことを試してみました:

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で昨日同様の問題を抱えていました。あなたのGUI要素は互いに重なっていますか? – Sneh

+0

@ Snneはい、しかし、そのイベントは、その境界にある場合にのみ渡され/処理され、コンポーネントに別のコンポーネントが含まれている場合にのみチェックされます。問題は、1つのボタンがクリックイベントを6回受け取ることです。 –

+0

これは大変です。申し訳ありませんが、私はあなたを助けません:( – Sneh

答えて

0

これで問題を解決したこのスレッドhereを検索したところ、私はこのスレッドを探しました。なぜ、私はMouseクラスのドキュメントを見ていますか、これはうまくいくようですが、イベントは一度だけ発生し、リリースされたイベントは素晴らしいものです。これは将来他の人に役立つことを願っています!特にこの問題については、インターネット上のどこにも何もありませんでした。

関連する問題