2012-10-22 49 views
0

我正在使用JME3和Nifty GUI進行遊戲。我有一個外部類,它有一個Nifty成員變量。內部類應該能夠訪問該變量,而不管訪問修飾符如何。在構造函數中,我爲它分配了一個新的Nifty對象。但是,當我在內部類中訪問該變量時,我遇到了問題。我做了一些調試,發現這是因爲內部類認爲Nifty成員變量爲空,我不知道爲什麼。它在外部類中不是null。由於這是一個JME3遊戲,我試圖讓內部類實現AppState接口,但它仍然顯示Nifty成員變量爲空。下面是代碼:外部成員變量爲空內部類

public class MenuScreen extends SimpleApplication { 



/** Used to configure Nifty GUI. */ 
private Nifty mNifty; 

private NiftyJmeDisplay mNiftyDisplay; 


private Element popup; 

//******************* 
// Overridden medhods 
//******************* 

/** This method is used to initialize everything needed to display the game screen. */ 
@Override 
public void simpleInitApp() { 
    guiNode.detachAllChildren(); 

    initNifty(); 

    flyCam.setDragToRotate(true); 
} 

/** 
* The game's main update loop. 
* 
* @param tpf Time Per Fram, the time it takes each loop to run. 
*/ 
@Override 
public void simpleUpdate(float tpf) { 
    // not used 
} 

@Override 
public void simpleRender(RenderManager rm) { 
    // not used 
} 

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

/** 
* Helper method to initialize and configure Nifty GUI. 
*/ 
private void initNifty() {   
    mNiftyDisplay = new NiftyJmeDisplay(assetManager, inputManager, audioRenderer, guiViewPort); 
    mNifty = mNiftyDisplay.getNifty(); 

    guiViewPort.addProcessor(mNiftyDisplay); 

    // If this is being run on a desktop then load the desktop main menu. 
    if (Strings.OS_NAME.contains("windows") || Strings.OS_NAME.contains("mac") || Strings.OS_NAME.contains("linux")) { 
     mNifty.fromXml("Interface/XML/DesktopMenuScreenGui.xml", "start", new MenuScreen().new MenuScreenGui()); 
    } 
    // If its an Android device load the mobile main menu. 
    else if (Strings.OS_NAME.contains("android")) { 
     mNifty.fromXml("Interface/XML/MobileMenuScreenGui.xml", "mobile", new MenuScreen().new MenuScreenGui()); 
    } 
} 

//************** 
// Inner Classes 
//************** 

/** 
* © Jason Crosby 2012 <p> 
* 
* This class handles all the GUI interactions like button clicks. 
* 
* @author Jason Crosby 
*/ 
public class MenuScreenGui implements ScreenController, EventTopicSubscriber<MenuItemActivatedEvent>, 
             AppState { 

    @Override 
    public void initialize(AppStateManager stateManager, Application app) { 

    } 
@Override 
    public void cleanup() { 

    } 

    @Override 
    public boolean isEnabled() { 
     return false; 
    } 

    @Override 
    public boolean isInitialized() { 
     return false; 
    } 

    @Override 
    public void postRender() { 

    } 

    @Override 
    public void setEnabled(boolean active) { 

    } 

    @Override 
    public void stateAttached(AppStateManager stateManager) { 

    } 

    @Override 
    public void stateDetached(AppStateManager stateManager) { 

    } 

    @Override 
    public void render(RenderManager rm) { 

    } 

    @Override 
    public void update(float tpf) { 

    } 
    @Override 
    public void bind(Nifty nifty, Screen screen) { 
     // not used 
    } 

    @Override 
    public void onEndScreen() { 
     // not used 
    } 

    @Override 
    public void onStartScreen() { 
     // not used 
    } 

    @Override 
    public void onEvent(String string, MenuItemActivatedEvent t) { 

    } 

    //************** 
    // Class methods 
    //************** 

    /** 
    * Called when the play button is clicked. 
    */ 
    public void playButton() { 

    } 

    /** 
    * Called when the high scores button is clicked. 
    */ 
    public void highScoresButton() { 

    } 

    /** 
    * Called when the settings button is clicked. 
    */ 
    public void settingsButton() { 

    } 
    public void quitButton() { 
     showDialog(); 
    } 

    /** 
    * Called when the rate button is clicked. Only Available on mobile. 
    */ 
    public void rateButton() { 

    } 

    /** 
    * Called when the feedback button is clicked. Only on mobile devices. 
    */ 
    public void feedbackButton() { 

    } 

    /** 
    * Called when the help button is clicked. 
    */ 
    public void helpButton() { 

    } 

    /** 
    * Called when the dialog needs to be shown. 
    */ 
    public void showDialog() { 
     System.out.println("WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); 
     popup = new Nifty().createPopup("popup"); 
     System.out.println("ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"); 
     //Menu myMenu = popup.findNiftyControl("#menu", Menu.class); 
     //myMenu.setWidth(new SizeValue("100px")); // must be set 
     //myMenu.addMenuItem("Click me!", new menuItem("menuItemid", "blah blah")); // menuItem is a custom class 
     //mNifty.subscribe(mNifty.getCurrentScreen(), myMenu.getId(), MenuItemActivatedEvent.class, this); 
     mNifty.showPopup(mNifty.getCurrentScreen(), popup.getId(), null); 
    } 

    public void clsoseDialog() { 

    } 

    /** 
    * Used to return a String to the Nifty xml file. 
    * 
    * @param name The name key associated with the String. 
    * @return The String associated with the key. 
    */ 
    public String getString(String name) { 
     if (name.equals("play")) { 
      return Strings.PLAY_BUTTON; 
     } 
     else if (name.equals("high_score")) { 
      return Strings.HIGH_SCORES_BUTTON; 
     } 
     else if (name.equals("settings")) { 
      return Strings.SETTINGS_BUTTON; 
     } 
     else if (name.equals("quit")) { 
      return Strings.QUIT_BUTTON; 
     } 
     else if (name.equals("rate")) { 
      return Strings.RATE_BUTTON; 
     } 
     else if (name.equals("feedback")) { 
      return Strings.FEEDBACK_BUTTON; 
     } 
     else if (name.equals("rules")) { 
      return Strings.RULES_BUTTON; 
     } 
     return null; 
    } 
} 
} 

會發生什麼事是我點擊退出按鈕,調用quitButton()方法。這工作正常。這又會調用showDialog(),這是問題所在。在showDialog()方法是這條線popup = new Nifty().createPopup("popup");,它是在那條線,其中mNifty不應該是空的。任何援助表示讚賞。

回答

1

popup = new Nifty().createPopup("popup"); 

不使用mNifty。它會創建一個新實例Nifty,然後在此新實例上調用creatPopup()。由於較早通過調用什麼看起來像一個工廠方法

mNifty = mNiftyDisplay.getNifty(); 

它很可能獲得通過Niftynew不返回完全初始化實例初始化mNifty。由於您尚未發佈Nifty的代碼,因此尚不清楚發生了什麼。

我會仔細檢查以確保通過new創建Nifty將返回一個完全初始化的實例,並且您確實需要一個新的實例。

+0

甜蜜我會盡快檢查一下我有機會。我還會嘗試找到Nifty gui的源代碼,並查看構造函數與getNifty方法中的內容。 –

+0

我試過了,不幸的是,mNifty在內部類中仍爲null。 –

+0

我也嘗試在外部類中放置'showDialog()'方法,但它仍然無法工作。 –

相關問題