나는 JME3 및 Nifty GUI를 사용하여 게임을하고 있습니다. 외부 변수에 Nifty
멤버 변수가 있습니다. 그리고 내부 클래스는 액세스 수정 자에 관계없이 해당 변수에 액세스 할 수 있어야합니다. 생성자에서 새로운 Nifty
개체를 할당합니다. 그러나 내부 클래스에서 해당 변수에 액세스 할 때 문제가 발생합니다. 내부 클래스가 Nifty
멤버 변수가 null이라고 생각하고 이유를 파악할 수 없기 때문에 조금 디버깅을 한 결과 알게되었습니다. 외부 클래스에서 null이 아닙니다. 이것은 JME3 게임이기 때문에 내부 클래스에 AppState
인터페이스를 구현하려고했지만 여전히 Nifty
멤버 변수가 null로 표시됩니다.외부 클래스 멤버 변수 Null에서 내부 클래스
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
이 null 인 라인에 있습니다. 모든 도움을 주시면 감사하겠습니다.
Sweet 내가 기회를 얻 자마자 확인해 보겠다. 또한 Nifty gui의 소스 코드를 찾고 생성자와 getNifty 메소드가 무엇인지 살펴 보겠습니다. –
불행히도 mNifty는 여전히 내부 클래스 내부에서 null입니다. –
또한 외부 클래스에'showDialog()'메소드를 넣으려고했지만 여전히 작동하지 않습니다. –