2015-09-12 28 views
1

工作,我試圖在JME3在這些可愛的GUI圖像按鈕,但我的相互作用事件不工作。我在android中運行我的應用程序。按鈕似乎在繪製,但事件不起作用。俏皮GUI「onClickRepeat」不「controlDefinition」在JME3

這裏是我的控制:

<?xml version="1.0" encoding="UTF-8"?> 
<nifty-controls xmlns="http://nifty-gui.sourceforge.net/nifty-1.3.xsd" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://nifty-gui.sourceforge.net/nifty-1.3.xsd http://nifty-gui.sourceforge.net/nifty-1.3.xsd"> 
<controlDefinition name="ddButton" 
        controller="com.myapp.gui.ButtonController"> 
    <panel id="bPanel" childLayout="overlay" focusable="true" 
      visibleToMouse="true" width="$width" heigth="$height"> 
     <interact onClickRepeat="buttonDown()" onRelease="buttonUp()" /> 
     <image id="img-1" name="image-1" filename="Interface/res/button.png" 
       imageMode="resize:0,255,0,0,0,255,0,101,0,255,0,0" visibleToMouse="false" 
       width="100%" heigth="100%"/> 
     <image id="img-2" name="image-2" filename="Interface/res/button-pressed.png" 
       imageMode="resize:0,255,0,0,0,255,0,101,0,255,0,0" visibleToMouse="false" 
       width="100%" heigth="100%"/> 
     <text id="test" name="text" font="Interface/Fonts/MinionPro.fnt" 
       color="#000f" text="$text" align="center" valign="center" 
       width="80%" heigth="80%" visibleToMouse="false"/> 
    </panel> 
</controlDefinition> 
</nifty-controls> 

這裏是我的控制器:

package com.myapp.gui; 

import de.lessvoid.nifty.Nifty; 
import de.lessvoid.nifty.controls.Controller; 
import de.lessvoid.nifty.controls.FocusHandler; 
import de.lessvoid.nifty.elements.Element; 
import de.lessvoid.nifty.elements.render.ImageRenderer; 
import de.lessvoid.nifty.input.NiftyInputEvent; 
import de.lessvoid.nifty.render.NiftyImage; 
import de.lessvoid.nifty.screen.Screen; 
import de.lessvoid.xml.xpp3.Attributes; 
import java.util.Properties; 

/** 
* 
* @author Paul 
*/ 
public class ButtonController implements Controller { 

    private Element img1; 
    private Element img2; 

    @Override 
    public void bind(
      final Nifty nifty, 
      final Screen screen, 
      final Element element, 
      final Properties parameter, 
      final Attributes controlDefinitionAttributes) { 
     img1 = element.getElements().get(0); 
     img2 = element.getElements().get(1); 
    } 

    @Override 
    public void init(Properties prprts, Attributes atrbts) { 
    } 

    @Override 
    public void onStartScreen() { 
     img1.show(); 
     img2.hide(); 
    } 

    @Override 
    public void onFocus(final boolean getFocus) { 
    } 

    @Override 
    public boolean inputEvent(NiftyInputEvent inputEvent) { 
     return false; 
    } 

    public void buttonDown() { 
     img1.hide(); 
     img2.show(); 
    } 

    public void buttonUp() { 
     img1.show(); 
     img2.hide(); 
    } 
} 

這裏是我的屏幕:

<?xml version="1.0" encoding="UTF-8"?> 
<nifty xmlns="http://nifty-gui.sourceforge.net/nifty-1.3.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://nifty-gui.sourceforge.net/nifty-1.3.xsd http://nifty-gui.sourceforge.net/nifty-1.3.xsd"> 
    <useStyles filename="nifty-default-styles.xml" /> 
    <useControls filename="Interface/custom-controls.xml" /> 

    <!-- +++++++++++++++++++++++++++++++++++++++ --> 
    <!-- start screen --> 
    <!-- +++++++++++++++++++++++++++++++++++++++ --> 
    <screen id="start" controller="com.myapp.Main"> 
     <layer id="back" childLayout="center"> 
      <panel id="panel" height="100%" width="100%" align="center" valign="center" 
        childLayout="horizontal" visibleToMouse="true"> 
      <image filename="Interface/res/DD_Main.png"  imageMode="resize:0,1900,0,0,0,1900,0,1080,0,1900,0,0" height="100%"  width="100%"></image> 
      </panel> 
     </layer> 
     <layer id="layer" childLayout="center"> 
      <panel id="panel" height="100%" width="100%" align="center" valign="center" 
        childLayout="horizontal" visibleToMouse="true"> 
       <panel height="100%" width="30%" childLayout="vertical"> 
        <panel height="39%" width="100%" childLayout="center"></panel> 
        <panel height="10%" width="100%" childLayout="center"> 
         <control id="ddButton1" name="ddButton" text="Test" width="70%" visibleToMouse="true"/> 
        </panel> 
        <panel height="1%" width="100%" childLayout="center"> </panel> 
        <panel height="10%" width="100%" childLayout="center"> 
         <interact onClick="quit()"/> 
         <effect> 
          <onStartScreen name="move" mode="in" direction="top" length="300" startDelay="0" inherit="true"/> 
          <onEndScreen name="move" mode="out" direction="bottom" length="300" startDelay="0" inherit="true"/> 
          <onHover name="pulsate" scaleFactor="0.008" startColor="#f600" endColor="#ffff" post="true"/> 
         </effect> 
         <text id="text" font="Interface/Fonts/SegoeScript.fnt" color="#000f" text="Hello World!" align="center" valign="center" /> 
        </panel> 
        <panel height="40%" width="100%" childLayout="center"></panel> 
       </panel>  
       <panel height="100%" width="70%" childLayout="center"> </panel>  
      </panel> 
     </layer> 
    </screen> 
</nifty> 

而且我的應用程序:

package com.myapp; 

import com.jme3.app.SimpleApplication; 
import com.jme3.material.Material; 
import com.jme3.math.ColorRGBA; 
import com.jme3.niftygui.NiftyJmeDisplay; 
import com.jme3.renderer.RenderManager; 
import com.jme3.scene.Geometry; 
import com.jme3.scene.shape.Box; 

import de.lessvoid.nifty.Nifty; 
import de.lessvoid.nifty.screen.Screen; 
import de.lessvoid.nifty.screen.ScreenController; 

/** 
* test 
* 
* @author Serge 
*/ 
public class Main extends SimpleApplication implements ScreenController { 

    private Nifty nifty; 

    public static void main(String[] args) { 
     Main app = new Main(); 
     app.start(); 
    } 

    @Override 
    public void simpleInitApp() { 

     Box b = new Box(1, 1, 1); 
     Geometry geom = new Geometry("Box", b); 

     Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 
     mat.setColor("Color", ColorRGBA.Blue); 
     geom.setMaterial(mat); 

     rootNode.attachChild(geom); 

     NiftyJmeDisplay niftyDisplay = new NiftyJmeDisplay(assetManager, 
      inputManager, 
      audioRenderer, 
      guiViewPort); 
     nifty = niftyDisplay.getNifty(); 

     nifty.setDebugOptionPanelColors(false); 

     nifty.fromXml("Interface/screens.xml", "start", this); 

     // attach the nifty display to the gui view port as a processor 
     guiViewPort.addProcessor(niftyDisplay); 

     // disable the fly cam 
//  flyCam.setEnabled(false); 
//  flyCam.setDragToRotate(true); 
     inputManager.setCursorVisible(true); 

    } 

    @Override 
    public void simpleUpdate(float tpf) { 
     //TODO: add update code 
    } 

    @Override 
    public void simpleRender(RenderManager rm) { 
     //TODO: add render code 
    } 

    public void bind(Nifty nifty, Screen screen) { 
     System.out.println("bind(" + screen.getScreenId() + ")"); 
    } 

    public void onStartScreen() { 
     System.out.println("onStartScreen"); 
    } 

    public void onEndScreen() { 
     System.out.println("onEndScreen"); 
    } 

    public void buttonDown() { 
     System.out.println("buttonDown"); 
    } 

} 

有很少的例子可以使用Nifty GUI控件,請幫助我。

編輯

到目前爲止,我想通了,如果我這樣做

flyCam.setEnabled(false); 
flyCam.setDragToRotate(false); 

我收到我的控制器中的事件,但仍無法在應用

+0

是否onClick工作? – reden

+0

不,onClick不工作 – serge

回答

0

有點生疏得到的onClick在漂亮的東西,所以這可能不是答案,但也許它有幫助。若見交互標籤僅在

<control id="ddButton1" name="ddButton" text="Test" width="70%" visibleToMouse="true"> 
    <interact ...> 
</control> 

望着漂亮,button.xml它似乎是使用inputMapping標籤的情況下工作。所以也許這並不是很直接的做你的自定義按鈕。

否則,你可以嘗試與事件訂閱模式: @NiftyEventSubscriber(id="ddButton1") onButtonDown(final String topic,final ButtonClickedEvent event){控制器

我已經找到了漂亮的GUI維基安靜足智多謀,當談到控制: https://github.com/void256/nifty-gui/wiki/Controls 另外,在看源代碼示例已經給出了很多。

祝你好運

+0

我試過這種方法,但它也沒有工作... :( – serge

+0

我會看看鏈接雖然 – serge